Image
El componente Image de Next.js extiende el elemento HTML <img>
para la optimización automática de imágenes.
Referencia
Props
Las siguientes props están disponibles:
Prop | Ejemplo | Tipo | Estado |
---|---|---|---|
src | src="/profile.png" | String | Requerido |
alt | alt="Foto del autor" | String | Requerido |
width | width={500} | Integer (px) | - |
height | height={500} | Integer (px) | - |
fill | fill={true} | Boolean | - |
loader | loader={imageLoader} | Function | - |
sizes | sizes="(max-width: 768px) 100vw, 33vw" | String | - |
quality | quality={80} | Integer (1-100) | - |
priority | priority={true} | Boolean | - |
placeholder | placeholder="blur" | String | - |
style | style={{objectFit: "contain"}} | Object | - |
onLoadingComplete | onLoadingComplete={img => done())} | Function | Obsoleto |
onLoad | onLoad={event => done())} | Function | - |
onError | onError(event => fail()} | Function | - |
loading | loading="lazy" | String | - |
blurDataURL | blurDataURL="data:image/jpeg..." | String | - |
overrideSrc | overrideSrc="/seo.png" | String | - |
src
La fuente de la imagen. Puede ser una de las siguientes:
Una ruta interna como string.
Una URL externa absoluta (debe estar configurada con remotePatterns).
Una importación estática.
alt
La propiedad alt
se utiliza para describir la imagen para lectores de pantalla y motores de búsqueda. También es el texto de respaldo si las imágenes están deshabilitadas o ocurre un error al cargar la imagen.
Debe contener texto que pueda reemplazar la imagen sin cambiar el significado de la página. No está destinado a complementar la imagen y no debe repetir información que ya se proporcione en los subtítulos arriba o abajo de la imagen.
Si la imagen es puramente decorativa o no está destinada al usuario, la propiedad alt
debe ser un string vacío (alt=""
).
Aprende más sobre pautas de accesibilidad de imágenes.
width
y height
Las propiedades width
y height
representan el tamaño intrínseco de la imagen en píxeles. Esta propiedad se utiliza para inferir la proporción de aspecto correcta utilizada por los navegadores para reservar espacio para la imagen y evitar cambios de diseño durante la carga. No determina el tamaño renderizado de la imagen, que se controla mediante CSS.
Debes establecer ambas propiedades width
y height
a menos que:
- La imagen sea importada estáticamente
- La imagen tenga la propiedad
fill
Si no se conocen la altura y el ancho, recomendamos usar la propiedad fill
.
fill
Un booleano que hace que la imagen se expanda al tamaño del elemento padre.
Posicionamiento:
- El elemento padre debe asignar
position: "relative"
,"fixed"
,"absolute"
. - Por defecto, el elemento
<img>
usaposition: "absolute"
.
Ajuste del objeto:
Si no se aplican estilos a la imagen, esta se estirará para ajustarse al contenedor. Puedes usar objectFit
para controlar el recorte y la escala.
"contain"
: La imagen se reducirá para ajustarse al contenedor y preservar la proporción de aspecto."cover"
: La imagen llenará el contenedor y será recortada.
Aprende más sobre
position
yobject-fit
.
loader
Una función personalizada utilizada para generar la URL de la imagen. La función recibe los siguientes parámetros y devuelve un string de URL para la imagen:
Es bueno saberlo: Usar props como
onLoad
, que aceptan una función, requiere usar Componentes de Cliente para serializar la función proporcionada.
Alternativamente, puedes usar la configuración loaderFile en next.config.js
para configurar cada instancia de next/image
en tu aplicación, sin pasar una prop.
sizes
Define los tamaños de la imagen en diferentes puntos de interrupción. Utilizado por el navegador para elegir el tamaño más apropiado del srcset
generado.
sizes
debe usarse cuando:
- La imagen usa la propiedad
fill
- Se usa CSS para hacer la imagen responsiva
Si falta sizes
, el navegador asume que la imagen será tan ancha como la ventana gráfica (100vw
). Esto puede hacer que se descarguen imágenes innecesariamente grandes.
Además, sizes
afecta cómo se genera srcset
:
- Sin
sizes
: Next.js genera unsrcset
limitado (ej. 1x, 2x), adecuado para imágenes de tamaño fijo. - Con
sizes
: Next.js genera unsrcset
completo (ej. 640w, 750w, etc.), optimizado para diseños responsivos.
quality
Un entero entre 1
y 100
que establece la calidad de la imagen optimizada. Valores más altos aumentan el tamaño del archivo y la fidelidad visual. Valores más bajos reducen el tamaño del archivo pero pueden afectar la nitidez.
Si has configurado qualities en next.config.js
, el valor debe coincidir con una de las entradas permitidas.
Es bueno saberlo: Si la imagen original ya es de baja calidad, establecer un valor de calidad alto aumentará el tamaño del archivo sin mejorar la apariencia.
style
Permite pasar estilos CSS al elemento de imagen subyacente.
Es bueno saberlo: Si usas la prop
style
para establecer un ancho personalizado, asegúrate de también establecerheight: 'auto'
para preservar la proporción de aspecto de la imagen.
priority
Un booleano que indica si la imagen debe ser precargada.
true
: Precarga la imagen. Desactiva la carga diferida.false
: Carga la imagen de forma diferida.
Cuándo usarlo:
- La imagen está arriba del pliegue.
- La imagen es el elemento Largest Contentful Paint (LCP).
- Quieres mejorar el rendimiento de carga inicial de tu página.
Cuándo no usarlo:
- Cuando se usa la prop
loading
(generará advertencias).
loading
Controla cuándo debe comenzar a cargarse la imagen.
lazy
: Diferir la carga de la imagen hasta que alcance una distancia calculada desde la ventana gráfica.eager
: Cargar la imagen inmediatamente, independientemente de su posición en la página.
Usa eager
solo cuando quieras asegurarte de que la imagen se cargue inmediatamente.
Aprende más sobre el atributo
loading
.
placeholder
Especifica un marcador de posición para usar mientras se carga la imagen, mejorando el rendimiento de carga percibido.
empty
: Sin marcador de posición mientras se carga la imagen.blur
: Usa una versión difuminada de la imagen como marcador de posición. Debe usarse con la propiedadblurDataURL
.data:image/...
: Usa la URL de datos como marcador de posición.
Ejemplos:
- Marcador de posición
blur
- Efecto de brillo con prop
placeholder
de URL de datos - Efecto de color con prop
blurDataURL
Aprende más sobre el atributo
placeholder
.
blurDataURL
Una URL de datos para usar como imagen de marcador de posición antes de que la imagen se cargue correctamente. Puede configurarse automáticamente o usarse con la propiedad placeholder="blur"
.
La imagen se amplía y difumina automáticamente, por lo que se recomienda una imagen muy pequeña (10px o menos).
Automático
Si src
es una importación estática de un archivo jpg
, png
, webp
o avif
, blurDataURL
se agrega automáticamente, a menos que la imagen esté animada.
Configuración manual
Si la imagen es dinámica o remota, debes proporcionar blurDataURL
tú mismo. Para generar una, puedes usar:
Una blurDataURL grande puede afectar el rendimiento. Mantenla pequeña y simple.
Ejemplos:
onLoad
Una función de callback que se invoca una vez que la imagen se carga completamente y se ha eliminado el marcador de posición.
La función de callback se llamará con un argumento, el evento que tiene un target
que referencia el elemento <img>
subyacente.
Es bueno saberlo: Usar props como
onLoad
, que aceptan una función, requiere usar Componentes de Cliente para serializar la función proporcionada.
onError
Una función de callback que se invoca si la imagen no se carga.
Es bueno saberlo: Usar props como
onError
, que aceptan una función, requiere usar Componentes de Cliente para serializar la función proporcionada.
unoptimized
Un booleano que indica si la imagen debe optimizarse. Esto es útil para imágenes que no se benefician de la optimización, como imágenes pequeñas (menos de 1KB), imágenes vectoriales (SVG) o imágenes animadas (GIF).
true
: La imagen fuente se servirá tal cual desdesrc
en lugar de cambiar calidad, tamaño o formato.false
: La imagen fuente se optimizará.
Desde Next.js 12.3.0, esta prop puede asignarse a todas las imágenes actualizando next.config.js
con la siguiente configuración:
overrideSrc
Cuando se proporciona la prop src
al componente <Image>
, tanto el atributo srcset
como src
se generan automáticamente para el <img>
resultante.
En algunos casos, no es deseable que se genere el atributo src
y es posible que desees anularlo usando la prop overrideSrc
.
Por ejemplo, al actualizar un sitio web existente de <img>
a <Image>
, es posible que desees mantener el mismo atributo src
para fines de SEO, como clasificación de imágenes o evitar un nuevo rastreo.
decoding
Una sugerencia al navegador que indica si debe esperar a que la imagen se decodifique antes de presentar otras actualizaciones de contenido o no.
async
: Decodifica la imagen de forma asíncrona y permite que otros contenidos se rendericen antes de que se complete.sync
: Decodifica la imagen de forma síncrona para una presentación atómica con otros contenidos.auto
: Sin preferencia. El navegador elige el mejor enfoque.
Aprende más sobre el atributo
decoding
.
Otras Props
Otras propiedades en el componente <Image />
se pasarán al elemento img
subyacente con la excepción de las siguientes:
srcSet
: Usa Device Sizes en su lugar.
Props obsoletas
onLoadingComplete
Advertencia: Obsoleto en Next.js 14, utiliza
onLoad
en su lugar.
Una función de callback que se invoca una vez que la imagen se ha cargado completamente y el placeholder ha sido eliminado.
La función de callback se llamará con un argumento, una referencia al elemento <img>
subyacente.
Bueno saber: Usar props como
onLoadingComplete
, que aceptan una función, requiere usar Client Components para serializar la función proporcionada.
Opciones de configuración
Puedes configurar el Componente Image en next.config.js
. Las siguientes opciones están disponibles:
localPatterns
Usa localPatterns
en tu archivo next.config.js
para permitir que imágenes de rutas locales específicas sean optimizadas y bloquear todas las demás.
El ejemplo anterior asegurará que la propiedad src
de next/image
debe comenzar con /assets/images/
y no debe tener una cadena de consulta. Intentar optimizar cualquier otra ruta responderá con un error 400
Bad Request.
remotePatterns
Usa remotePatterns
en tu archivo next.config.js
para permitir imágenes de rutas externas específicas y bloquear todas las demás. Esto asegura que solo se sirvan imágenes externas de tu cuenta.
Si usas una versión anterior a 15.3.0, puedes configurar remotePatterns
usando el objeto:
El ejemplo anterior asegurará que la propiedad src
de next/image
debe comenzar con https://example.com/account123/
y no debe tener una cadena de consulta. Cualquier otro protocolo, hostname, puerto o ruta no coincidente responderá con un error 400
Bad Request.
Patrones Wildcard:
Los patrones wildcard pueden usarse tanto para pathname
como para hostname
y tienen la siguiente sintaxis:
*
coincide con un solo segmento de ruta o subdominio**
coincide con cualquier número de segmentos de ruta al final o subdominios al principio. Esta sintaxis no funciona en medio del patrón.
Esto permite subdominios como image.example.com
. Las cadenas de consulta y puertos personalizados siguen bloqueados.
Bueno saber: Cuando omites
protocol
,port
,pathname
osearch
, entonces se implica el wildcard**
. Esto no se recomienda porque puede permitir que actores maliciosos optimicen URLs que no tenías intención de permitir.
Cadenas de consulta:
También puedes restringir cadenas de consulta usando la propiedad search
:
El ejemplo anterior asegurará que la propiedad src
de next/image
debe comenzar con https://assets.example.com
y debe tener exactamente la cadena de consulta ?v=1727111025337
. Cualquier otro protocolo o cadena de consulta responderá con un error 400
Bad Request.
loaderFile
loaderFiles
te permite usar un servicio personalizado de optimización de imágenes en lugar de Next.js.
La ruta debe ser relativa a la raíz del proyecto. El archivo debe exportar una función por defecto que devuelva una cadena de URL:
Ejemplo:
Alternativamente, puedes usar la prop
loader
para configurar cada instancia denext/image
.
deviceSizes
deviceSizes
te permite especificar una lista de puntos de interrupción de ancho de dispositivo. Estos anchos se usan cuando el componente next/image
usa la prop sizes
para asegurar que se sirva la imagen correcta para el dispositivo del usuario.
Si no se proporciona configuración, se usa el siguiente valor por defecto:
imageSizes
imageSizes
te permite especificar una lista de anchos de imagen. Estos anchos se concatenan con el array de device sizes para formar el array completo de tamaños usados para generar el srcset de la imagen.
Si no se proporciona configuración, se usa el siguiente valor por defecto:
imageSizes
solo se usa para imágenes que proporcionan una prop sizes
, lo que indica que la imagen es menor que el ancho completo de la pantalla. Por lo tanto, los tamaños en imageSizes
deben ser todos menores que el tamaño más pequeño en deviceSizes
.
qualities
qualities
te permite especificar una lista de valores de calidad de imagen.
En el ejemplo anterior, solo se permiten tres calidades: 25, 50 y 75. Si la prop quality
no coincide con un valor en este array, la imagen fallará con un error 400
Bad Request.
formats
formats
te permite especificar una lista de formatos de imagen a usar.
Next.js detecta automáticamente los formatos de imagen soportados por el navegador a través de la cabecera Accept
de la solicitud para determinar el mejor formato de salida.
Si la cabecera Accept
coincide con más de uno de los formatos configurados, se usa la primera coincidencia en el array. Por lo tanto, el orden del array importa. Si no hay coincidencia (o la imagen fuente está animada), se usará el formato original de la imagen.
Puedes habilitar soporte para AVIF, que volverá al formato original de la imagen src si el navegador no soporta AVIF:
Bueno saber:
- Todavía recomendamos usar WebP para la mayoría de los casos de uso.
- AVIF generalmente tarda un 50% más en codificarse pero comprime un 20% más pequeño comparado con WebP. Esto significa que la primera vez que se solicita una imagen, normalmente será más lenta, pero las solicitudes posteriores que están en caché serán más rápidas.
- Si autoalojas con un Proxy/CDN delante de Next.js, debes configurar el Proxy para reenviar la cabecera
Accept
.
minimumCacheTTL
minimumCacheTTL
te permite configurar el Time to Live (TTL) en segundos para imágenes optimizadas en caché. En muchos casos, es mejor usar una Static Image Import que automáticamente hashear el contenido del archivo y cachear la imagen para siempre con una cabecera Cache-Control
de immutable
.
Si no se proporciona configuración, se usa el siguiente valor por defecto.
Puedes aumentar el TTL para reducir el número de revalidaciones y potencialmente reducir costos:
La expiración (o más bien Max Age) de la imagen optimizada se define por el minimumCacheTTL
o la cabecera Cache-Control
de la imagen upstream, lo que sea mayor.
Si necesitas cambiar el comportamiento de caché por imagen, puedes configurar headers
para establecer la cabecera Cache-Control
en la imagen upstream (ej. /some-asset.jpg
, no en /_next/image
mismo).
No hay un mecanismo para invalidar la caché en este momento, así que es mejor mantener minimumCacheTTL
bajo. De lo contrario, puede que necesites cambiar manualmente la prop src
o eliminar el archivo en caché <distDir>/cache/images
.
disableStaticImages
disableStaticImages
te permite desactivar las importaciones de imágenes estáticas.
El comportamiento por defecto te permite importar archivos estáticos como import icon from './icon.png'
y luego pasar eso a la propiedad src
. En algunos casos, puede que desees desactivar esta característica si entra en conflicto con otros plugins que esperan que la importación se comporte de manera diferente.
Puedes desactivar las importaciones de imágenes estáticas dentro de tu next.config.js
:
dangerouslyAllowSVG
dangerouslyAllowSVG
te permite servir imágenes SVG.
Por defecto, Next.js no optimiza imágenes SVG por algunas razones:
- SVG es un formato vectorial, lo que significa que puede redimensionarse sin pérdida.
- SVG tiene muchas de las mismas características que HTML/CSS, lo que puede llevar a vulnerabilidades sin las cabeceras adecuadas de Content Security Policy (CSP).
Recomendamos usar la prop unoptimized
cuando la prop src
se sabe que es SVG. Esto sucede automáticamente cuando src
termina con ".svg"
.
Además, se recomienda encarecidamente configurar también contentDispositionType
para forzar al navegador a descargar la imagen, así como contentSecurityPolicy
para evitar que los scripts incrustados en la imagen se ejecuten.
contentDispositionType
contentDispositionType
te permite configurar la cabecera Content-Disposition
.
Por defecto, el loader establece la cabecera Content-Disposition
en attachment
para mayor protección ya que la API puede servir imágenes remotas arbitrarias.
El valor por defecto es attachment
que fuerza al navegador a descargar la imagen al visitarla directamente. Esto es particularmente importante cuando dangerouslyAllowSVG
es true.
Opcionalmente puedes configurar inline
para permitir que el navegador renderice la imagen al visitarla directamente, sin descargarla.
Opciones de configuración obsoletas
domains
Advertencia: Obsoleto desde Next.js 14 en favor de
remotePatterns
estrictos para proteger tu aplicación de usuarios maliciosos. Solo usadomains
si eres dueño de todo el contenido servido desde el dominio.
Similar a remotePatterns
, la configuración domains
puede usarse para proporcionar una lista de hostnames permitidos para imágenes externas. Sin embargo, la configuración domains
no soporta coincidencia de patrones wildcard y no puede restringir protocolo, puerto o pathname.
A continuación se muestra un ejemplo de la propiedad domains
en el archivo next.config.js
:
Funciones
getImageProps
La función getImageProps
puede usarse para obtener las props que se pasarían al elemento <img>
subyacente, y en su lugar pasarlas a otro componente, estilo, canvas, etc.
Esto también evita llamar a useState()
de React, lo que puede llevar a un mejor rendimiento, pero no puede usarse con la prop placeholder
porque el placeholder nunca se eliminará.
Errores conocidos del navegador
El componente next/image
usa lazy loading nativo del navegador, que puede volver a eager loading para navegadores más antiguos antes de Safari 15.4. Cuando se usa el placeholder blur-up, navegadores más antiguos antes de Safari 12 volverán a un placeholder vacío. Cuando se usan estilos con width
/height
de auto
, es posible causar Layout Shift en navegadores más antiguos antes de Safari 15 que no preservan la relación de aspecto. Para más detalles, ver este video de MDN.
-
Safari 15 - 16.3 muestra un borde gris mientras carga. Safari 16.4 solucionó este problema. Posibles soluciones:
- Usar CSS
@supports (font: -apple-system-body) and (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }
- Usar
priority
si la imagen está above the fold
- Usar CSS
-
Firefox 67+ muestra un fondo blanco mientras carga. Posibles soluciones:
- Habilitar
formats
AVIF - Usar
placeholder
- Habilitar
Ejemplos
Estilizando imágenes
Estilizar el componente Image es similar a estilizar un elemento <img>
normal, pero hay algunas pautas a tener en cuenta:
Usa className
o style
, no styled-jsx
. En la mayoría de los casos, recomendamos usar la prop className
. Esto puede ser un CSS Module importado, una hoja de estilos global, etc.
También puedes usar la prop style
para asignar estilos en línea.
Cuando uses fill
, el elemento padre debe tener position: relative
o display: block
. Esto es necesario para el renderizado correcto del elemento de imagen en ese modo de diseño.
No puedes usar styled-jsx porque está limitado al componente actual (a menos que marques el estilo como global
).
Imágenes responsivas con una exportación estática
Cuando importas una imagen estática, Next.js establece automáticamente su ancho y alto basándose en el archivo. Puedes hacer que la imagen sea responsiva configurando el estilo:

