Velocidade da página: otimização completa do carregamento do site

Como separar problemas de resposta do servidor, carregamento, renderização e interação, e depois validar as melhorias com dados de campo e de laboratório.

A velocidade da página é um dos investimentos que mais impactam SEO e conversão ao mesmo tempo. A Amazon calculou que cada 100 ms de latência extra custa 1% das vendas. O Google usa a velocidade como fator de ranqueamento no desktop desde 2010 e no mobile desde 2018. Em 2021, ele introduziu os Core Web Vitals como sinal direto de Page Experience.

O waterfall de carregamento: os recursos são solicitados um após o outro, e cada atraso empurra o LCP mais para a direita.
53% dos usuários de celular abandonam uma página que demora mais de 3 segundos para carregar. No e-commerce, isso significa conversões perdidas antes de um único produto aparecer.

O que é a velocidade da página e como ela é medida

A velocidade da página não é um número só. É um conjunto de métricas, e cada uma mede um aspecto diferente da experiência de carregamento. O Google combina no PageSpeed Insights os dados de laboratório (Lighthouse) e os dados de campo de usuários reais (Chrome User Experience Report). A nota final, de 0 a 100, é uma soma ponderada de várias métricas. Por isso, não a use como único alvo de otimização.

Para SEO, o que importa são os dados de campo (CrUX): o Google usa o 75º percentil de usuários reais do Chrome para avaliar os Core Web Vitals. O Lighthouse ajuda a diagnosticar problemas, mas não entra diretamente no algoritmo de ranqueamento.

Principais métricas de velocidade

Cada métrica trata de um aspecto específico da experiência do usuário. Entender a diferença entre elas é a base de um diagnóstico correto.

MétricaO que medeValor bomAfeta o ranqueamento
TTFB (tempo até o primeiro byte)Tempo até o primeiro byte do HTML vindo do servidor< 800 msIndiretamente (via LCP)
FCP (First Contentful Paint)Primeiro pixel de conteúdo na tela< 1,8 sLighthouse, não é fator do CrUX
LCP (Largest Contentful Paint)Conteúdo principal visível para o usuário< 2,5 sSim (Core Web Vitals)
INP (Interaction to Next Paint)Capacidade de resposta a interações do usuário< 200 msSim (Core Web Vitals, substituiu o FID)
CLS (Cumulative Layout Shift)Estabilidade do layout — quanto os elementos saltam< 0,1Sim (Core Web Vitals)
TBT (Total Blocking Time)Tempo total de bloqueio da thread principal pelo JS< 200 msProxy de laboratório para o INP
O FID (First Input Delay) foi oficialmente substituído pelo INP (Interaction to Next Paint) em março de 2024. Se suas ferramentas ainda mostram o FID, atualize-as ou ignore essa métrica. O INP mede a latência de todas as interações, não só da primeira.
53%

Saem em 3 s

Usuários de celular que abandonam uma página com carregamento acima de 3 segundos

1–3%

Conversão por segundo

Cada segundo extra de latência reduz a conversão em 1–3%, em média

75º

Percentil do CrUX

O Google avalia os Core Web Vitals pelo 75º percentil de usuários reais

28 dias

Janela do CrUX

Janela móvel em que os dados são coletados para avaliar o site

Diagnóstico: por onde começar a otimização

Otimizar às cegas é tempo perdido. A sequência correta: medir primeiro, identificar o gargalo, corrigir e medir de novo.

  1. Abra o PageSpeed Insights e teste de 5–10 páginas-chave: página inicial, categorias, cards de produtos, landing pages. Olhe os dados de campo, e não apenas a nota do Lighthouse.
  2. No Google Search Console, acesse Core Web Vitals. Ele mostra quais URLs têm avaliação “Ruim” ou “Precisa de melhorias” para LCP, INP e CLS, com dados reais de usuários.
  3. Execute o WebPageTest para uma análise profunda: waterfall de carregamento, filmstrip, TTFB e impacto do CDN. Escolha a região de teste mais próxima do seu público principal.
  4. Use o Chrome DevTools → Performance e grave o carregamento de uma página. O flame chart mostra qual script ocupa a thread principal e bloqueia a renderização.
  5. Confira o Coverage (DevTools → Coverage): CSS e JS não usados são candidatos diretos à remoção ou ao carregamento adiado.
Use o modo anônimo e desative as extensões do navegador durante os testes: bloqueadores de anúncios e extensões alteram os resultados. Para resultados reproduzíveis, use o Lighthouse CLI ou o WebPageTest.

PageSpeed Insights

Ferramenta gratuita do Google. Mostra dados de laboratório (Lighthouse) e de campo (CrUX). Traz uma lista de recomendações específicas, com estimativa de economia de tempo. É o melhor ponto de partida para uma auditoria inicial.

WebPageTest

Waterfall detalhado, filmstrip, testes em vários locais e comparação entre versões. Mostra o impacto de CDN, DNS e handshake SSL. Indispensável para diagnosticar TTFB em profundidade.

Google Search Console

Dados reais do CrUX por grupos de URLs. Mostra a tendência das métricas ao longo do tempo — a melhor ferramenta para acompanhar as melhorias depois de publicar as otimizações.

Chrome DevTools

Abas Performance Profiler e Coverage — para encontrar o script ou CSS específico que bloqueia a renderização. O flame chart revela Long Tasks (> 50 ms) na thread principal.

Otimização do servidor e do TTFB

O TTFB (Time to First Byte) é a base de toda a velocidade. Se o servidor responde devagar, cada otimização seguinte trabalha contra um teto artificial. Meta: TTFB < 200 ms em ambientes com CDN e < 400 ms em servidores dinâmicos.

Hospedagem e infraestrutura

Escolha da hospedagem
A hospedagem compartilhada, com recursos divididos entre milhares de sites, limita o TTFB de forma física. Um VPS ou servidor dedicado com Nginx/Caddy e cache adequado entrega TTFB de 20–80 ms para conteúdo estático.
CDN (Content Delivery Network)
Cloudflare, BunnyCDN, Fastly — o nó de borda mais próximo responde no lugar do seu servidor de origem. Para conteúdo estático ou em cache, o TTFB cai para 10–50 ms. Para conteúdo dinâmico, depende da configuração do cache de borda.
HTTP/2 e HTTP/3 (QUIC)
O HTTP/2 elimina o bloqueio head-of-line e oferece multiplexação. O HTTP/3 sobre QUIC acelera ainda mais o estabelecimento da conexão (0-RTT) e resiste melhor à perda de pacotes em redes móveis.
Localização do servidor
A distância física entre o usuário e o servidor acrescenta cerca de 1 ms a cada 100 km (ida e volta). Para um público principalmente europeu, um servidor em Frankfurt ou Amsterdã é bem mais rápido do que o US-East.

Compressão e codificação

  • Ative o Brotli (br): ele economiza 15–25% em relação ao gzip, com velocidade de descompressão parecida. É suportado por todos os navegadores modernos.
  • Mantenha o gzip como alternativa para clientes antigos. Mínimo: nível de compressão 6.
  • Configure a compressão para HTML, CSS, JS, JSON, XML e SVG. Imagens e arquivos binários já são comprimidos, então aplicar gzip neles não adianta.
  • Use o cabeçalho Vary: Accept-Encoding para que o CDN guarde versões separadas para clientes diferentes.

Cache no servidor

Páginas dinâmicas (PHP, Node.js, Python) consultam o banco de dados a cada requisição. Um cache permite entregar o HTML pronto, sem recálculo.

  • Cache de página inteira: Nginx FastCGI Cache, Varnish, Redis — guardam o HTML pronto e o entregam sem tocar na aplicação.
  • Cache de objetos: Redis ou Memcached para guardar resultados de consultas ao banco, sessões e dados calculados.
  • Regras de invalidação: o cache precisa ser limpo quando o conteúdo muda (webhook do CMS ou expiração por TTL).
  • Stale-while-revalidate: entregue o cache antigo na hora e regenere em segundo plano — o usuário não espera a regeneração.
No Next.js, o ISR (Incremental Static Regeneration) é um mecanismo stale-while-revalidate embutido. A página é gerada uma vez e atualizada em segundo plano, conforme a configuração revalidate: N segundos. O TTFB fica como o de arquivos estáticos, e os dados continuam atualizados.

Otimização de recursos: imagens, fontes, CSS

Imagens

As imagens costumam ser a categoria mais pesada de uma página. Otimizá-las bem gera economia de 30–70% no tráfego e afeta diretamente o LCP.

TécnicaEconomiaPrioridade
WebP em vez de JPEG/PNG25–35%Alta
AVIF em vez de JPEG/PNG40–55%Alta (suporte de mais de 90% dos navegadores)
Compressão sem perdas (PNG → oxipng)5–20%Média
Dimensionamento correto (srcset + sizes)50–80% no mobileAlta
Carregamento lento (lazy loading) para imagens fora da telaEconomiza requisições no carregamentoAlta
fetchpriority="high" para a imagem do LCP0,5–1,5 s de LCPCrítica

Use o elemento <picture> para servir o formato certo: AVIF para os navegadores que suportam, WebP como alternativa e JPEG/PNG para navegadores antigos. O componente Image do Next.js faz isso automaticamente.

