Til

Astro Assets vs Public Folder

#Astro

Summary

Astroプロジェクトにおいて、静的アセットを配置する場所は主に <project>/public/<project>/src/assets/ の2つがあります。 これらはビルド時の挙動が大きく異なります。

  • src/assets/: Astro/Viteによって処理される(最適化、ハッシュ付与、バンドル)。
  • public/: そのままルートディレクトリにコピーされる(無加工)。

Decision Matrix

迷ったときは以下の基準で選びます。

特徴src/assets/ (推奨)public/
主な用途画像 (.jpg, .png)、フォント、CSSrobots.txtfavicon.ico、OGP画像
画像最適化astro:assets でWebP変換・リサイズ可❌ 不可(そのまま配信)
ファイル名ハッシュ化される (例: logo.1234.png)固定 (例: /logo.png)
アクセスimport して使うURLパス (/file.png) で指定
キャッシュ長期間キャッシュ可能 (Cache-Busting)ブラウザキャッシュの設定依存

Implementation

1. src/assets/ を使う場合 (推奨)

コンポーネント内で画像を扱う場合は、基本的にこちらを使います。LCP改善やCLS防止の恩恵を受けられます。

---
// Importすることでビルドパイプラインに乗る
import { Image } from "astro:assets";
import myImage from "../assets/my_image.png";
---

<!-- 自動的に幅・高さが計算され、WebPに変換される -->
<Image src={myImage} alt="A description of my image" />

2. public/ を使う場合

「ファイル名を変えたくない」場合や、「動的にパスを文字列結合したい」場合に便利です。

---
// 公開ディレクトリのパスを文字列として指定
const imageUrl = "/images/logo.png";
---

<!-- 最適化はされない。パスはそのまま出力される -->
<img src={imageUrl} alt="Logo" />

Tips

  • OGP画像: public/ に置くのが一般的です。SNSのクローラーはハッシュ化されたURLではなく、固定のURLを期待することが多いためです。
  • 動的インポート: src/assets の画像でも、import.meta.glob を使えば動的に読み込むことが可能です(Vol.6参照)。

References