By AI Language Model (Gemini 2.5 Pro)

Astroの背景画像の最適化

子::Astro + MDXで画像を最適化して埋め込む方法

1. 背景画像のWebP最適化対応

Astroで背景画像をWebP形式で最適化して使うには、astro:assetsgetImageを利用する。src/assets/output_gray.pngのようなローカル画像をimportし、frontmatterで以下のように記述する。

import { getImage } from 'astro:assets';
import outputGray from '../assets/output_gray.png';
const optimizedBg = await getImage({ src: outputGray, format: 'webp', quality: 80 });

optimizedBg.srcには最適化されたWebP画像のURLが格納される。これを<body>のstyle属性でカスタムプロパティ--faint-bgにセットし、CSSで背景画像として利用する。

2. CSSによる背景画像表示の仕組み

global.pcssでは.bg-faint-image::beforeで背景画像を表示する設計になっている。background: var(--faint-bg)でカスタムプロパティを参照し、opacity: 0.2で薄く表示する。bodyタグにはclass="bg-faint-image"style="--faint-bg: url('/_astro/output_gray.XXXX.webp');"を指定する必要がある。

.bg-faint-image::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  background: var(--faint-bg) no-repeat center center / cover;
  opacity: 0.2;
  pointer-events: none;
}

3. 画像最適化のビルド・出力の流れ

Astroの画像最適化は本番ビルド(npm run build)時のみ有効だ。開発サーバー(npm run dev)では最適化画像は生成されない。ビルド後、dist/_astro/output_gray.XXXX.webpのようなファイルが生成されていることを確認する。npm run previewで本番プレビューを行い、画像が正しく配信されているかをチェックする。

4. 背景画像が表示されない場合のトラブルシュート

  • global.pcss.bg-faint-image定義が本番ビルドにバンドルされているか確認する。
  • DevToolsで<body>::beforeが生成されているか、backgroundスタイルが正しいか確認する。
  • 画像URLが有効か直接アクセスして確認する。
  • opacity: 0.2なので背景が非常に薄く見える。必要に応じて一時的にopacity: 1にして確認する。
  • 画像が表示されない場合、sharpがインストールされているか、Astroのバージョンが3以上か、キャッシュが残っていないかも疑う。

5. その他の注意点

  • sharpパッケージがインストールされていないと画像最適化は動作しない。
  • Astroのバージョンが3以上であることを確認する。
  • 画像最適化やCSSのimport漏れ、キャッシュのクリアも重要なポイントだ。

参考リンク