Imágenes responsivas con una URL remota
Si la imagen de origen es una URL dinámica o remota, debes proporcionar las propiedades width
y height
para que Next.js pueda calcular la relación de aspecto:
Pruébalo:
Imagen responsiva con fill
Si no conoces la relación de aspecto de la imagen, puedes añadir la propiedad fill
con la propiedad objectFit
configurada como cover
. Esto hará que la imagen llene todo el ancho de su contenedor padre.

Imagen de fondo
Usa la propiedad fill
para que la imagen cubra toda el área de la pantalla:

Para ejemplos del componente Image usado con varios estilos, consulta la Demostración del Componente Image.
Imágenes remotas
Para usar una imagen remota, la propiedad src
debe ser una cadena URL.
Dado que Next.js no tiene acceso a archivos remotos durante el proceso de construcción, deberás proporcionar manualmente las propiedades width
, height
y opcionalmente blurDataURL
.
Los atributos width
y height
se usan para inferir la relación de aspecto correcta de la imagen y evitar cambios de diseño al cargar la imagen. El width
y height
no determinan el tamaño renderizado del archivo de imagen.
Para permitir de forma segura la optimización de imágenes, define una lista de patrones de URL soportados en next.config.js
. Sé lo más específico posible para evitar usos maliciosos. Por ejemplo, la siguiente configuración solo permitirá imágenes de un bucket específico de AWS S3:
Detección de tema
Si deseas mostrar una imagen diferente para modo claro y oscuro, puedes crear un nuevo componente que envuelva dos componentes <Image>
y muestre el correcto basado en una consulta CSS de medios.
Nota importante: El comportamiento predeterminado de
loading="lazy"
asegura que solo se cargue la imagen correcta. No puedes usarpriority
oloading="eager"
porque eso haría que ambas imágenes se carguen. En su lugar, puedes usarfetchPriority="high"
.
Pruébalo:
Dirección de arte
Si deseas mostrar una imagen diferente para móvil y escritorio, a veces llamado Dirección de Arte, puedes proporcionar diferentes propiedades src
, width
, height
y quality
a getImageProps()
.
Fondo CSS
Incluso puedes convertir la cadena srcSet
a la función CSS image-set()
para optimizar una imagen de fondo.
Historial de Versiones
Versión | Cambios |
---|---|
v15.3.0 | Se añadió soporte para arrays de objetos URL en remotePatterns . |
v15.0.0 | El valor por defecto de la configuración contentDispositionType cambió a attachment . |
v14.2.23 | Se añadió la configuración qualities . |
v14.2.15 | Se añadió la propiedad decoding y la configuración localPatterns . |
v14.2.14 | Se añadió la propiedad remotePatterns.search . |
v14.2.0 | Se añadió la propiedad overrideSrc . |
v14.1.0 | getImageProps() es estable. |
v14.0.0 | La propiedad onLoadingComplete y la configuración domains quedaron obsoletas. |
v13.4.14 | Soporte para data:/image... en la propiedad placeholder . |
v13.2.0 | Se añadió la configuración contentDispositionType . |
v13.0.6 | Se añadió la propiedad ref . |
v13.0.0 | La importación next/image se renombró a next/legacy/image . La importación next/future/image se renombró a next/image . Hay disponible un codemod para renombrar automáticamente las importaciones. Se eliminó el envoltorio <span> . Se eliminaron las propiedades layout , objectFit , objectPosition , lazyBoundary , lazyRoot . alt es obligatorio. onLoadingComplete recibe referencia al elemento img . Se eliminó la configuración del loader integrado. |
v12.3.0 | Las configuraciones remotePatterns y unoptimized son estables. |
v12.2.0 | Se añadieron experimentalmente remotePatterns y la configuración unoptimized . Se eliminó layout="raw" . |
v12.1.1 | Se añadió la propiedad style . Soporte experimental para layout="raw" . |
v12.1.0 | Se añadieron las configuraciones dangerouslyAllowSVG y contentSecurityPolicy . |
v12.0.9 | Se añadió la propiedad lazyRoot . |
v12.0.0 | Se añadió la configuración formats .Se añadió soporte para AVIF. El envoltorio <div> cambió a <span> . |
v11.1.0 | Se añadieron las propiedades onLoadingComplete y lazyBoundary . |
v11.0.0 | Soporte para importación estática en la propiedad src .Se añadió la propiedad placeholder .Se añadió la propiedad blurDataURL . |
v10.0.5 | Se añadió la propiedad loader . |
v10.0.1 | Se añadió la propiedad layout . |
v10.0.0 | Se introdujo next/image . |