1001Ferramentas
🔗Geradores

Gerador de link rel=preload

Monta a tag link rel=preload com as (script, style, font, image). Carrega recursos críticos cedo.


  

Link preload: o hint de performance que os navegadores sempre honram

A tag <link rel="preload"> é um resource hint que diz ao navegador para começar a baixar um asset crítico assim que o <head> é parseado, sem esperar o CSS ou o JavaScript que normalmente faria essa requisição. Diferente de prefetch (hint de baixa prioridade para a próxima navegação) ou de preconnect (que só abre handshake TCP/TLS), o preload baixa os bytes de fato e os guarda no cache de memória. Usado cirurgicamente nos assets certos, derruba centenas de milissegundos no LCP (Largest Contentful Paint); usado sem critério desperdiça banda e dispara warnings no console.

Sintaxe, atributos obrigatórios e a famosa pegadinha do "as"

O atributo as é obrigatório e informa ao navegador qual política CSP aplicar, qual cabeçalho Accept enviar e qual content-type esperar. Valores válidos: font, script, style, image, fetch, video, audio, document, track e worker. Para fontes, o atributo crossorigin também é obrigatório — fontes são sempre buscadas com CORS anônimo, e um preload sem crossorigin baixa o arquivo duas vezes (uma para o hint, outra para o uso real). Para imagens e formatos modernos, adicione type para que o navegador pule o preload quando o formato não for suportado.

<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/css/critical.css" as="style">
<link rel="preload" href="/js/app.js" as="script">
<link rel="preload" href="/img/hero.avif" as="image" type="image/avif" fetchpriority="high">
<link rel="modulepreload" href="/js/main.mjs">

Preload vs prefetch vs preconnect vs prerender

Esses quatro hints são confundidos com frequência, mas resolvem problemas diferentes. Preload quer dizer "vou usar isto na página atual, baixa agora"; o navegador trata como fetch de alta prioridade. Prefetch quer dizer "provavelmente vou usar isto na próxima navegação"; baixado com prioridade mínima em tempo ocioso. Preconnect quer dizer "sei que vou precisar dessa origem, faça DNS, TCP e TLS já"; não baixa nada, só abre a conexão. Prerender (e sua substituta, a Speculation Rules API) renderiza toda a próxima página em segundo plano. Use preload para hero image e fonte crítica; preconnect para origens terceiras como Google Fonts ou seu CDN; prefetch para a página seguinte mais provável; prerender (com cautela) em sites com navegação previsível.

Modulepreload para módulos ES e seus imports

O preload normal com as="script" não parseia o JavaScript, então qualquer cadeia de import dentro do arquivo ainda dispara uma cascata sequencial de downloads. A variante <link rel="modulepreload"> manda o navegador baixar o módulo E resolver seus imports estáticos em paralelo, exatamente o que se quer em ESM moderno sem bundler. Os navegadores ainda guardam o módulo parseado no module map, então a instrução import futura consome só ciclos.

<link rel="modulepreload" href="/js/router.mjs">
<link rel="modulepreload" href="/js/store.mjs">
<link rel="modulepreload" href="/js/components/Hero.mjs">

103 Early Hints, fetchpriority e Core Web Vitals

Duas adições recentes amplificam o que o preload pode fazer. O status HTTP 103 Early Hints permite ao servidor enviar cabeçalhos Link: ...; rel=preload antes da resposta final 200, dando ao navegador uma vantagem enquanto a página ainda está sendo montada. O atributo fetchpriority (Chrome 102+) sobrescreve a prioridade padrão: fetchpriority="high" na imagem LCP geralmente economiza 100 a 300 ms; fetchpriority="low" em imagens abaixo da dobra libera banda para o conteúdo above-the-fold. Use Lighthouse, WebPageTest ou o painel Performance do Chrome para confirmar que o preload está sendo honrado — às vezes o navegador o ignora porque o asset já foi descoberto pelo preload scanner.

Erros comuns e o warning "preloaded but not used"

  • Preloadar tudo — quanto mais você preloadar, menos crítico cada preload se torna. Reserve para os 2 a 4 recursos verdadeiramente bloqueadores.
  • Faltar crossorigin em fontes — a fonte baixa duas vezes, dobrando o atraso de LCP que você queria resolver.
  • Valor errado em as — o navegador ignora o preload em silêncio e você desperdiça uma requisição.
  • Preloadar bundles com hash cuja URL muda a cada build sem atualizar o HTML — todo deploy emite um preload stale.
  • Warning "preloaded but not used within a few seconds" — em geral, significa que o asset não é necessário nessa página, ou que seu consumidor real foi lazy-loaded e o preload disparou cedo demais.

Perguntas frequentes

Devo preloadar todo CSS e JS? Não. Só recursos que bloqueiam a renderização e que o navegador descobriria tarde. Preloadar tudo inverte causa e efeito — nada fica priorizado.

Quanto preload ajuda no LCP? Números realistas de estudos públicos: 100 a 300 ms em 4G rápido para uma única fonte crítica ou hero image, às vezes 500 ms+ em conexões lentas.

Preload funciona cross-origin? Sim, mas você precisa especificar crossorigin compatível com a configuração CORS do servidor de origem, senão o preload é descartado.

Que tamanho de asset se beneficia mais? Contra-intuitivamente, assets críticos pequenos se beneficiam mais porque terminam o download antes do parser descobri-los. Hero images de 50-200 KB e subsets de fontes de 20-40 KB são o sweet spot.

Por que o navegador está ignorando meu preload? Em geral por um destes motivos: as errado, falta de crossorigin, CSP bloqueando a origem, ou o preload scanner já encontrou o asset antes no HTML.

Ferramentas Relacionadas