Importe imagens dinamicamente
Imagens locais devem ser importadas em arquivos .astro para serem exibidas. Em algumas situações, pode ser necessário ou desejado importar dinamicamente os caminhos das imagens em vez de importar cada imagem individualmente.
Nesta receita, você aprenderá como importar imagens dinamicamente usando a função import.meta.glob do Vite. Você criará um componente de cartão que exibe o nome, idade e foto de uma pessoa.
Receita
Seção intitulada Receita-
Crie uma nova pasta
assetsdentro do diretóriosrce adicione suas imagens dentro dessa nova pasta.Directorysrc/
Directoryassets/
- avatar-1.jpg
- avatar-2.png
- avatar-3.jpeg
assetsé uma convenção de nome de pasta popular para colocar imagens, mas você pode nomear a pasta como quiser. -
Crie um novo componente Astro para o cartão e importe o componente
<Image />.src/components/MyCustomCardComponent.astro ---import { Image } from 'astro:assets';--- -
Especifique as
propsque o componente receberá para exibir as informações necessárias em cada cartão. Opcionalmente, você pode definir seus tipos se estiver usando TypeScript em seu projeto.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;--- -
Crie uma nova variável
imagese use a funçãoimport.meta.globque retorna um objeto com todos os caminhos de imagens dentro da pastaassets. Você também precisará importar o tipoImageMetadatapara ajudar a definir o tipo da variávelimages.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}')--- -
Use as props para criar a marcação do seu componente de cartão.
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> -
No atributo
src, passe o objetoimagese use notação de colchetes para o caminho da imagem. Certifique-se de invocar a função glob.Como você está acessando o objeto
imagesque possui um tipo desconhecido, é recomendado lançar (throw) um erro caso um caminho de arquivo inválido seja passado como 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}" não existe no glob: "src/assets/*.{jpeg,jpg,png,gif}"`);---<div class="card"><h2>{name}</h2><p>Idade: {age}</p><Image src={images[imagePath]()} alt={altText} /></div>imagesé um objeto que contém todos os caminhos de imagens dentro da pastaassets.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')}A propriedade
imagePathé uma string que contém o caminho da imagem que você quer exibir. Oimport.meta.glob()faz o trabalho de encontrar o caminho da imagem que corresponde à propimagePathe realiza a importação para você. -
Importe e use o componente do cartão em uma página Astro, passando os valores para as
props.src/pages/index.astro ---import MyCustomCardComponent from '../components/MyCustomCardComponent.astro';---<MyCustomCardComponentimagePath="/src/assets/avatar-1.jpg"altText="Uma foto de Priya com fundo de parede de tijolos."name="Priya"age={25}/>