Core Web Vitals: o que realmente é medido
A maior parte do esforço gasto com Core Web Vitals é desperdiçada porque otimiza o número errado. Quem persegue a nota do Lighthouse costuma melhorar o relatório sem melhorar nada para quem usa a página. Este texto separa as duas coisas.
O que são, em uma frase cada
Core Web Vitals são três métricas que o Google escolheu como proxy da experiência de carregamento e uso de uma página. Elas não medem se a sua página é bonita ou útil. Medem três frustrações específicas e mensuráveis:
- LCP (Largest Contentful Paint): quanto tempo até o maior elemento visível da tela inicial aparecer. Responde "quando eu vi alguma coisa que importa?".
- INP (Interaction to Next Paint): quanto tempo a página leva para responder visualmente depois que você toca em algo. Responde "quando eu toco, ela reage?".
- CLS (Cumulative Layout Shift): quanto o conteúdo pula de lugar sozinho durante o uso. Responde "o botão ainda vai estar onde eu estou mirando?".
As três foram escolhidas porque descrevem coisas que o usuário sente e que dependem de decisões de quem construiu a página. Nenhuma delas mede velocidade de conexão do visitante, e é por isso que dá para melhorá-las de verdade.
Os limiares oficiais, e a regra do percentil 75
| Métrica | Bom | Precisa melhorar | Ruim |
|---|---|---|---|
| LCP | até 2,5 s | de 2,5 s a 4,0 s | acima de 4,0 s |
| INP | até 200 ms | de 200 ms a 500 ms | acima de 500 ms |
| CLS | até 0,1 | de 0,1 a 0,25 | acima de 0,25 |
Falta a parte que quase nunca é citada junto e que muda tudo: esses limiares não são aplicados sobre a média. São aplicados sobre o percentil 75 das visitas reais, em uma janela móvel de 28 dias, separando celular de computador.
Percentil 75 significa que 75% dos carregamentos precisam estar abaixo do limiar. Traduzindo para consequência prática: a sua média pode ser ótima e a sua página ser classificada como ruim, porque um quarto dos seus usuários tem aparelho mais fraco ou rede pior. Otimizar para a média é otimizar para quem já estava bem servido.
A janela de 28 dias tem outro efeito colateral que assusta quem não sabe: depois de um deploy que corrige o problema, o relatório não muda no dia seguinte. Ele muda gradualmente, ao longo de semanas, conforme visitas antigas saem da janela. Isso não é bug e não adianta redeployar.
Campo e laboratório: a confusão que faz gente consertar o nada
Esta é a seção mais importante do artigo. Quando você abre o PageSpeed Insights, recebe dois relatórios na mesma tela, e eles medem coisas diferentes com nomes parecidos.
Campo (usuários reais)
- Vem do relatório de experiência do usuário do Chrome, alimentado por visitas verdadeiras
- Aparelhos, redes e comportamentos reais, inclusive o celular ruim do seu cliente
- É isto que o Google usa para avaliar a página
- Atualiza devagar, em janela de 28 dias
- Só existe se a página tiver volume suficiente de visitas
Laboratório (simulação)
- Lighthouse rodando uma carga na hora, num ambiente controlado
- Rede e processador simulados, viewport fixa, sem interação humana
- Serve para diagnosticar e para comparar antes e depois
- Responde na hora, ideal para iterar
- Existe sempre, inclusive em site sem nenhum acesso
A consequência prática é dura: o Lighthouse não mede INP. Ele não pode, porque ninguém tocou na tela. No lugar, ele reporta TBT (Total Blocking Time), que é uma aproximação razoável do bloqueio da thread principal, mas não é a mesma coisa. Dá para ter TBT baixo e INP ruim, e o contrário também.
O CLS também difere. Em laboratório, ele é medido apenas durante o carregamento. Em campo, ele acumula durante toda a vida da página, incluindo o que pula depois que o usuário rolou, clicou em algo ou abriu um acordeão.
Nota 100 no Lighthouse não é aprovação em Core Web Vitals. São duas medições diferentes, e só uma delas tem usuário dentro.
LCP: por que a sua página demora a mostrar algo
O LCP registra quando o maior bloco de conteúdo visível terminou de ser pintado. Costuma ser a imagem do topo, um bloco de texto grande ou um vídeo de fundo. O primeiro passo de qualquer diagnóstico é descobrir qual elemento é o LCP naquela página, porque otimizar outro não muda nada. O Chrome DevTools e o próprio relatório do Lighthouse informam isso.
Depois de identificado, o tempo total se decompõe em quatro pedaços. Descobrir em qual deles está o gasto é o que separa correção de chute:
- Tempo até o primeiro byte. Servidor lento, redirecionamento em cadeia, resposta gerada dinamicamente sem cache. Página estática servida de CDN resolve quase todo esse pedaço.
- Atraso até começar a baixar o recurso. O navegador só descobriu a imagem depois de baixar e processar o CSS, ou ela é injetada por JavaScript. Aqui entram
preloadefetchpriority="high". - Tempo baixando o recurso. A imagem é grande demais para o espaço em que aparece, ou está num formato caro.
- Atraso até pintar. CSS ou JavaScript bloqueando a renderização, ou conteúdo que só existe depois que o JavaScript roda.
As correções que mais rendem
- Nunca colocar
loading="lazy"na imagem do topo. É o erro mais comum e mais caro: o desenvolvedor aplica lazy loading em todas as imagens de uma vez e adia justamente a que define o LCP. - Servir a imagem do topo dimensionada e em formato moderno. Como fazer isso sem perder qualidade está em o guia de otimização de imagem.
- Cortar CSS e JavaScript que bloqueiam a renderização. Script de terceiro no
headsemdeferé o suspeito número um. - Se o LCP for texto, garantir que a fonte não atrase a pintura. Esse mecanismo tem armadilhas próprias e está detalhado em como hospedar fonte própria sem atrasar o carregamento.
- Evitar que o conteúdo do topo dependa de renderização no cliente. Se o herói só existe depois do JavaScript executar, o LCP herda todo o custo do bundle.
INP: por que a página trava quando alguém toca
O INP mede o intervalo entre a interação do usuário e a próxima pintura da tela. Ele observa todas as interações da sessão e reporta praticamente a pior delas. Um único botão ruim contamina a métrica da página inteira.
Também se decompõe em três partes, e a maior parte das pessoas otimiza a errada:
- Atraso de entrada. A thread principal estava ocupada com outra coisa quando o dedo tocou. Culpa quase sempre de tarefas longas de terceiros, como scripts de rastreamento e chat.
- Tempo de processamento. O seu próprio manipulador de evento é pesado.
- Atraso de apresentação. O navegador precisou recalcular layout e repintar antes de mostrar o resultado. DOM enorme e CSS caro pesam aqui.
O que costuma resolver
- Quebrar tarefas longas. Qualquer bloco acima de 50 ms na thread principal é candidato. Ceder o controle ao navegador entre pedaços de trabalho resolve mais que micro-otimizar código.
- Dar retorno visual imediato e adiar o trabalho. Pinte o estado de "clicado" primeiro e só depois faça a conta pesada. O INP mede até a pintura, não até o fim da lógica.
- Auditar terceiros. Chat, mapa incorporado, pixel de rede social e teste A/B são as causas mais frequentes de INP ruim em landing page. Carregue sob demanda o que não é essencial.
- Reduzir o tamanho do DOM. Página construída em construtor visual costuma ter milhares de elementos aninhados, e cada recálculo de layout custa proporcional a isso.
CLS: por que o conteúdo pula
O CLS soma os deslocamentos inesperados de layout, ponderados pelo tamanho da área afetada e pela distância que ela se moveu. Não tem unidade, é um índice. Deslocamento causado por ação do usuário dentro de uma janela de 500 ms não conta, e é por isso que abrir um acordeão não penaliza a métrica.
As causas são quase sempre estas cinco:
| Causa | Correção |
|---|---|
Imagem sem width e height | Declarar os dois atributos, ou reservar o espaço com aspect-ratio no CSS |
| Anúncio, mapa ou vídeo incorporado | Reservar a altura do contêiner antes do conteúdo chegar |
| Conteúdo injetado acima do que já está na tela | Nunca inserir banner ou aviso empurrando o conteúdo. Sobrepor ou reservar espaço. |
| Troca de fonte com métricas diferentes | Ajustar a fonte de fallback com size-adjust e overrides de métrica |
| Animação de propriedades que alteram layout | Animar transform e opacity, nunca top, height ou margin |
O CLS é a métrica mais barata de resolver das três, e a que mais irrita o usuário quando está ruim. Deslocamento de layout é a causa direta do toque errado: a pessoa mira num link, o conteúdo sobe e ela clica em outra coisa.
Um fluxo de medição que não engana você mesmo
- Comece pelo campo. Abra o PageSpeed Insights e leia primeiro o bloco de usuários reais. Se ele não existir, pule direto para instrumentar a página com a biblioteca
web-vitalse volte daqui a algumas semanas com dado próprio. - Descubra a métrica que está falhando no percentil 75, e separando celular de computador. Não otimize as três de uma vez.
- Reproduza em laboratório com throttling de rede e de CPU ativados. Testar no seu desktop com fibra é medir uma página que nenhum cliente seu acessa.
- Identifique o elemento ou a interação culpada no painel de performance do DevTools, não no palpite.
- Corrija uma coisa por vez e compare o laboratório antes e depois. É o único jeito de saber se a mudança fez algo.
- Espere o campo confirmar. Semanas, não horas. Só o campo prova que o usuário real melhorou.
A pergunta comercial de fundo, sobre quanto essa melhora vale em dinheiro, tem um artigo próprio: o que a velocidade faz com a conversão. Aqui interessa o método.
Cinco erros que continuam sendo repetidos
- Perseguir a nota de performance do Lighthouse. Ela é uma média ponderada de métricas de laboratório e não é o que classifica a sua página. Serve como termômetro de diagnóstico, não como meta.
- Aplicar
loading="lazy"em tudo. Abaixo da dobra, ajuda. No elemento de LCP, piora a métrica principal para economizar bytes que seriam baixados de qualquer jeito. - Achar que passou porque a média passou. A avaliação é no percentil 75. Se um quarto do seu público usa aparelho mais lento, é ele quem decide a sua nota.
- Otimizar a home e esquecer as outras páginas. A avaliação é por URL. A página que recebe o anúncio pode estar péssima enquanto a home está impecável.
- Tratar Core Web Vitals como projeto de SEO. Elas são um sinal de classificação, entre muitos, e relevância pesa mais. O retorno real está na experiência de quem já chegou, não em subir posições.
Perguntas frequentes
Quais são os limiares oficiais de Core Web Vitals?
LCP é considerado bom até 2,5 segundos e ruim acima de 4 segundos. INP é bom até 200 milissegundos e ruim acima de 500. CLS é bom até 0,1 e ruim acima de 0,25. A avaliação usa o percentil 75 das visitas reais numa janela de 28 dias, com celular e computador separados, e não a média.
Por que o PageSpeed Insights me dá dois resultados diferentes?
Porque são duas medições distintas. O bloco superior vem de usuários reais do Chrome nos últimos 28 dias, com aparelhos e redes de verdade. O bloco inferior é uma simulação executada na hora, em ambiente controlado. O primeiro é o que classifica a sua página. O segundo serve para diagnosticar e comparar antes e depois de uma mudança.
O Lighthouse mede INP?
Não. O INP depende de interações humanas reais e o Lighthouse carrega a página sem tocar em nada. No lugar, ele reporta Total Blocking Time, que aproxima o bloqueio da thread principal. É um indicador útil, mas não é a métrica. Para saber o INP verdadeiro você precisa de dado de campo ou de instrumentação própria com a biblioteca web-vitals.
Corrigi o problema e o relatório não mudou. O que houve?
O dado de campo usa uma janela móvel de 28 dias. Visitas anteriores à correção continuam dentro da amostra e continuam puxando o número. A melhora aparece gradualmente, ao longo de semanas. Enquanto isso, use o dado de laboratório para confirmar que a mudança teve efeito técnico.
Minha página não mostra dados de usuários reais. Está errado?
Não. O relatório de campo só existe quando a página tem volume suficiente de visitas para preservar a privacidade dos usuários. Muita landing page de negócio local nunca alcança esse volume. A alternativa é instrumentar a própria página com a biblioteca web-vitals e enviar as métricas dos seus visitantes para onde você preferir. É a única forma de ter dado real num site de baixo tráfego.