Skip to content

記事画像をAVIF/WebP・srcsetへ変換するビルドパイプラインを作る #2932

Description

@cherishmey

現状

記事画像は原稿に置いたファイルをほぼそのまま配信しており、表示幅に応じた srcset を持たない。

代表記事を幅375pxで確認すると、次の画像が配信されていた。

  • top.jpg: 元1024×559、表示約351×192、srcsetなし
  • cockpit.png: 元1200×665、表示約351×195、srcsetなし

mobile Lighthouse:

  • Performance: 87
  • LCP: 4.0秒
  • 画像最適化による推定削減: 540KiB
  • cockpit.png: 約433KiBの削減余地
  • top.jpg: 約121KiBの削減余地

問題

  • モバイルでも表示寸法の約3倍の画像を取得する
  • PNG / JPEG / GIF等の選択と圧縮品質が著者ごとに異なる
  • 著者の画像作成方法が読者の通信量とLCPへ直接影響する
  • 原稿側へ「各自でWebPにして複数サイズを作る」と求めると運用されない

やりたいこと

ビルド時に記事画像を一元変換し、表示幅に合った画像を配信する。

たたき台:

  • AVIF / WebP / 元形式の3系統を生成
  • 480 / 768 / 1200px程度の幅バリエーションを生成
  • <picture>srcsetsizes を自動生成
  • 先頭画像だけ fetchpriority="high"、以降は loading="lazy"
  • 元画像は保持する
  • 既存の width / height と縦横比を維持する
  • GIF / AVIFアニメーション、スクリーンショット、写真、図表で変換方針を分ける
  • CIで「表示幅に対して過大」「圧縮率が異常」「アニメーションが巨大」を検知する

調べること

  • Hexoのrender/filter段階で <img><picture> へ変換できるか
  • sharp等の導入コストとGitHub Actionsの生成時間
  • 既存画像全件を変換するか、新規・高PV記事から始めるか
  • 図表や小さい文字を含む画像でAVIF/WebPの品質が落ちないか
  • OGP画像と本文画像を同じパイプラインに含めるか
  • キャッシュキーと生成物の保存場所

既存Issueとの境界

このIssueは複数形式・複数幅をビルド時に生成し、ブラウザへ選ばせる仕組みを扱う。

完了条件

  • 代表記事のmobile LCPが2.5秒未満、または現状から明確に改善する
  • srcset / sizes により表示幅に近い画像が選ばれる
  • AVIF / WebP非対応環境で元形式へフォールバックする
  • CLSを増やさない
  • 原稿執筆者の手作業を増やさない
  • 変換前後の見た目を写真・スクリーンショット・図表で確認する

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions