Back

Como Otimizar Imagens no Next.js para Performance

Como Otimizar Imagens no Next.js para Performance

As imagens frequentemente representam 50-70% do tamanho total de uma página web, impactando diretamente métricas de Core Web Vitals como Largest Contentful Paint (LCP) e Cumulative Layout Shift (CLS). O manuseio inadequado de imagens pode prejudicar suas pontuações no Lighthouse, aumentar as taxas de rejeição e afetar o ranking de SEO—mesmo que seu JavaScript esteja perfeitamente otimizado.

Este guia cobre otimização de imagens no Next.js usando o componente integrado next/image, desde a implementação básica até integração avançada com CDN e estratégias de cache. Você aprenderá como entregar imagens responsivas e de carregamento rápido que melhoram tanto as métricas de performance quanto a experiência do usuário.

Principais Conclusões

  • O componente next/image converte automaticamente imagens para formatos modernos como WebP e AVIF, reduzindo o tamanho dos arquivos em 25-35%
  • A otimização adequada de imagens pode melhorar o LCP em 50% e reduzir os custos de largura de banda em 60%
  • Usar a prop priority em imagens acima da dobra e configurar tamanhos responsivos previne mudanças de layout
  • Loaders personalizados permitem integração com CDNs de imagem especializadas para aplicações de alto tráfego

Por Que o Componente next/image É Importante para Performance

O componente next/image não é apenas um wrapper em torno da tag HTML <img>—é um pipeline de otimização automatizado que cuida do trabalho pesado da entrega moderna de imagens.

Recursos Principais de Performance

Conversão automática de formato: O Next.js serve formatos WebP e AVIF quando os navegadores os suportam, reduzindo o tamanho dos arquivos em 25-35% comparado a JPEG/PNG sem perda de qualidade.

Geração de imagens responsivas: O componente cria múltiplos tamanhos de imagem no momento do build ou sob demanda, garantindo que usuários mobile não baixem imagens dimensionadas para desktop.

Lazy loading integrado: Imagens abaixo da dobra carregam apenas quando os usuários rolam próximo a elas, reduzindo o peso inicial da página e melhorando o First Contentful Paint (FCP).

Prevenção de mudança de layout: Ao exigir props de width e height (ou usando a prop fill), o componente reserva espaço antes das imagens carregarem, eliminando problemas de CLS.

Implementação Básica e Props Essenciais

Comece com uma implementação simples que cobre 80% dos casos de uso:

import Image from 'next/image'

export default function Hero() {
  return (
    <Image
      src="/hero-banner.jpg"
      alt="Product showcase"
      width={1200}
      height={600}
      priority // Load immediately for LCP optimization
    />
  )
}

Quando Usar Props Principais

priority: Adicione isso a imagens acima da dobra que afetam o LCP. Desabilita o lazy loading e adiciona um link de preload. Use com moderação—apenas para 1-2 imagens críticas por página.

sizes: Essencial para imagens responsivas. Informa ao navegador qual tamanho de imagem baixar com base na largura da viewport:

<Image
  src="/product.jpg"
  alt="Product"
  width={800}
  height={600}
  sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 800px"
/>

placeholder=“blur”: Exibe um placeholder de baixa qualidade enquanto a imagem principal carrega. Para importações estáticas, o Next.js gera o blurDataURL automaticamente:

import heroImage from '@/public/hero.jpg'

<Image
  src={heroImage}
  alt="Hero"
  placeholder="blur"
  // blurDataURL generated automatically for static imports
/>

Configurando Imagens Remotas com remotePatterns

Para imagens de fontes externas, configure remotePatterns no next.config.js (a configuração antiga domains está depreciada):

// next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'cdn.example.com',
        pathname: '/images/**',
      },
    ],
  },
}

Este recurso de segurança previne requisições maliciosas de imagens enquanto permite fontes externas específicas.

Otimização Avançada com CDNs e Loaders Personalizados

