Front-end

Core Web Vitals: Guia Prático para Desenvolvedores Otimizarem a Performance Web

Aprenda a otimizar LCP, INP e CLS com técnicas práticas de frontend, análise de dados do CrUX e exemplos de código para melhorar a performance e o SEO.

Marcos Costa
Marcos Costa
05 de novembro de 2026 13 min de leitura
Dashboard de performance web com métricas Core Web Vitals (LCP, INP, CLS) e código frontend otimizado em um monitor de desenvolvedor.

A performance web não é mais um diferencial, mas uma exigência fundamental para qualquer aplicação moderna. O Google, através dos Core Web Vitals, estabeleceu um conjunto de métricas que quantificam a experiência real do usuário em uma página, influenciando diretamente o ranqueamento em seus resultados de busca. Para desenvolvedores, entender e otimizar essas métricas é crucial.

Este guia prático mergulha nas definições técnicas do Largest Contentful Paint (LCP), Interaction to Next Paint (INP) e Cumulative Layout Shift (CLS), explorando a recente transição do FID para o INP, a diferença entre dados de campo e laboratório, e, mais importante, oferece estratégias de otimização com exemplos de código para você aplicar em seus projetos. Nosso objetivo é fornecer um roteiro técnico para identificar gargalos e implementar correções reais que impactam a experiência do usuário e o SEO.

O que são Core Web Vitals e quais os seus limites técnicos

Os Core Web Vitals são um conjunto de três métricas essenciais que avaliam a experiência de carregamento, interatividade e estabilidade visual de uma página web. Desde 2021, o Google os utiliza como um fator de ranqueamento, enfatizando a importância de sites que oferecem uma navegação fluida e agradável. Para que uma página seja considerada com “boa” performance, ela deve atingir os seguintes limites para 75% das visitas dos usuários, conforme dados de campo (CrUX) 1:

  • Largest Contentful Paint (LCP): Mede o tempo que o maior elemento de conteúdo visível na viewport leva para carregar. Este elemento geralmente é uma imagem, um vídeo ou um bloco de texto grande. Um LCP bom deve ser de 2.5 segundos ou menos.
  • Interaction to Next Paint (INP): Avalia a responsividade geral de uma página a todas as interações do usuário (cliques, toques, digitação) durante todo o seu ciclo de vida. Um INP bom deve ser de 200 milissegundos ou menos.
  • Cumulative Layout Shift (CLS): Quantifica a quantidade de deslocamento inesperado de layout do conteúdo visível da página. Um CLS bom deve ser de 0.1 ou menos.

Essas métricas são pilares para a qualidade de software web, garantindo que a experiência do usuário seja consistente e previsível.

A transição do FID para o INP: medindo a responsividade real da página

Em 12 de março de 2024, o Google oficializou a substituição do First Input Delay (FID) pelo Interaction to Next Paint (INP) como a métrica de responsividade dos Core Web Vitals 2. Mas por que essa mudança? O FID media apenas o atraso da primeira interação do usuário, ignorando todas as interações subsequentes que ocorrem durante o ciclo de vida da página. Isso significava que um site poderia ter um bom FID, mas ainda ser lento e não responsivo após o carregamento inicial.

O INP, por outro lado, oferece uma visão muito mais abrangente da responsividade. Ele observa todas as interações de clique, toque e teclado que ocorrem na página e relata o valor mais longo (ou quase o mais longo) observado. Isso força os desenvolvedores a otimizar não apenas o carregamento inicial, mas a experiência interativa completa, garantindo que a página permaneça responsiva mesmo após várias ações do usuário. Para um INP ser considerado bom, ele deve ser de 200 milissegundos ou menos 1.

Dados de campo (CrUX) vs. Dados de laboratório (Lighthouse): como interpretar a performance

Ao otimizar os Core Web Vitals, é fundamental entender a diferença entre dados de campo e dados de laboratório. Essa distinção é crucial para uma estratégia de otimização eficaz:

  • Dados de Laboratório (Synthetic Data): São coletados em um ambiente controlado, usando ferramentas como o Lighthouse (disponível no Chrome DevTools e PageSpeed Insights). Eles simulam o carregamento da página em condições específicas (ex: rede 3G, CPU lenta) e são excelentes para depuração e para testar otimizações durante o desenvolvimento. No entanto, são dados simulados.
  • Dados de Campo (Real User Data - RUM): São coletados de usuários reais que visitam seu site, através do Chrome User Experience Report (CrUX). Esses dados refletem a experiência real dos usuários em diferentes dispositivos, condições de rede e locais. A avaliação oficial dos Core Web Vitals para ranqueamento é baseada nos dados de campo do CrUX, especificamente no percentil 75 1. Isso significa que 75% dos usuários devem ter uma experiência “boa” para que a página seja aprovada.

Trade-off e Cuidado: Uma pontuação 100 no Lighthouse é um ótimo indicativo de que seu site está bem otimizado em um ambiente controlado, mas não garante que ele terá um bom desempenho nos dados de campo do CrUX. Fatores como a variedade de dispositivos, a qualidade da conexão de internet dos usuários e a complexidade das interações em tempo real podem impactar os dados de campo. Por isso, o fluxo de trabalho ideal envolve usar o Lighthouse para identificar e testar otimizações, e o Google Search Console (que exibe os dados do CrUX) para monitorar o impacto real dessas mudanças.

Estratégias de otimização para o Largest Contentful Paint (LCP)

O LCP é a métrica que mais reflete a percepção de carregamento da página. Para otimizá-lo, o foco deve ser no carregamento rápido do maior elemento visível. Aqui estão algumas estratégias:

  1. Reduzir o Time to First Byte (TTFB): O TTFB é o tempo que leva para o navegador receber o primeiro byte da resposta do servidor. Um TTFB alto atrasa todo o carregamento. Para reduzi-lo:

    • Otimize o código do servidor (backend).
    • Use uma CDN (Content Delivery Network) para servir ativos estáticos.
    • Implemente cache no servidor e no navegador.
    • Escolha um provedor de hospedagem com boa performance.
  2. Otimizar Imagens e Vídeos Críticos: Imagens e vídeos são frequentemente os maiores elementos de conteúdo. Certifique-se de:

    • Comprimir imagens: Use formatos modernos como WebP ou AVIF. Ferramentas como Squoosh podem ajudar.
    • Dimensionar corretamente: Sirva imagens no tamanho exato que serão exibidas, evitando que o navegador redimensione.
    • Lazy Loading com Prioridade: Para imagens que são o LCP, o lazy loading tradicional pode atrasar. Use fetchpriority='high' para priorizar o carregamento de imagens críticas, enquanto mantém o lazy loading para as demais.
    <!-- Imagem LCP: Carregamento prioritário -->
    <img src="hero.webp" alt="Imagem principal da página" width="1200" height="800" fetchpriority="high">
    
    <!-- Outras imagens: Lazy loading -->
    <img src="outra-imagem.webp" alt="Outra imagem" width="600" height="400" loading="lazy">
  3. Pré-carregar Recursos Críticos: Use rel="preload" para informar ao navegador sobre recursos importantes (fontes, CSS, JavaScript) que devem ser carregados o mais cedo possível, mesmo que não sejam descobertos imediatamente pelo parser.

    <link rel="preload" href="/fonts/minha-fonte.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="/css/critical.css" as="style">
  4. Minimizar CSS e JavaScript que Bloqueiam a Renderização: Remova CSS e JavaScript não utilizados, adie o carregamento de scripts não essenciais e inicie o CSS crítico (acima da dobra) diretamente no HTML (<style>).

Técnicas para reduzir o Interaction to Next Paint (INP)

O INP foca na responsividade, o que significa que o thread principal do navegador deve estar livre para processar as interações do usuário. As principais causas de um INP ruim são tarefas longas (long tasks) no JavaScript que bloqueiam o thread principal. Para mitigar isso:

  1. Dividir Tarefas Longas (Long Tasks): Se você tem um bloco de código JavaScript que leva muito tempo para executar (ex: processamento de dados complexos, manipulação extensiva do DOM), divida-o em partes menores e execute-as de forma assíncrona.

    • setTimeout: Uma técnica simples é usar setTimeout(..., 0) para quebrar uma tarefa longa, permitindo que o navegador renderize e responda a interações entre as partes.
    // Exemplo de tarefa longa que bloqueia o thread principal
    function processarDadosPesados() {
      for (let i = 0; i < 1000000; i++) {
        // Simula um processamento intensivo
        console.log('Processando item ' + i);
      }
      console.log('Processamento concluído!');
    }
    
    // Refatoração para evitar bloqueio com setTimeout
    function processarDadosPesadosOtimizado() {
      let i = 0;
      const totalItems = 1000000;
    
      function processarProximoLote() {
        const loteFim = Math.min(i + 1000, totalItems); // Processa 1000 itens por vez
        for (; i < loteFim; i++) {
          console.log('Processando item ' + i);
        }
    
        if (i < totalItems) {
          setTimeout(processarProximoLote, 0); // Agenda o próximo lote para a próxima "janela" de inatividade
        } else {
          console.log('Processamento concluído!');
        }
      }
    
      setTimeout(processarProximoLote, 0); // Inicia o processamento assíncrono
    }
    
    // Chame a função otimizada em vez da original
    // processarDadosPesadosOtimizado();
    • requestIdleCallback: Para tarefas não essenciais que podem ser executadas quando o navegador está ocioso, requestIdleCallback é uma API mais sofisticada. Ela agenda uma função para ser executada durante um período de inatividade do navegador, sem bloquear o thread principal.
    function executarTarefaNaoEssencial(deadline) {
      while ((deadline.timeRemaining() > 0 || deadline.didTimeout) && tarefasPendentes.length > 0) {
        const tarefa = tarefasPendentes.shift();
        // Executa a tarefa
        console.log('Executando tarefa:', tarefa);
      }
    
      if (tarefasPendentes.length > 0) {
        requestIdleCallback(executarTarefaNaoEssencial);
      }
    }
    
    // Exemplo de uso
    // let tarefasPendentes = ['log_analytics', 'enviar_dados', 'atualizar_cache'];
    // requestIdleCallback(executarTarefaNaoEssencial);
  2. Usar Web Workers: Para tarefas JavaScript realmente pesadas e computacionalmente intensivas que não precisam de acesso direto ao DOM, os Web Workers permitem executar scripts em um thread separado, liberando completamente o thread principal para interações do usuário.

    // main.js
    const worker = new Worker('worker.js');
    
    worker.postMessage({ data: 'dados para processar' });
    
    worker.onmessage = function(e) {
      console.log('Mensagem do worker:', e.data);
      // Atualiza a UI com o resultado do worker
    };
    
    // worker.js
    onmessage = function(e) {
      const resultado = e.data.data.toUpperCase(); // Exemplo de processamento pesado
      postMessage(resultado);
    };
  3. Otimizar Event Listeners: Evite lógicas complexas e demoradas diretamente nos event listeners. Delegue tarefas pesadas para funções assíncronas ou use técnicas de debouncing e throttling para eventos que disparam frequentemente (ex: scroll, resize).

Como eliminar o Cumulative Layout Shift (CLS) no CSS e assets

