Uma execução do Lighthouse conta uma história controlada. Os visitantes chegam com celulares, redes, caches, extensões e caminhos diferentes. Se você mede apenas no laboratório, pode corrigir uma página que já estava boa e ignorar a interação que trava no aparelho usado pelo público.
Dados de campo registram o que aconteceu em visitas reais. Essa prática costuma ser chamada de Real User Monitoring, ou RUM. Para Core Web Vitals, ela permite acompanhar LCP, INP e CLS por rota, versão e classe de dispositivo.
Coletar não é despejar cada evento do navegador em um banco. Defina perguntas, limite o payload e trate privacidade antes de publicar o script.
Separe campo de laboratório
As duas fontes respondem perguntas diferentes.
| Fonte | Responde melhor | Limite principal |
|---|---|---|
| Lighthouse e DevTools | por que um cenário reproduzido ficou lento | cobre um dispositivo e uma execução por vez |
| CrUX e PageSpeed Insights | como usuários elegíveis do Chrome viveram a página ou origem | dados agregados, janela histórica e pouca atribuição |
| RUM próprio | qual rota, versão e alvo concentram problemas no seu público | exige instrumentação, armazenamento e governança |
O fluxo oficial de Core Web Vitals com ferramentas Google recomenda campo para medir a experiência real e laboratório para diagnosticar. Não escolha um lado. Use campo para encontrar o problema e laboratório para reproduzir a causa.
O guia de Core Web Vitals em sites criados por IA cobre os conceitos e limites. Aqui o foco é montar uma coleta própria que ajude a decidir o que corrigir.
Comece pelo CrUX quando houver dados
O Chrome User Experience Report reúne dados agregados de usuários elegíveis do Chrome. PageSpeed Insights mostra esses dados quando a página ou a origem tem amostra suficiente.
Verifique:
- se o relatório é da URL ou da origem inteira;
- se o recorte é celular ou desktop;
- o percentil 75 de LCP, INP e CLS;
- as frações classificadas como boas, precisam melhorar ou ruins;
- o período informado pela ferramenta.
A CrUX API também expõe histogramas e percentis para consultas automatizadas. Um site novo ou com pouco tráfego pode não aparecer. Ausência de dados não significa aprovação nem falha.
CrUX localiza a tendência. Ele não costuma dizer qual botão causou o INP ou qual elemento deslocou a página. Para isso, você precisa de atribuição na própria visita.
Use a biblioteca web-vitals
A biblioteca oficial web-vitals implementa as métricas de forma compatível com a medição do Chrome. A versão padrão entrega os valores. A build web-vitals/attribution acrescenta sinais para diagnóstico.
Instale no projeto que gera os arquivos publicados:
bun add web-vitalsDepois, registre apenas os campos necessários:
import { onCLS, onINP, onLCP } from "web-vitals/attribution";
function reportMetric(metric) { const body = JSON.stringify({ name: metric.name, value: metric.value, rating: metric.rating, id: metric.id, route: location.pathname, version: document.documentElement.dataset.version, });
navigator.sendBeacon("/metrics", body);}
onCLS(reportMetric);onINP(reportMetric);onLCP(reportMetric);O endpoint é ilustrativo. Um site estático precisa enviar os dados a um serviço de analytics ou a uma API externa autorizada. O Site no Ar publica os arquivos do frontend; ele não cria esse coletor nem armazena eventos automaticamente.
Nem todo callback dispara em toda visita. INP não existe se a pessoa não interagir. Algumas métricas só ficam prontas quando a aba muda de estado ou começa a descarregar. Teste navegação, troca de aba e encerramento de sessão.
Inclua dados que levam a uma correção
Um valor sem contexto confirma o problema, mas não aponta o código. A build de attribution pode acrescentar:
- elemento e URL associados ao LCP;
- alvo e tipo da interação do INP;
- atraso de entrada, processamento e apresentação;
- elemento do maior layout shift;
- estado de carregamento em que o evento aconteceu;
- dados de Long Animation Frames em navegadores compatíveis.
O guia do web.dev para depurar performance no campo mostra como esses sinais reduzem a distância entre métrica e causa.
Escolha poucos campos no começo:
function safeAttribution(metric) { if (metric.name === "INP") { return { target: sanitizeTarget(metric.attribution.interactionTarget), type: metric.attribution.interactionType, inputDelay: Math.round(metric.attribution.inputDelay), processing: Math.round(metric.attribution.processingDuration), presentation: Math.round(metric.attribution.presentationDelay), }; }
return {};}Não ative todos os eventos processados por padrão. Páginas muito interativas podem aumentar memória e volume de dados. Comece com a interação responsável pelo INP e amplie só quando a pergunta exigir.
Preserve a privacidade
Métricas técnicas ainda podem carregar dados pessoais se você copiar a URL ou o DOM sem cuidado.
Não envie:
- query strings completas;
- texto digitado ou conteúdo de campos;
- nomes, emails, telefones ou IDs de conta;
- seletores com valores criados a partir de dados do visitante;
- conteúdo de mensagens de erro sem revisão;
- IP ou fingerprint criado para unir sessões.
Prefira identificadores definidos no código:
<button data-performance-name="lead-form-submit">Enviar</button>O gerador de alvo pode devolver apenas esse nome controlado. Se não houver um identificador seguro, use uma classe de componente genérica ou descarte o alvo.
Defina retenção, acesso, finalidade e base legal com quem responde pela privacidade do projeto. Respeite a escolha de consentimento adotada pelo site. Medir performance não autoriza coletar qualquer detalhe da navegação.
Use amostragem e limites
Enviar todas as métricas de todas as visitas pode gerar custo sem melhorar a decisão. Escolha uma amostra estável, por exemplo a partir de um valor aleatório por pageview, e registre a taxa usada.
const sampleRate = 0.1;const sampled = Math.random() < sampleRate;
if (sampled) { onCLS(reportMetric); onINP(reportMetric); onLCP(reportMetric);}0.1 é apenas um exemplo de implementação. O volume necessário depende do tráfego, da variação entre rotas e da precisão esperada.
No coletor:
- limite o tamanho do corpo;
- aceite somente nomes e tipos conhecidos;
- rejeite valores fora de faixas plausíveis;
- aplique rate limit;
- não confie na versão enviada pelo navegador como autorização;
- monitore falhas do próprio endpoint.
Agrupe por rota e versão
Uma média do site inteiro mistura páginas e builds diferentes. Registre dimensões que levem a uma decisão:
- rota normalizada, sem parâmetros pessoais;
- versão ou hash da build;
- celular ou desktop;
- faixa de conexão quando houver justificativa;
- métrica e classificação;
- alvo seguro ou componente;
- fase dominante do INP;
- período da coleta.
Use percentis, não apenas média. Core Web Vitals avalia o percentil 75 porque a cauda da distribuição importa. Um conjunto de visitas muito rápidas pode esconder um grupo relevante com experiência ruim.
Não compare uma rota com dez visitas a outra com dez mil como se a confiança fosse igual. Mostre o tamanho da amostra e evite concluir cedo demais.
Transforme o dado em uma fila de investigação
Um painel útil responde qual trabalho deve começar.
Exemplo de leitura:
Rota: /precos/Version: 8f3c2a1Período: 7 diasAmostra INP: 2.840 visitas com interaçãoP75: 286 msAlvo mais frequente entre casos ruins: pricing-plan-toggleFase dominante: presentation delayPróximo teste: trace do toggle com todos os cards montadosEsse registro aponta uma reprodução. “INP ruim no site” não aponta.
Para LCP, agrupe pelo elemento e fases de descoberta, carregamento e renderização. O artigo sobre LCP da imagem hero mostra as correções possíveis. Para CLS, registre o maior elemento afetado e use o guia de layout shifts.
Não use dados de campo como trace remoto
Attribution reduz o espaço de busca, mas não substitui uma gravação reproduzível. Um seletor e uma duração não mostram toda a pilha, os estilos recalculados ou a pintura.
Quando encontrar um grupo ruim:
- identifique rota, versão, dispositivo e alvo;
- reproduza o fluxo no DevTools;
- grave Performance com condições declaradas;
- corrija uma causa;
- compare localmente;
- publique a nova versão;
- acompanhe a distribuição depois do deploy.
O guia de redução de INP mostra como ler as fases de uma interação. Para regressões que quebram o orçamento, use também o artigo de orçamento de performance.
Marque a versão publicada
Sem uma versão, os dados anteriores e posteriores se misturam. Injete na build um identificador que não revele segredo e envie o mesmo valor com cada métrica.
No fluxo do Site no Ar:
- consulte o Site e a Version atuais;
- altere os arquivos dentro de
public/; - gere a build com o identificador novo;
- publique com
deploy; - acompanhe
deploy_status; - confirme a URL e o identificador servido;
- filtre os dados pela nova versão.
A documentação de Publicação descreve Sessions, Versions e a URL entregue. O guia de republicação ajuda a manter o mesmo Site durante o teste.
Espere a janela certa
RUM próprio começa a receber eventos assim que o código entra no ar, mas precisa de amostra. CrUX e ferramentas que usam seus dados trabalham com janelas agregadas e não confirmam uma mudança minutos depois do deploy.
Defina antes:
- tamanho mínimo da amostra;
- período de comparação;
- percentil observado;
- segmentação de dispositivo;
- critério de melhora ou regressão;
- ação se o coletor falhar.
Não atribua qualquer variação à nova versão. Campanhas, tráfego, sazonalidade e mudanças externas alteram o conjunto de visitantes.
Prompt para montar a medição de campo
Planeje a coleta de Core Web Vitals deste site sem publicar ainda.
Rotas prioritárias: [rotas]Analytics ou endpoint autorizado: [destino]Version atual: [identificador]Regras de consentimento e retenção: [regras]
1. Meça LCP, INP e CLS com web-vitals/attribution.2. Normalize a rota e inclua uma versão da build.3. Envie somente alvos controlados pelo código.4. Remova query strings, conteúdo digitado e identificadores pessoais.5. Defina amostragem, validação e rate limit.6. Mostre P75, amostra e distribuição por rota e dispositivo.7. Relacione cada grupo ruim a um teste reproduzível no DevTools.8. Só proponha a publicação depois da revisão de privacidade.Medição de campo vale quando muda a próxima decisão. Colete o bastante para encontrar a rota, o alvo e a versão que precisam de trabalho. Depois volte ao código, reproduza o caso e use a publicação seguinte para testar se a distribuição realmente mudou.