Para aplicações de alto tráfego, integre CDNs de imagem especializadas como Cloudinary ou Imgix usando loaders personalizados:

// lib/imageLoader.js
export default function cloudinaryLoader({ src, width, quality }) {
  const params = ['f_auto', 'c_limit', `w_${width}`, `q_${quality || 'auto'}`]
  return `https://res.cloudinary.com/demo/image/upload/${params.join(',')}/${src}`
}

// Component usage
<Image
  loader={cloudinaryLoader}
  src="product.jpg"
  alt="Product"
  width={400}
  height={300}
/>

Estratégia de Cache para Performance Otimizada

O Next.js define headers de cache agressivos por padrão:

Cache-Control: public, max-age=31536000, immutable

Para conteúdo dinâmico, sobrescreva-os no next.config.js:

module.exports = {
  async headers() {
    return [
      {
        source: '/_next/image(.*)',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=86400, stale-while-revalidate=604800',
          },
        ],
      },
    ]
  },
}

Melhores Práticas para Produção

Meça o impacto com dados reais: Use Lighthouse e WebPageTest para rastrear melhorias no LCP. Uma imagem hero devidamente otimizada pode reduzir o LCP em 1-2 segundos.

Balance qualidade e tamanho do arquivo: Defina quality={75} como ponto de partida. Teste a qualidade visual contra a economia de tamanho de arquivo—reduzir de 100 para 75 frequentemente economiza 40% com impacto visual mínimo.

Trate diferentes tipos de imagem apropriadamente: Use unoptimized para SVGs e assets já otimizados:

<Image
  src="/logo.svg"
  alt="Logo"
  width={200}
  height={50}
  unoptimized
/>

TypeScript para segurança de tipos: Importe imagens para detecção automática de dimensões e verificação de tipos:

import type { StaticImageData } from 'next/image'
import productImage from '@/public/product.jpg'

interface ProductCardProps {
  image: StaticImageData
  alt: string
}

Problemas Comuns de Troubleshooting

Erro “Invalid src prop”: Certifique-se de que domínios remotos estão configurados em remotePatterns ou use um loader personalizado.

Imagens borradas em displays de alto DPI: Verifique se as imagens de origem têm pelo menos 2x o tamanho de exibição e evite configurações de qualidade agressivas abaixo de 70.

Aumento no tempo de build: Para sites com centenas de imagens, considere usar otimização sob demanda em vez de processamento no momento do build, ou implemente um loader personalizado com um serviço externo.

Conclusão

A otimização de imagens no Next.js através do componente next/image proporciona ganhos imediatos de performance com configuração mínima. Comece com o básico—dimensionamento adequado, lazy loading e conversão de formato—depois adicione técnicas avançadas como integração com CDN e loaders personalizados conforme seu tráfego escala.

A chave é medir o impacto no mundo real: imagens devidamente otimizadas podem melhorar o LCP em 50%, reduzir custos de largura de banda em 60% e aumentar significativamente suas pontuações de Core Web Vitals. Foque primeiro nas suas imagens acima da dobra, depois otimize sistematicamente o resto do seu pipeline de imagens.

Perguntas Frequentes

Não, você deve configurar os domínios permitidos no next.config.js usando remotePatterns por segurança. Isso previne que atores maliciosos usem sua aplicação como proxy de imagens. Você também pode contornar isso com loaders personalizados.

As imagens de origem devem ter pelo menos 2x o tamanho de exibição para telas de alto DPI. Também verifique se sua configuração de qualidade não está muito baixa. Uma qualidade de 75-85 geralmente proporciona o melhor equilíbrio entre tamanho de arquivo e clareza visual.

Não, use priority apenas para 1-2 imagens críticas acima da dobra que afetam o LCP. O uso excessivo derrota o propósito do lazy loading e pode na verdade prejudicar a performance ao carregar muitas imagens simultaneamente.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay