Importa imágenes dinámicamente
Las Imágenes locales deben ser importadas en archivos .astro para poder mostrarlas. Habrá momentos en los que querrás o necesitarás importar dinámicamente las rutas de tus imágenes en lugar de importar explícitamente cada imagen individual.
En esta receta, aprenderás a importar dinámicamente tus imágenes usando la función import.meta.glob de Vite. Construirás un componente de tarjeta que muestra el nombre, la edad y la foto de una persona.
- Crea un nuevo directorio
assetsdentro del directoriosrcy agrega tus imágenes dentro de ese nuevo directorio.
Directoriosrc/
Directorioassets/
- avatar-1.jpg
- avatar-2.png
- avatar-3.jpeg
-
Crea un nuevo componente de Astro para tu tarjeta e importa el componente
<Image />.src/components/MyCustomCardComponent.astro ---import { Image } from 'astro:assets';--- -
Especifica las
propsque recibirá tu componente para mostrar la información necesaria en cada tarjeta. Opcionalmente puedes definir sus tipos, si estás usando TypeScript en tu proyecto.src/components/MyCustomCardComponent.astro ---import { Image } from 'astro:assets';interface Props {imagePath: string;altText: string;name: string;age: number;}const { imagePath, altText, name, age } = Astro.props;--- -
Crea una nueva variable
imagesy usa la funciónimport.meta.globque devuelve un objeto con todas las rutas de las imágenes dentro de la carpetaassets. También necesitarás importar el tipoImageMetadatapara definir el tipo de la variableimages.src/components/MyCustomCardComponent.astro ---import type { ImageMetadata } from 'astro';import { Image } from 'astro:assets';interface Props {imagePath: string;altText: string;name: string;age: number;}const { imagePath, altText, name, age } = Astro.props;const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/*.{jpeg,jpg,png,gif}')--- -
Usa las
propspara crear el marcado de tu componente de tarjeta.
---import type { ImageMetadata } from 'astro';import { Image } from 'astro:assets';
interface Props { imagePath: string; altText: string; name: string; age: number;}
const { imagePath, altText, name, age } = Astro.props;const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/*.{jpeg,jpg,png,gif}');---<div class="card"> <h2>{name}</h2> <p>Age: {age}</p> <Image src={} alt={altText} /></div>- Dentro del atributo
src, pasa el objetoimagesy usa la notación de corchetes para la ruta de la imagen. Luego asegúrate de invocar la función glob. Dado que estás accediendo al objetoimagesque tiene un tipo desconocido, también deberías arrojarthrowun error en caso de que se pase una ruta de archivo inválida como prop.
---import type { ImageMetadata } from 'astro';import { Image } from 'astro:assets';
interface Props { imagePath: string; altText: string; name: string; age: number;}
const { imagePath, altText, name, age } = Astro.props;const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/*.{jpeg,jpg,png,gif}');if (!images[imagePath]) throw new Error(`"${imagePath}" does not exist in glob: "src/assets/*.{jpeg,jpg,png,gif}"`);---<div class="card"> <h2>{name}</h2> <p>Edad: {age}</p> <Image src={images[imagePath]()} alt={altText} /></div>-
Importa y usa el componente de tarjeta dentro de una página de Astro, pasando los valores de las
props.src/pages/index.astro ---import MyCustomCardComponent from '../components/MyCustomCardComponent.astro';---<MyCustomCardComponentimagePath="/src/assets/avatar-1.jpg"altText="Un retrato de Priya sobre un fondo de ladrillo."name="Priya"age={25}/>