Imagens com `next/image`
Imagens são a parte mais “pesada” de websites modernos. Isso porque uma imagem pode chegar facilmente a alguns megabytes de tamanho - o que pode ser maior do que praticamente todo o código restante de uma aplicação.
Além disso, imagens são as principais responsáveis por layout shift, que queremos evitar a todo custo para preservar a UX de nossa aplicação.
Resolvemos esses problemas quando usamos o next/image.
Imagens próprias e imagens remotas
Podemos usar o componente <Image> em nossas próprias imagens que estão no nosso projeto como também em imagens que estão hospedadas remotamente.
Tamanho das imagens
Antes de usarmos o next/image uma das coisas mais importantes a saber é que o componente de imagem sempre trabalha com tamanhos de imagens (largura x altura). Isso permite que o componente consiga evitar layout shift.
O next/image precisa sempre ter o tamanho das imagens e isso acontece de três formas:
- O tamanho é inferido automaticamente pelo
next/imagequando uma imagem é importada de forma estática. - O tamanho deverá ser informado manualmente através das propriedades
widtheheight - O tamanho é inferido implicitamente quando você usa a prop
fill- o que causa que a imagem seja expandida para completar o elemento pai
Mais infos sobre tamanho de imagens aqui.
Exercício - Migrando imagens para next/image
O exercício aqui é simples. Precisamos fazer com que todas as imagens de nossa aplicação sejam servidas através do componente next/image.
Permitindo avif
Podemos configurar para que o next/image sirva imagens em avif ao invés de webp para mais otimização ainda. Para isso, vamos modificar nossas configurações do arquivo next.config.mjs:
/** @type {import('next').NextConfig} */const nextConfig = { images: { formats: ['image/avif', 'image/webp'], }};
export default nextConfig;