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 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étrica | O que mede | Valor bom | Afeta o ranqueamento |
|---|---|---|---|
| TTFB (tempo até o primeiro byte) | Tempo até o primeiro byte do HTML vindo do servidor | < 800 ms | Indiretamente (via LCP) |
| FCP (First Contentful Paint) | Primeiro pixel de conteúdo na tela | < 1,8 s | Lighthouse, não é fator do CrUX |
| LCP (Largest Contentful Paint) | Conteúdo principal visível para o usuário | < 2,5 s | Sim (Core Web Vitals) |
| INP (Interaction to Next Paint) | Capacidade de resposta a interações do usuário | < 200 ms | Sim (Core Web Vitals, substituiu o FID) |
| CLS (Cumulative Layout Shift) | Estabilidade do layout — quanto os elementos saltam | < 0,1 | Sim (Core Web Vitals) |
| TBT (Total Blocking Time) | Tempo total de bloqueio da thread principal pelo JS | < 200 ms | Proxy de laboratório para o INP |
Saem em 3 s
Usuários de celular que abandonam uma página com carregamento acima de 3 segundos
Conversão por segundo
Cada segundo extra de latência reduz a conversão em 1–3%, em média
Percentil do CrUX
O Google avalia os Core Web Vitals pelo 75º percentil de usuários reais
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.
- 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.
- 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.
- 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.
- 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.
- Confira o Coverage (DevTools → Coverage): CSS e JS não usados são candidatos diretos à remoção ou ao carregamento adiado.
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.
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écnica | Economia | Prioridade |
|---|---|---|
| WebP em vez de JPEG/PNG | 25–35% | Alta |
| AVIF em vez de JPEG/PNG | 40–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 mobile | Alta |
| Carregamento lento (lazy loading) para imagens fora da tela | Economiza requisições no carregamento | Alta |
| fetchpriority="high" para a imagem do LCP | 0,5–1,5 s de LCP | Crí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
| Atributo | Comportamento | Quando usar |
|---|---|---|
| Sem atributo | Bloqueia o parsing do HTML e executa na hora | Apenas código inline crítico |
| async | Carrega em paralelo e executa assim que pronto (pode interromper o parsing) | Scripts independentes (analytics) |
| defer | Carrega em paralelo e executa depois que o HTML é lido | A maioria dos scripts da página |
| type="module" | Adiado por padrão e com suporte a ESM | Scripts 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.
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 recurso | Cache-Control | Estratégia de invalidação |
|---|---|---|
| JS/CSS com hash (bundle.abc123.js) | max-age=31536000, immutable | O hash muda quando o arquivo muda |
| Imagens | max-age=2592000 (30 dias) | URL com versão ou content hash |
| Páginas HTML | no-cache ou max-age=0, must-revalidate | Sempre revalidadas com o servidor |
| Fontes | max-age=31536000, immutable | Hash na URL ou versionamento |
| Respostas de API | Cache-Control: private, max-age=60 | Depende 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.
Perguntas frequentes
O que pesa mais para SEO: o Lighthouse Score ou os Core Web Vitals?
Com que rapidez as melhorias de velocidade da página afetam o ranqueamento?
E se o Lighthouse estiver alto, mas o site parecer lento?
Vale a pena usar AMP para ganhar velocidade?
A velocidade da página afeta mais o ranqueamento no mobile do que no desktop?
Check it with SpiderHead
Free and local: run the audit on your own machine.



