Optimización Automática de Imágenes

Imágenes sin optimizar

Usando HTML regular, hemos añadido nuestra imagen Hero de la siguiente manera:

<img src="large-image.jpg" alt="Large Image" />

Sin embargo, esto significa que debemos optimizar manualmente aspectos como:

  • Asegurar que nuestra imagen sea responsiva en diferentes tamaños de pantalla.
  • Optimizar nuestras imágenes con herramientas o bibliotecas de terceros.
  • Carga diferida (lazy-loading) de imágenes cuando entran en el viewport.

El componente Image

Next.js proporciona un componente Image que puede manejar estas optimizaciones de forma automática.

next/image es una extensión del elemento img de HTML, evolucionado para la web moderna.

Esto significa que el redimensionamiento, optimización y entrega de imágenes en formatos modernos como WebP (cuando el navegador lo soporta) puede realizarse automáticamente usando next/image.

El componente evita enviar imágenes grandes a dispositivos con viewports pequeños y permite que Next.js adopte formatos de imagen futuros y los sirva a navegadores que los soporten.

La Optimización Automática de Imágenes funciona con cualquier fuente de imagen. Incluso si la imagen está alojada en una fuente de datos externa, como un CMS, aún puede optimizarse.

¿Cómo funciona la Optimización Automática de Imágenes?

Optimización bajo demanda

En lugar de optimizar imágenes en tiempo de compilación, Next.js optimiza imágenes bajo demanda según las solicitudes de los usuarios. A diferencia de generadores de sitios estáticos y soluciones estáticas, los tiempos de compilación no aumentan, ya sea que se envíen diez imágenes o diez millones.

Imágenes con carga diferida

Las imágenes se cargan de forma diferida por defecto. La velocidad de la página no se verá penalizada por imágenes fuera del viewport. Las imágenes solo se cargan cuando entran en la vista.

Evita CLS

Las imágenes siempre se renderizan para evitar Cambios Acumulativos de Diseño (CLS por sus siglas en inglés).

Usando el componente Image

Actualicemos la aplicación usando next/image para mostrar nuestra imagen hero. Las props height y width deben ser el tamaño de renderizado deseado, con una relación de aspecto idéntica a la imagen fuente.

Abre el archivo pages/index.js y añade una importación para Image desde next/image al inicio del archivo:

import Image from 'next/image';

Luego, reemplaza el hero img con el componente Image:

// Antes
<img src="large-image.jpg" alt="Large Image" />
 
// Después
<Image src="/large-image.jpg" alt="Large Image" width={3048} height={2024} />

También hay una imagen en el footer. Reemplacémosla también:

// Antes
<img src="/vercel.svg" alt="Vercel Logo" />
 
// Después
<Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />

Finalmente, ejecuta otro informe Lighthouse en Chrome DevTools y compara tus resultados.

Lecturas adicionales

On this page