O CLS mede a instabilidade visual, ou seja, o quanto os elementos da página se movem inesperadamente após o carregamento inicial. Isso causa uma experiência frustrante para o usuário, que pode clicar em algo errado devido ao deslocamento. As principais causas e soluções são:

  1. Definir Dimensões para Imagens e Vídeos: Sempre inclua os atributos width e height nas tags <img> e <video>. Isso permite que o navegador reserve o espaço necessário antes mesmo de o recurso ser carregado, evitando o “salto” do layout.

    <img src="minha-imagem.jpg" alt="Descrição" width="600" height="400">
    <video src="meu-video.mp4" width="640" height="360" controls></video>

    Para designs responsivos, você pode usar CSS com aspect-ratio para manter a proporção:

    img {
      width: 100%;
      height: auto;
      aspect-ratio: 16 / 9; /* Exemplo: proporção 16:9 */
    }
  2. Reservar Espaço para Conteúdo Dinâmico: Se você tem blocos de anúncios, embeds de terceiros ou componentes que carregam conteúdo de forma assíncrona, reserve um espaço com min-height ou height no CSS. Isso impede que o conteúdo empurre o restante da página quando for renderizado.

    <div class="ad-container"></div>
    .ad-container {
      min-height: 250px; /* Reserve espaço para o anúncio */
      background-color: #f0f0f0;
      display: flex;
      align-items: center;
      justify-content: center;
      text-align: center;
      border: 1px dashed #ccc;
    }
  3. Pré-carregar Fontes Web: O “Flash of Unstyled Text” (FOUT) ou “Flash of Invisible Text” (FOIT) pode causar CLS quando as fontes web são carregadas tardiamente e substituem as fontes do sistema. Use rel="preload" para fontes e font-display: optional ou swap para gerenciar o comportamento de carregamento.

    <link rel="preload" href="/fonts/minha-fonte.woff2" as="font" type="font/woff2" crossorigin>
    @font-face {
      font-family: 'Minha Fonte';
      src: url('/fonts/minha-fonte.woff2') format('woff2');
      font-weight: normal;
      font-style: normal;
      font-display: swap; /* Ou 'optional' */
    }
  4. Evitar Injeção de Conteúdo Acima da Dobra: Evite inserir dinamicamente conteúdo (como banners de consentimento de cookies ou pop-ups) que empurre o conteúdo existente para baixo, a menos que o espaço já tenha sido reservado.

Para frameworks modernizados como Angular ou React, a gestão do DOM e do carregamento de assets é otimizada, mas ainda exige atenção a esses detalhes para evitar CLS. Para mais detalhes sobre a escolha entre frameworks, confira nosso artigo Angular vs React: qual escolher em 2026?.

Workflow de diagnóstico prático: PageSpeed Insights, DevTools e Search Console

Para diagnosticar e monitorar os Core Web Vitals, você tem um arsenal de ferramentas do Google à disposição 1:

  1. PageSpeed Insights (PSI): É a ferramenta mais rápida para ter uma visão geral da performance de uma URL. Ele exibe tanto dados de campo (CrUX) quanto dados de laboratório (Lighthouse), além de sugestões de otimização. Use-o para uma análise inicial e para verificar o impacto das suas correções.

  2. Chrome DevTools (Lighthouse e Performance Tab): Essencial para depuração profunda. No painel “Lighthouse”, você pode rodar auditorias de performance em tempo real e obter relatórios detalhados com as causas dos problemas de LCP, INP e CLS. O painel “Performance” permite gravar o carregamento e as interações da página, visualizando tarefas longas, bloqueios do thread principal e deslocamentos de layout.

  3. Google Search Console (Relatório Core Web Vitals): Esta é a ferramenta definitiva para monitorar a performance do seu site nos dados de campo (CrUX) ao longo do tempo. O relatório mostra quais URLs estão com bom, médio ou baixo desempenho, agrupadas por tipo de problema. É aqui que você verifica se suas otimizações estão realmente impactando a experiência dos usuários reais.

