Uma página pode transferir poucos arquivos e ainda começar tarde. O HTML pede um CSS. O CSS pede uma fonte e uma imagem de fundo. Um script baixa outro módulo. Cada etapa espera a anterior ser descoberta antes de iniciar.

Essa sequência é uma cadeia de requisições. O problema não é ter dependências. O problema aparece quando um recurso importante para mostrar ou usar a página fica no fim de uma cadeia longa.

Este guia mostra como localizar essas cadeias na URL publicada, decidir quais afetam a experiência e encurtá-las sem carregar tudo com prioridade alta.

Leia a waterfall como uma relação de causa

Abra a URL no Chrome DevTools, marque Disable cache e recarregue com o painel Network gravando. Comece pelo documento principal e siga as requisições que ele iniciou.

Uma cadeia comum pode ter esta forma:

documento HTML
└── app.css
├── fonte.woff2
└── hero.avif

Outra começa em JavaScript:

documento HTML
└── app.js
└── componente.js
└── dados.json
└── imagem.webp

O painel Network mostra a coluna Initiator. Ao selecionar uma requisição, a aba Initiator exibe a pilha ou a árvore que levou até ela. A documentação do Chrome DevTools descreve essa árvore como o mapa da cadeia de iniciadores.

Passe o cursor sobre uma requisição com a tecla Shift pressionada para destacar quem a iniciou e o que depende dela. A referência do painel Network explica as cores usadas nessa relação.

Separe profundidade de impacto

Nem toda cadeia longa merece uma alteração. Um módulo de analytics carregado depois da interação pode ter cinco etapas sem atrasar o conteúdo principal. Uma imagem hero descoberta depois de um único CSS pode estar no caminho do LCP.

Para cada cadeia, registre:

Campo Pergunta
recurso final O que a pessoa espera ver ou usar?
iniciador Qual arquivo tornou o recurso descobrível?
profundidade Quantas descobertas sequenciais ocorreram?
duração Quanto tempo passou do HTML ao fim da cadeia?
bloqueio Alguma etapa bloqueia renderização?
prioridade O navegador tratou o recurso como crítico?
rota A cadeia existe em todas as páginas ou só nesta?

O insight Network dependency tree do painel Performance destaca dependências longas e o custo de cada ramo. A referência atual do Chrome mantém essa análise entre os insights de performance.

Priorize cadeias que terminam em CSS bloqueante, fonte usada na primeira dobra, imagem de LCP, JavaScript necessário para a primeira interação ou dados sem os quais a página inicial fica vazia.

Encontre o atraso de descoberta

Clique no recurso final e compare quatro momentos:

  1. quando o documento começou;
  2. quando o iniciador terminou de chegar ou executar;
  3. quando o navegador criou a requisição dependente;
  4. quando a resposta ficou disponível.

Se existe um intervalo grande antes do request começar, o gargalo é descoberta ou execução do iniciador. Comprimir o arquivo final não elimina essa espera.

Se o request começa cedo e demora na rede, investigue tamanho, cache, conexão e resposta. O guia de compressão Brotli e gzip cobre essa parte. O artigo sobre Cache-Control ajuda a conferir reutilização e revalidação.

Torne o recurso crítico visível no HTML

O parser encontra cedo o que aparece no HTML inicial. Uma imagem hero montada apenas por JavaScript precisa esperar o script baixar, analisar, executar e criar o elemento.

Prefira este caminho para o conteúdo principal:

<img
src="/assets/hero.avif"
width="1280"
height="720"
alt="Pessoa usando o produto"
fetchpriority="high"
/>

Evite esconder o candidato de LCP em:

  • um componente que só monta depois de DOMContentLoaded;
  • um atributo data-src trocado por script;
  • uma chamada de API que devolve conteúdo já conhecido no build;
  • um carrossel que precisa inicializar para revelar o primeiro slide;
  • CSS carregado por JavaScript.

O guia de LCP da imagem hero mostra como separar tempo até o primeiro byte, atraso de descoberta, download e atraso de renderização.

Remova saltos que não acrescentam informação

Cada redirect adiciona outra resposta antes da URL final. Isso pesa mais no documento, na folha de estilo, na fonte e em qualquer recurso no início da cadeia.

Procure por:

  • links internos que apontam para um slug antigo;
  • HTTP redirecionado para HTTPS dentro do próprio markup;
  • domínio sem www apontado pelo HTML para uma variante com www;
  • assets com uma URL intermediária de CDN;
  • imports que resolvem para outro arquivo apenas para reexportar o mesmo código.

Corrija a origem para apontar à URL final. Não remova redirects públicos necessários para preservar links antigos. O artigo sobre revisão de redirecionamentos ajuda a separar migração válida de salto interno desnecessário.

Evite CSS que descobre CSS

