This article is not yet available in English. Showing original Portuguese content.
Desenvolvimento Web
Jan 28, 20265 min156 views

Written byVinicius Silva

Pare de Matar o seu LCP: O Guia Definitivo de Imagens no Next.js

A web tem um problema de peso. Segundo o HTTP Archive, imagens compõem, em média, 50% do peso total de uma página web. Se você está otimizando seu Javascript

Imagens digitais pesadas atrasando o LCP, e o Next.js as otimizando para velocidade.

Other articles

View all

Quick summary

  • O Pesadelo dos Core Web Vitals: LCP e CLS
  • A Trindade da Otimização: WebP, AVIF e Lazy Loading
  • next/image : A "Mágica" Sob o Capô
Article language
EN translation unavailable

Para quem vive no ecossistema de SEO e Growth, a equação é simples: Imagens pesadas = LCP (Largest Contentful Paint) alto = Ranking ruim no Google.

No passado, resolver isso exigia um pipeline de build complexo (Gulp, Webpack, ImageMagick) para gerar múltiplas versões de cada ativo. Hoje, se você usa React e Next.js, a ferramenta next/image faz o trabalho pesado por você.

Aqui no Abstract Studio, performance não é "nice to have", é feature. Vamos mergulhar em como transformar a performance do seu front-end usando formatos modernos (WebP/AVIF) e carregamento inteligente.

O Pesadelo dos Core Web Vitals: LCP e CLS

Antes do código, o contexto. O Google avalia sua página com base em métricas vitais. Duas delas são assassinadas por imagens mal otimizadas:

  1. LCP (Largest Contentful Paint): O tempo que leva para o maior elemento visível (geralmente a imagem Hero) carregar. Se demorar mais de 2.5s, você falhou.

  2. CLS (Cumulative Layout Shift): Sabe quando você vai clicar em um botão e a página "pula" porque uma imagem carregou lá em cima e empurrou tudo para baixo? Isso é CLS. O Google odeia, e seu usuário odeia mais ainda.

O componente nativo <img> do HTML é "burro". Ele não sabe o tamanho da imagem até fazer o download, causando o layout shift, e baixa a imagem original mesmo que o usuário esteja num celular 3G.

A Trindade da Otimização: WebP, AVIF e Lazy Loading

Para vencer o Lighthouse, precisamos de três coisas:

  • Formatos Modernos: Esqueça JPG e PNG. O WebP é, em média, 30% menor. O AVIF é ainda mais agressivo, chegando a ser 50% menor que o JPEG com a mesma qualidade visual.

  • Lazy Loading: Carregar apenas o que o usuário está vendo. Se a imagem está no rodapé, ela não deve consumir banda durante o carregamento inicial.

  • Dimensionamento Correto: Servir uma imagem de 4000px de largura para um celular de 375px de largura é um crime contra a performance.

next/image: A "Mágica" Sob o Capô

O Next.js introduziu o componente <Image /> para abstrair toda essa complexidade. Ele não é apenas um wrapper HTML; ele é conectado a uma API de otimização de imagem on-demand.

Quando você usa <Image />, o Next.js:

  1. Detecta o navegador do usuário.

  2. Converte a imagem original para AVIF (se o navegador suportar) ou WebP automaticamente.

  3. Redimensiona a imagem para o tamanho exato do container (via srcset).

  4. Reserva o espaço no layout para evitar CLS (Layout Shift).

Implementação Prática

Vamos ao código.

O jeito errado (HTML padrão):

JavaScript

/* Não faça isso em 2024 */
<img 
  src="/hero-banner.jpg" 
  alt="Banner Principal" 
  class="w-full h-auto"
/>

O jeito Abstract Studio (Next.js):

JavaScript

import Image from 'next/image';
import heroPic from '../public/hero-banner.jpg'; // Import estático

