Optimización de Imágenes con Next.js: Uso de Next.Image
Resumen
¿Cómo optimizar imágenes en Next.js con Next Image?
El desarrollo web enfrenta múltiples desafíos y uno de los más comunes es la optimización de imágenes. Por ello, Next.js nos ofrece un recurso invaluable: el componente Next Image. ¿Por qué es crucial? Porque mejora el rendimiento de nuestra página web al controlar las Core Web Vitals, en concreto el Largest Contentful Paint (LCP). En este artículo exploramos cómo implementar Next Image y sacarle el máximo partido.
¿Qué es el componente Next Image?
Next Image es una herramienta poderosa de Next.js diseñada para optimizar imágenes automáticamente. Proporciona múltiples características, como la carga diferida (lazy loading), la compresión de calidad y el ajuste de dimensiones que ayudan a mejorar el rendimiento y la experiencia del usuario.
Implementación básica de Next Image
Para comenzar, primero debemos reemplazar nuestras etiquetas de imagen normales con el componente Next Image. Aquí tienes una guía básica para hacerlo:
importImagefrom'next/image';functionMyComponent(){return(<Imagesrc="/path/to/image.jpg"alt="Descripción de la imagen"width={500}height={300}/>);}
¿Por qué usar width y height?
Una buena práctica al usar Next Image es especificar siempre las propiedades width y height. No solo mejora el LCP controlando las dimensiones de las imágenes, sino que también es obligatorio para evitar errores al desarrollar en Next.js. Así se asegura que las imágenes ocupen el espacio correcto desde el inicio, eliminando el "salto" visual.
¿Cómo funciona el lazy loading?
El componente Next Image aplica de manera automática la carga diferida, lo que implica que las imágenes se cargan lentamente mientras se desplaza hacia ellas. Sin embargo, si una imagen es crucial al inicio, podemos desactivar esta función estableciendo priority={true}.
Optimización de la calidad de imagen
Next.js permite ajustar la calidad de las imágenes. Por defecto, las imágenes se presentan al 75% de su calidad máxima. Si deseamos modificarla, simplemente ajustamos la propiedad quality:
<Imagesrc="/path/to/image.jpg"alt="Descripción de la imagen"width={500}height={300}quality={30}/>
Esto puede ser útil cuando necesitamos equilibrar la calidad visual con el tiempo de carga.
¿Cuándo cambiar el comportamiento del lazy loading?
En ocasiones, desactivar el lazy loading es recomendable, como en el caso de las imágenes principales que aparecerán inmediatamente al cargar la página. Sin embargo, hay que considerar su tamaño y cargar diferentemente las imágenes grandes para evitar retrasos.
Consejos prácticos al usar Next Image
Imágenes grandes y principales: Desactiva el lazy loading manteniendo la prioridad en false si son esenciales al cargar.
Sitios con muchas imágenes: Aprovecha la carga diferida para mejorar la eficiencia del sitio.
Compresión y calidad: Experimenta con la calidad para encontrar el equilibrio perfecto entre apariencia y velocidad.
En resumen, Next Image ofrece una manera excepcional de optimizar imágenes en Next.js, proporcionando una mejora significativa en la usabilidad y rendimiento del sitio. Sigue aprendiendo y experimenta con estas configuraciones para descubrir cómo mejorar aún más la experiencia del usuario en tus proyectos web.
PEqueño detalle; la documentación de Next dice lo siguiente sobre priority
***"***When true, the image will be considered high priority and preload. Lazy loading is automatically disabled for images using priority.
You should use the priority property on any image detected as the Largest Contentful Paint (LCP)element. It may be appropriate to have multiple priority images, as different images may be the LCP element for different viewport sizes.
Should only be used when the image is visible above the fold. Defaults to false."
Así que para desactivar el lazyloading hay que poner priority en true, no false
100%
Exacto
si quieren meter imagenes desde algun otro lugar como pexels o flowbite images: { remotePatterns: [ { protocol: "https", hostname: "images.pexels.com", },
{ protocol: "https", hostname: "flowbite.s3.amazonaws.com", }, ], },
tienen que colocar esto en su archivo next.config.js
La anterior clase dejo recursos los cuales llevan al repositorio del proyecto. Ahi puedes encontrar los estilos.
Si, yo tambien estoy en contra de que agreguen cosas detras de camara asi no sean directamente tema del curso.
Se puede insertar .svg en el componente de next image?
Una alternativa un poco menos dolorosa de animaciones condicionales es Framer-motion, tengan en cuenta que al ser un client-side tienen que hacer una mini modificacion al proyecto
En la carpeta home > crean una que se llame MotionDiv y dentro de la misma > MotionDiv.tsx
Alli agregan el siguiente código
"use client"
import {motion} from "framer-motion"
export const MotionDiv = motion.div;
Una vez crean este componente, no es mas que importarlo, reemplazando el div padre de la imagen y agregar una constante de variable
Intente aplicar esto a mi proyecto personal, pero hay unas cosas donde en vez de beneficiarme me afectaron, lo principal es el responsive aun cuando pongo la etiqueta layout+"responsive" no se acoplaba de la mejor manera, y luego encontre esto:
al parecer se volvió a actualizar esa etiqueta y agregaron más modificaciones.
¿Qué pasa si quieres tener diferentes tamaños de imagen según el viewport? se puede definir en el archivo cls, pero va a prevalecer el estilo definido en la etiqueta :S
Según la documentación:
Since Next.js does not have access to remote files during the build process, you'll need to provide the width, height and optional blurDataURL props manually.
The width and height attributes are used to infer the correct aspect ratio of image and avoid layout shift from the image loading in. The width and height do not determine the rendered size of the image file.
Si sobre escribes estas dimensiones en tu archivo estilos (css o sass), tomará éstos útlimos, no los de la etiqueta.