Uma folha carregada pelo HTML pode usar @import para descobrir outra folha. O navegador precisa receber e analisar a primeira antes de pedir a segunda.

@import url("./fonts.css");
@import url("./campaign.css");

Para estilos usados na primeira renderização, gere uma folha direta no build ou declare os arquivos necessários no HTML. Mantenha CSS específico de uma rota fora das outras páginas, mas não o esconda atrás de uma sequência de imports.

Depois confira se a mudança não aumentou o CSS enviado para todas as rotas. O guia de CSS bloqueante e sem uso trata essa troca.

Não use preload para encobrir toda dependência

preload torna uma URL conhecida antes do uso normal. Ele pode ajudar uma fonte crítica ou uma imagem de fundo descoberta tarde.

<link rel="preload" href="/assets/hero.avif" as="image" type="image/avif" />

O hint precisa corresponder ao request real. URL, tipo, destino, CORS e seleção responsiva incompatíveis podem causar um download extra.

Use preload quando você mediu um recurso crítico, confirmou a descoberta tardia e não consegue torná-lo visível no HTML consumidor. Não preloade cada ponta da árvore. Isso troca uma cadeia por uma disputa generalizada de rede.

O artigo sobre preload, preconnect e fetchpriority detalha o papel de cada mecanismo.

Quebre cadeias opcionais no ponto certo

Recursos fora da primeira tela não precisam começar junto com a página. Para esses casos, encurtar a cadeia inicial significa adiá-la inteira.

Um vídeo externo, por exemplo, pode exibir poster e botão no HTML. O iframe e seus scripts só entram depois do clique. O guia de vídeos e iframes mostra essa fachada.

Para chat, mapa e avaliações, carregue o recurso por intenção ou proximidade da seção. Preserve um fallback e informe o estado enquanto a integração responde.

Não transforme tudo em lazy loading. CSS, navegação, formulário principal e imagem de LCP precisam estar disponíveis cedo. A divisão depende da função do recurso.

Use Resource Timing com limites claros

O navegador expõe entradas de recursos pela Performance Timeline:

const resources = performance.getEntriesByType("resource");
for (const entry of resources) {
console.table({
url: entry.name,
initiator: entry.initiatorType,
start: Math.round(entry.startTime),
duration: Math.round(entry.duration),
transfer: entry.transferSize,
});
}

A especificação Resource Timing define initiatorType, tempos de rede e tamanhos transferidos. Ela não reconstrói sozinha toda a árvore mostrada pelo DevTools. Use esses dados para inventário e monitoramento, não como substituto da gravação.

Recursos de outra origem podem ocultar partes dos tempos e tamanhos quando a resposta não autoriza a leitura com Timing-Allow-Origin. Um zero nesses campos não prova que a etapa custou zero.

Compare o mesmo cenário antes e depois

Grave três execuções com cache vazio antes da mudança e três depois. Use o mesmo perfil de dispositivo, CPU e rede. Compare a mediana.

Registre:

rota e Version:
cadeia crítica:
profundidade antes e depois:
duração total antes e depois:
início do recurso final:
LCP ou interação relacionada:
efeito em outras requisições:

Confirme também cache quente, tela estreita, domínio próprio e uma navegação interna. Uma correção que só funciona no primeiro teste do localhost ainda não está pronta.

Republique sem mudar a identidade do Site

No Site no Ar, aplique a correção ao Site existente.

  1. identifique o Site e chame get_context;
  2. revise os arquivos servidos dentro de public/;
  3. altere HTML, CSS ou JavaScript pelas file tools;
  4. gere uma build limpa e confira todas as URLs;
  5. use deploy com uma mensagem curta;
  6. acompanhe deploy_status até sucesso ou falha;
  7. repita a gravação na URL pública.

A documentação de Publicação explica que somente o conteúdo em public/ chega ao endereço. Preserve o Site ID para manter URL, domínio e histórico de Versions.

Prompt para investigar a cadeia

Investigue as cadeias de requisições desta página sem publicar ainda.
URL e Version: [URL e commit]
Rota crítica: [rota]
Cenário: [dispositivo, rede e CPU]
1. Grave a waterfall com cache vazio três vezes.
2. Liste as cadeias que terminam em recursos da primeira dobra ou da primeira interação.
3. Registre iniciador, profundidade, duração, prioridade e bloqueio.
4. Separe atraso de descoberta, rede e execução.
5. Proponha a menor mudança para cada cadeia crítica.
6. Não preloade recursos opcionais nem altere redirects públicos válidos.
7. Rode build e compare a mediana antes de publicar.

O objetivo não é desenhar uma árvore rasa por estética. É fazer o navegador descobrir cedo o que a pessoa precisa cedo e deixar o restante fora dessa disputa.