AstroJS における画像ファイルの取り扱い説明書
1. はじめに
AstroJS では、デフォルトで画像処理ライブラリの Sharp が組み込まれており、同じく AstroJS にデフォルトで組み込まれている <Image>
コンポーネントを用いることで、画像を最適化してくれます。外部パッケージのインストールや設定なしで、最適化処理が行われるのはユーザーフレンドリーだと思います。その一方で、画像ファイルを読み込み際に、独特の お作法 が存在します。慣れないうちは、この お作法 のせいで頭を悩ませると思います。本記事では、AstroJS における画像ファイルの読み込み挙動について、可能な限り網羅的に解説したものになります。また、本記事は Node.js と Yarn がインストールされている前提で記述しています。
2. 検証環境
検証環境として、yarn create astro
で生成される blog テンプレートに、以下の画像ファイルを追加したものを使います。画像ファイルは、あくまでもサンプルなので、任意の画像ファイルで大丈夫です。
- public/Apple.jpg
- src/assets/Banana.jpg
- src/content/blog/Cherry.jpg
3. Astro ファイル
3.1. <img> タグ
AstroJS で最もシンプルに画像を表示させる方法は、public
フォルダに画像ファイルを配置して <img>
タグで表示する方法です。以下の、どの記法でも画像が表示されます。AstroJS では、public
フォルダに配置されたファイルはビルド時に、そのまま root にコピーされます。GatsbyJS や Hugo の static
フォルダと同じ役割です。
他に、<img>
タグを用いて画像ファイルを表示する方法を色々と検証してみました。結果としては、public
フォルダに配置している画像ファイルを <img>
タグで表示する場合は、上記の方法で表示するが良いと思います。また、src
フォルダに配置している画像ファイルを <img>
タグで表示する場合は、絶対パスを用いるのが良いと思います。
AstroJS では、import 文を用いて画像ファイルを読むことが出来ます。読み込まれた画像ファイルは、ImageMetadata
型のデータとして扱うことが出来ます。絶対パスで読み込んでも、相対パスで読み込んでも、挙動は同じです。また、<img>
タグの src プロパティに直接、ファイルパスを設定する方法とは異なり、import localImage from '[ファイル名]'
で読み込むことは出来ません。
3.2. <Image> コンポーネント
<img>
タグを用いて表示される画像ファイルは、最適化が行われません 1 。画像を最適化したい場合は、<Image>
コンポーネントを用いります。<Image>
コンポーネントは、src プロパティと alt プロパティが必須です。更に詳しい仕様については、AstroJS の公式ドキュメント 1 を参照ください。
4. Markdown ファイル
4.1. コンテンツ部分
AstroJS では、src
フォルダ内の Markdown ファイルは、自動的に HTML に変換されます。画像ファイルを絶対パスで指定しても、相対パスで指定しても、画像自体は表示されます。しかし、絶対パスで指定した場合は、最適化処理が行われません。一方、相対パスで指定した場合は、最適化されます。そのため、Markdown コンテンツ部分で画像を表示する場合は、相対パスで指定する方が良いと思います。
4.2. フロントマター部分
Markdown のフロントマター部分では、本文部分とは異なり、絶対パスで指定しても相対パスで指定しても最適化されます。ただし、Markdown ファイルと同じディレクトリに画像ファイルを配置する場合、heroImage: '[FILE]'
と heroImage: '/[FILE]'
はエラーが発生するので注意が必要です。また、Markdown のフロントマターで設定した画像は、デフォルトでは最適化されません。Markdown のフロントマターで設定した画像を最適化する方法については、筆者の別記事 2 を参照ください。
5. おわりに
ここまで、AstroJS における画像ファイルの読み込み挙動について、可能な限り網羅的に解説してきました。上記のコードは全て念入りにレビューしていますが、ヒューマンエラーで誤った情報がないとも限りません。また、AstroJS のアップデートで、仕様が変わる可能があります。何か、おかしな点がありましたら、連絡ください。
余談ですが、GatsbyJS の場合だと GraphQL が画像ファイルの読み込み処理を抽象化してくれていたので、ここまで難しい作業になりませんでした。あの憎かった GraphQL を再評価する日が来るとは思いませんでした。
-
Astro Docs, Images:https://docs.astro.build/en/guides/images/ ↩ ↩2
-
【AstroJS】 Markdown のフロントマターで設定した画像を最適化する:https://xenexe.info/e360becc-d7d0-49f9-bf8b-0ee74430f50d/ ↩