Skip to content

HTML書き換え

rewriteHtmlが有効な場合(デフォルト)、astro-dist-compressはビルド出力内のすべての**/*.htmlを走査し、変換対象の画像を参照する<img>タグを<picture>要素に書き換えます。

html
<!-- 変換前 -->
<img src="/images/photo.png" alt="…" width="800" height="600" />

デフォルトルール(不透明PNG → AVIF、およびWebPフォールバック自動生成)の場合:

html
<!-- 変換後 -->
<picture>
  <source srcset="/images/photo.avif" type="image/avif" />
  <source srcset="/images/photo.webp" type="image/webp" />
  <img src="/images/photo.webp" alt="…" width="800" height="600" />
</picture>

ブラウザは文書順で最初に対応している<source>を選択するため、<source>要素は常に優先度の高いフォーマット順(AVIF → WebP → その他)で出力され、fallback: trueが付いたフォーマットが最後の<img src>になります。

ルールの出力が「fallback: trueが付いた1つだけ」の場合(例: デフォルトの「透過ありPNG → WebP」ルール)、<source>として並べるものがないため、<picture>の中身は(<source>なしで)<img src>だけが更新された状態になります。

パスの扱い

  • ルート絶対パス(/images/photo.png)・ページ相対パス(../images/photo.png)の両方に対応しています。
  • 書き換え後も元のsrc同じ形式を維持します(絶対パスなら絶対パスのまま、相対パスなら相対パスのまま)。
  • 外部URL(https://…//…)やdata: URIの<img>は変更されません。
  • すでに<picture>の中にある<img>(自分自身が生成したものも含む)はスキップされるため、ビルドを再実行しても安全です。

HTML書き換えを無効にする

ts
distCompress({ rewriteHtml: false });

無効にしても、変換後の画像ファイル自体はディスクに書き出されます。参照方法(たとえば自前で<picture>を書いている場合や、別の方法でHTMLを生成している場合)はユーザー側の責任になります。

制約事項

  • 書き換え対象は<img src="…">のみです。<img>srcset属性やCSSのbackground-image、インラインのstyle属性は現時点では書き換えません。
  • astro.configで標準以外のbaseを設定している場合、HTML内のルート絶対パス(/my-app/images/photo.png)にはそのbaseプレフィックスが含まれますが、dir配下のディスク上のファイルにはbaseは含まれません。現状のパス解決はbaseの除去に対応していないため、そのようなプロジェクトではマッチが静かにスキップされます(画像自体の変換・書き出しは行われ、HTML書き換えだけが影響を受けます)。base設定があるプロジェクトでは、base対応が入るまで相対パスのsrcを使ってください。