export default function Hero() {
  return (
    <div className="relative w-full h-[500px]">
      <Image
        src={heroPic}
        alt="Banner de Alta Performance"
        fill // Ocupa o container pai (position: absolute)
        style={{ objectFit: 'cover' }}
        priority // CRÍTICO: Avisa ao Next para NÃO fazer lazy loading aqui
        quality={85} // Otimização de compressão
        placeholder="blur" // Efeito de carregamento suave
      />
    </div>
  );
}

O Detalhe que Ninguém Conta: A Propriedade priority

O Lazy Loading é ativado por padrão no Next.js. Isso é ótimo para imagens "abaixo da dobra" (que o usuário precisa rolar para ver).

Porém, um erro clássico de desenvolvedores Jr. (e até Seniors) é deixar o lazy loading ativado na Imagem Hero (a principal do topo).

  • O Problema: O navegador espera o JS hidratar para decidir carregar a imagem. Isso aumenta o LCP.

  • A Solução: Adicione a prop priority ou loading="eager" na imagem principal. Isso diz ao navegador: "Carregue isso AGORA, é importante".

Dominando a Propriedade sizes

Se você usa fill ou imagens responsivas, o Next.js precisa de uma dica de qual tamanho de imagem baixar. Se você não configurar a prop sizes, ele pode baixar uma imagem muito maior do que o necessário por precaução.

Imagine um grid de cards de produtos. Em desktop são 3 colunas, em mobile é 1 coluna.

JavaScript

<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
  {products.map((product) => (
    <div key={product.id} className="relative h-64">
      <Image
        src={product.image}
        alt={product.name}
        fill
        /*
         TRADUÇÃO DA PROP SIZES:
         - (max-width: 768px) 100vw -> Em mobile, a imagem ocupa 100% da tela.
         - (max-width: 1200px) 50vw -> Em tablets, ocupa metade.
         - 33vw -> Em desktop, ocupa um terço da tela.
        */
        sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
        className="rounded-lg object-cover"
      />
    </div>
  ))}
</div>

Configurar sizes corretamente pode reduzir o peso da página em kilobytes preciosos, impactando diretamente na velocidade de renderização em redes 4G.

Lidando com Imagens Remotas (CDN/S3)

Se suas imagens vêm de um CMS (WordPress, Contentful) ou bucket S3, você precisa configurar o next.config.js para permitir a otimização, por segurança.

JavaScript

// next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'], // Força a geração de AVIF
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'meu-bucket-s3.amazonaws.com',
        pathname: '/uploads/**',
      },
    ],
  },
}

Atenção: Ao ativar formats: ['image/avif', 'image/webp'], o servidor Next.js levará um pouco mais de tempo na primeirarequisição para gerar o AVIF (que é computacionalmente pesado), mas cacheará o resultado para sempre. O ganho de compressão do AVIF compensa esse custo inicial.

Conclusão: Performance é UX (e Dinheiro)

Otimizar imagens não é apenas sobre deixar o Lighthouse verde. É sobre respeitar o plano de dados do seu usuário e entregar valor mais rápido. O ecossistema do Next.js transformou uma tarefa complexa de engenharia em uma API declarativa simples.

Não há mais desculpas para servir megabytes de pixels desnecessários. Use WebP/AVIF, entenda o priority e configure seus sizes. Seu SEO agradecerá.


Seu e-commerce ou SaaS está lento e perdendo conversão? No Abstract Studio, nós somos obcecados por milissegundos. Construímos aplicações que carregam instantaneamente e escalam globalmente. Se você quer auditar a performance do seu front-end, fale com a gente.

Written by

Vinicius Silva

Vinicius Silva é fundador da Abstract Prisma e criador do AbstractOS, o sistema operacional digital que reúne criação de software com IA, gestão de negócios e marketing num lugar só, pensado para PMEs e fundadores no Brasil. Escreve sobre operação de negócios, criação de produtos com IA, marketing e o ecossistema digital brasileiro (Pix, NF-e, WhatsApp, LGPD).

Published on Jan 28, 2026