Importer dynamiquement des images
Les images locales doivent être importées dans les fichiers .astro afin de les afficher. Il y aura des moments où vous voudrez ou devrez importer dynamiquement les chemins de vos images au lieu d’importer explicitement chaque image individuelle.
Dans cette recette, vous apprendrez à importer dynamiquement vos images en utilisant la fonction import.meta.glob de Vite. Vous allez construire un composant de carte qui affiche le nom, l’âge et la photo d’une personne.
Recette
Titre de la section Recette-
Créez un nouveau dossier
assetssous le répertoiresrcet ajoutez vos images dans ce nouveau dossier.Répertoiresrc/
Répertoireassets/
- avatar-1.jpg
- avatar-2.png
- avatar-3.jpeg
assetsest une convention de nom de dossier populaire pour placer des images, mais vous êtes libre de nommer le dossier comme vous le souhaitez. -
Créez un nouveau composant Astro pour votre carte et importez le composant
<Image />.src/components/MyCustomCardComponent.astro ---import { Image } from 'astro:assets';--- -
Spécifiez les
propsque votre composant recevra afin d’afficher les informations nécessaires sur chaque carte. Vous pouvez optionnellement définir leurs types, si vous utilisez TypeScript dans votre projet.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;--- -
Créez une nouvelle variable
imageset utilisez la fonctionimport.meta.globqui retourne un objet contenant tous les chemins d’accès aux images dans le dossierassets. Vous devrez également importer le typeImageMetadatapour vous aider à définir le type 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}')--- -
Utilisez les props pour créer le balisage de votre composant de carte.
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}');---<div class="card"><h2>{name}</h2><p>Age: {age}</p><Image src={} alt={altText} /></div> -
Dans l’attribut
src, passez l’objetimageset utilisez la notation entre crochets pour le chemin de l’image. Assurez-vous ensuite d’invoquer la fonction glob.Puisque vous accédez à l’objet
imagesqui a un type inconnu, vous devriez aussithrowune erreur dans le cas où un chemin de fichier invalide est passé en tant que prop.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}');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>Age: {age}</p><Image src={images[imagePath]()} alt={altText} /></div>imagesest un objet qui contient tous les chemins d’accès aux images dans le dossierassets.const images = {'./assets/avatar-1.jpg': () => import('./assets/avatar-1.jpg'),'./assets/avatar-2.png': () => import('./assets/avatar-2.png'),'./assets/avatar-3.jpeg': () => import('./assets/avatar-3.jpeg')}La propriété
imagePathest une chaîne de caractères qui contient le chemin de l’image que vous voulez afficher.import.meta.glob()se charge de trouver le chemin de l’image qui correspond à la propriétéimagePathet de gérer l’importation pour vous. -
Importer et utiliser le composant carte dans une page Astro, en passant les valeurs pour les
props.src/pages/index.astro ---import MyCustomCardComponent from '../components/MyCustomCardComponent.astro';---<MyCustomCardComponentimagePath="/src/assets/avatar-1.jpg"altText="Une photo de Priya sur fond de mur de briques."name="Priya"age={25}/>