Site cover image
Post title iconAstrojs Imageコンポーネントで動的に画像を読み込む

Post title icon in a page linkArrow icon of a page linkAstrojs assetsを使ってスクリーンサイズに最適化した画像をWebP形式で配信する で説明した通り、AstroのImageコンポーネントは画像を簡単に最適化することができ便利です。

Imageコンポーネントは画像ファイルの動的インポートにも対応しており、何らかのデータに基づいて画像を出し分けるということが可能です。

この記事では、AstrojsのImageコンポーネントで画像ファイルを動的に読み込む方法を解説します。

画像ファイルは次のように src/assets/ 以下に配置されているとします。

src/
  assets/
    avatar-1.jpg
    avatar-2.png
    avatar-3.jpeg

下記のAstroコンポーネントは画像パスを受け取るようにしておくことで、コンポーネントの呼び出し側から動的に画像を切り替えることができるようになっています。

画像ファイルを動的に読み込むには下記のように import.meta.glob() にパスパターンを渡すことで、画像への参照を持ったオブジェクトを得ます。

---
import type { ImageMetadata } from 'astro';
import { Image } from 'astro:assets';

interface Props {
   imagePath: string;
   altText: string;
}

const { imagePath, altText } = 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}"`);
}
---

<Image src={images[imagePath]()} alt={altText} />

ここで images は下記のようなオブジェクトになっています。

const images = {
  '/src/assets/avatar-1.jpg': () => import('./assets/avatar-1.jpg'),
  '/src/assets/avatar-2.png': () => import('./assets/avatar-2.png'),
  '/src/assets/avatar-3.jpeg': () => import('./assets/avatar-3.jpeg')
}

得られたオブジェクトを通常と同じようにImageコンポーネントの src プロパティに渡すと画像を動的に表示することができます。

images オブジェクトの値は関数オブジェクトであるため images[imagePath]() のように () をつけて関数呼び出しが必要なことを忘れないようにしてください。

詳細は下記の公式ドキュメントをご覧ください。

以上です。この記事では、AstrojsのImageコンポーネントで画像ファイルを動的に読み込む方法を解説しました。


💕
記事が参考になったら少額を寄付いただけると励みになります。
Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます