Astro のビルド後に画像が WebP になる理由(astro:assets と Sharp)

  • Astro
  • WebP
  • Sharp
  • 画像最適化

はじめに

Astro プロジェクトで astro:assets<Image> を使ってビルドすると、src 配下の PNG や JPEG が、出力ディレクトリでは WebP(.webp として配信されることがあります。ここでは、その仕組みをコードベースと Astro の実装前提で整理します。

前提として、この説明は Astro 6 系 および sharp を依存に含めている構成(本ブログテンプレートに近い形)を想定しています。細部はバージョンで変わるため、確かめたいときは 公式: Images を参照してください。

仕組みの要点

  1. <Image>(および getImage)はビルド時に画像を再エンコードする
    Content Collection の image() で解決したローカル画像や、src/assets から import した画像など、アセットとして解決された src を渡した場合に対象になります。

  2. format を props で指定しないと、Astro が既定の出力形式を使う
    画像サービスの検証処理で format が空のとき、SVG 以外には 既定の出力フォーマット が割り当てられます。Astro 6.1 同梱のコードでは、定数 DEFAULT_OUTPUT_FORMAT"webp" です(node_modules/astro/dist/assets/consts.js および同 services/service.jsvalidateOptions)。

  3. Sharp はその変換の実行エンジン
    package.jsonsharp があると、Astro のデフォルト画像サービスは Sharp 経由でリサイズ・エンコードします(node_modules/astro/dist/assets/services/sharp.js)。astro.config で画像サービスを差し替えていなければ、このパイプラインがそのまま使われます。

このプロジェクトでの該当箇所

ヒーロー画像などでは、概ね次のパターンです。

  • layouts/BlogPost.astro および pages/blog/index.astroimport { Image } from 'astro:assets' を使っている
  • width / height / src / alt を渡し、format は書いていない

そのため、前述のとおり 未指定時の既定が WebP になり、dist 側にハッシュ付きの .webp が生成されやすくなります。

public の静的ファイルは別物

public/ に置いた画像は この最適化パイプラインを通りません。ファイル名・拡張子はビルド後もそのままです。WebP に「勝手に」置き換わるのは、astro:assets で処理しているアセットに限られます。

挙動を変えたいとき

  • 元の形式に近い出力にしたい(例: PNG のまま): <Image>format を明示する(Image コンポーネントの props を参照)。
  • 複数形式や picture で出し分けたい: <Picture>formats まわりの公式ガイドに沿って構成する。

まとめ

項目内容
なぜ WebP かformat 未指定時の Astro 既定出力フォーマットが webp
いつ変換されるかastro:assets<Image> / getImage など、ビルド時画像パイプラインを通したとき
何が動いているか典型構成では Sharp
変換されない例public/ の直置き の静的ファイル

サムネイル用に heroImage を付ける場合は、src/assets/blog/hero/2026-04-10.png を置き、frontmatter の heroImage 行のコメント(#)を外してパスを有効化してください。