Fluxo de Trabalho Sugerido:

  • Identificação: Use o Search Console para identificar páginas com problemas de Core Web Vitals (status “Precisa de melhorias” ou “Ruim”).
  • Diagnóstico: Pegue uma URL problemática e analise-a no PageSpeed Insights para ter uma visão geral. Em seguida, use o Chrome DevTools para aprofundar na depuração, identificando as causas exatas do LCP, INP ou CLS ruim.
  • Otimização: Aplique as técnicas de otimização de código e assets discutidas neste artigo.
  • Verificação (Laboratório): Teste suas otimizações no Lighthouse do Chrome DevTools para ver melhorias imediatas.
  • Monitoramento (Campo): Após implementar as correções, aguarde algumas semanas para que o Search Console atualize os dados do CrUX e valide o impacto real. Você pode usar a opção “Validar correção” no Search Console para acelerar o processo de reavaliação.

Integrar a otimização de performance com a auditoria contínua de acessibilidade e experiência do usuário é a chave para construir sites de alta qualidade.

Conclusão

Os Core Web Vitals são mais do que apenas métricas de SEO; eles representam a qualidade da experiência que seu site oferece aos usuários. Ao focar na otimização do LCP, INP e CLS, você não apenas melhora o ranqueamento no Google, mas também constrói aplicações mais rápidas, responsivas e agradáveis de usar. A performance é um esforço contínuo que exige atenção aos detalhes do código e uma abordagem sistemática de diagnóstico e correção. Ao adotar as práticas e ferramentas apresentadas neste guia, você estará bem equipado para elevar a performance de suas aplicações web a um novo nível.


FAQ

Uma pontuação 100 no Lighthouse garante um bom ranqueamento no Google? Não. O Lighthouse gera dados de laboratório simulados em um ambiente controlado. O Google utiliza como fator de ranqueamento os dados reais de campo do Chrome User Experience Report (CrUX), coletados de usuários reais navegando no site. Uma pontuação alta no Lighthouse é um bom indicativo, mas o que realmente importa é a performance percebida pelos usuários reais.

Plugins de otimização de performance resolvem todos os gargalos de Core Web Vitals? Plugins podem ajudar com otimizações superficiais como minificação de CSS/JS, cache e compressão de imagens. No entanto, eles não resolvem problemas estruturais no código JavaScript da aplicação, como tarefas longas bloqueando a thread principal, ou má gestão de renderização do DOM que causa layout shifts. Para esses problemas, é necessária uma intervenção direta no código-fonte.

Os Core Web Vitals são o único fator de SEO para ranquear um site? Não. Os Core Web Vitals são um fator importante da experiência da página, mas o algoritmo do Google considera centenas de fatores. A relevância do conteúdo, a autoridade do domínio, a qualidade dos backlinks e a estrutura de links internos continuam sendo pilares fundamentais para o ranqueamento. Eles contribuem para uma boa experiência, que indiretamente pode melhorar outros fatores de SEO.

Referências

Footnotes

  1. WLC. “How important are Core Web Vitals for SEO in 2026?”. Disponível em: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG2eFXyErZyMBIYPAZeAEde8FGSRehUqMkWCXgz6Zd62Xz60SLId7bG1Rfl1_U3jKgF60qff7LX5Dt4zyQsoOcizravWHowY2tOhy8Bx4ddYJvaxL4yuQSO7IN5Z3Y-UZr0g5pJkSmGNzlwUbX86cH1g1v9Z7YfIqu0u-p5_6WGR42QMQ==. Acesso em: 05 nov. 2026. ↩ ↩2 ↩3 ↩4

  2. Google Search Central Blog. “Introducing INP to Core Web Vitals”. Disponível em: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQELz3QPn2XBNsspN3YhF4f6JZV97mZ7—Pv29tjbmNV3GRS-7BsnVHFpBI2OZxB1NVjHEK4qMWUQIvft4lUCdYg1f2zEYvtNtmV8tm0x09fgpz4cYY0lI3o9zpM_07XzM9GcFjGmko-jm_TN-svqmx6PC_DBoLZo7_8RAOM. Acesso em: 05 nov. 2026. ↩

Marcos Costa

Sobre Marcos Costa

Desenvolvedor backend com foco em arquitetura de software, automação e produtos digitais.

Ver mais artigos