Fontes

  • Hospede as fontes você mesmo: sirva arquivos .woff2 do seu próprio domínio. Assim você elimina a consulta DNS, o handshake TCP e a dependência do CDN do Google Fonts.
  • Pré-carregue as fontes críticas: <link rel="preload" as="font" type="font/woff2" crossorigin> no <head> — o navegador começa a carregar antes de o CSS ser lido.
  • font-display: swap — o navegador mostra a fonte do sistema enquanto a personalizada carrega. Isso elimina o FOIT (texto invisível).
  • Subconjunto de fontes: carregue só os glifos necessários (alfabeto latino + cirílico). Ferramentas: glyphhanger ou fonttools.
  • Use fontes variáveis (variable fonts): um arquivo só, em vez de vários pesos (regular, negrito, itálico). Isso economiza 30–50% do tamanho total das fontes.

CSS

CSS crítico inline
Os estilos acima da dobra são inseridos diretamente no <head>, dentro de uma tag <style>. O navegador renderiza a primeira tela sem esperar um arquivo CSS externo. O restante do CSS carrega de forma assíncrona.
Minificação
Remoção de espaços e comentários, e encurtamento de propriedades. Cssnano ou LightningCSS. Economia típica: 10–30% do tamanho original.
Remoção de CSS não utilizado
PurgeCSS, UnCSS ou o mecanismo embutido do framework (purge do Tailwind). É especialmente importante ao usar Bootstrap ou Material UI, que trazem milhares de regras não utilizadas.
Evite @import no CSS
O @import em CSS cria requisições em sequência: o navegador carrega o arquivo, encontra o @import e só então começa a carregar o próximo. Use tags <link> para carregamento paralelo.

JavaScript: bloqueio de renderização e thread principal

O JavaScript é o principal inimigo da velocidade da página em sites modernos. Ele bloqueia a renderização, ocupa a thread principal e atrasa a interatividade. Meta: pouco JS no caminho crítico e o máximo possível de defer, async e import dinâmico.

Estratégias de carregamento

AtributoComportamentoQuando usar
Sem atributoBloqueia o parsing do HTML e executa na horaApenas código inline crítico
asyncCarrega em paralelo e executa assim que pronto (pode interromper o parsing)Scripts independentes (analytics)
deferCarrega em paralelo e executa depois que o HTML é lidoA maioria dos scripts da página
type="module"Adiado por padrão e com suporte a ESMScripts ESM modernos

Bundle e divisão de código

  • Code splitting: divida o JS em partes (chunks) e carregue só o necessário para a página atual. No Next.js, isso acontece automaticamente por página.
  • Import dinâmico: import('module') para componentes que não são necessários no carregamento inicial (janelas modais, abas, filtros).
  • Tree shaking: o bundle inclui apenas o código realmente usado. Webpack e Rollup fazem isso com pacotes ESM. Confira se há dependências CommonJS quebrando o tree shaking.
  • Análise do bundle: bundlephobia.com para checar o tamanho dos pacotes npm, e @next/bundle-analyzer para o Next.js, que mostra exatamente o que ocupa espaço.
  • Evite bibliotecas monolíticas grandes: moment.js (67 KB) → day.js (2 KB), lodash → utilitários individuais, jQuery → JS nativo.
Long Tasks (tarefas na thread principal com mais de 50 ms) são causa direta de um INP ruim. Verifique-as em DevTools → Performance. Vilões comuns: parsing de JSON grande, acesso síncrono ao localStorage e re-renderizações pesadas do React.

SPA e renderização no servidor

SPAs no cliente (React sem SSR, Angular, Vue com CSR) devolvem HTML vazio e geram o conteúdo no navegador. Isso leva a um LCP alto e a um Time to Interactive ruim.

SSR (Server-Side Rendering)
O HTML completo é gerado no servidor, e o navegador recebe o conteúdo pronto de imediato. LCP, FCP e Lighthouse Score melhoram muito. Exige hidratação no cliente, então leve em conta o TTI (Time to Interactive).
SSG (Static Site Generation)
O HTML é gerado no momento do build. Velocidade máxima de TTFB e LCP. Indicado para conteúdo que muda pouco: blog, documentação e landing pages.
PPR (Partial Prerendering)
Novidade do Next.js 15: uma casca estática da página com partes dinâmicas em streaming. A casca é servida na hora pelo CDN, enquanto os dados dinâmicos chegam conforme ficam prontos.

Cache: navegador e CDN

Um cache bem configurado é a otimização mais barata e a de maior impacto para visitantes recorrentes. Meta: todos os recursos estáticos em cache por 1 ano; o HTML com pouco ou nenhum cache.

Tipo de recursoCache-ControlEstratégia de invalidação
JS/CSS com hash (bundle.abc123.js)max-age=31536000, immutableO hash muda quando o arquivo muda
Imagensmax-age=2592000 (30 dias)URL com versão ou content hash
Páginas HTMLno-cache ou max-age=0, must-revalidateSempre revalidadas com o servidor
Fontesmax-age=31536000, immutableHash na URL ou versionamento
Respostas de APICache-Control: private, max-age=60Depende da frequência de mudança dos dados
  • Hash baseado no conteúdo (fingerprinting): Webpack, Vite e Next.js acrescentam automaticamente um hash do conteúdo ao nome do arquivo. Quando o código muda, o hash muda e o cache antigo não é usado.
  • ETag e Last-Modified: se o cliente já tem o recurso, o servidor responde 304 Not Modified, sem corpo. Gasta menos tráfego, mas ainda há a ida e volta da rede.
  • Service Worker: um cache programável no navegador. Permite estratégias complexas (Cache-First, Network-First, Stale-While-Revalidate) para PWAs e uso offline.
  • Cache-Control no CDN: use o s-maxage para controlar o cache do CDN separadamente do max-age do navegador. O CDN guarda por mais tempo, e o navegador, por menos.

Scripts de terceiros: o vilão oculto

Scripts de terceiros (analytics, chats, pixels, testes A/B, widgets) costumam ser a principal causa de TBT e INP ruins. Uma página comercial média carrega de 15 a 30 scripts de terceiros.

Auditoria de scripts de terceiros

No WebPageTest, a aba “Third-party Summary” mostra qual script bloqueia a thread principal e por quantos milissegundos. Os principais culpados: Intercom, Hotjar e versões antigas do Google Analytics (gtag sem async).

Carregamento adiado

Carregue scripts não críticos com atraso: setTimeout(loadScript, 3000) após o evento load. Assim o usuário já consegue interagir com a página antes de o analytics carregar.

DNS prefetch e preconnect

<link rel="preconnect"> para os domínios com os quais você certamente vai se conectar. <link rel="dns-prefetch"> para os prováveis. Economia: 100–300 ms de consulta DNS e handshake TCP para cada domínio de terceiros.

Substitua ou remova

A melhor otimização de scripts de terceiros é removê-los. Para que um chat pago em todas as páginas? Para que cinco pixels de redes sociais? Auditar os scripts realmente usados costuma revelar de 30% a 50% de scripts desnecessários.

O Google Tag Manager é prático, mas perigoso. Uma única tag do GTM pode puxar 20 scripts adicionados pelo marketing sem revisão do desenvolvedor. Audite o contêiner do GTM com regularidade e remova as tags obsoletas.

Perguntas frequentes

O que pesa mais para SEO: o Lighthouse Score ou os Core Web Vitals?
Para SEO, pesam mais os Core Web Vitals (dados de campo do CrUX), porque são esses dados que o Google usa no algoritmo de ranqueamento. O Lighthouse Score é uma boa ferramenta de diagnóstico, mas não é um sinal direto de ranqueamento. Um site com Lighthouse 60 e bom CrUX vai ranquear melhor do que um com Lighthouse 95 e dados de campo ruins.
Com que rapidez as melhorias de velocidade da página afetam o ranqueamento?
O CrUX é atualizado em uma janela móvel de 28 dias. Se você melhorar as métricas hoje, o sinal leva cerca de 4 semanas para se atualizar por completo no Google. Não espere saltos repentinos de posição: é uma melhoria gradual. Acompanhe o progresso no Search Console → Core Web Vitals.
E se o Lighthouse estiver alto, mas o site parecer lento?
O Lighthouse é uma ferramenta de laboratório: ele testa com configurações fixas (geralmente Moto G Power, 4G). Os usuários reais estão em celulares lentos, em 3G instável e em regiões remotas. Confira os dados de campo no PSI e no Search Console. Olhe também o INP: a sensação subjetiva de lentidão costuma não ser sobre o carregamento, e sim sobre a resposta aos cliques.
Vale a pena usar AMP para ganhar velocidade?
Em 2024–2026, o AMP perdeu a maior parte das vantagens: o Google retirou a prioridade das páginas AMP no carrossel Top Stories e passou a usar os Core Web Vitals como critério universal. Uma página sem AMP, bem otimizada e com LCP bom ranqueia em pé de igualdade com uma página AMP. Recomendação: não invista em AMP, invista em CWV.
A velocidade da página afeta mais o ranqueamento no mobile do que no desktop?
Sim. O Google usa a indexação mobile-first desde 2019: ele indexa e avalia primeiro a versão mobile do site. Os dados CrUX de usuários mobile são separados dos de desktop, e os dados mobile costumam ser piores. Otimize primeiro a velocidade no mobile.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it