Foundation
Development Guidelinesフロントエンド

パフォーマンス

Web パフォーマンスの目標と、画像・JavaScript・配信について守る判断基準を定める

このページは、museum アプリの Web パフォーマンスについて、チームの目標と守るべき判断基準を定める。一般的な解説は外部の出典に譲り、本ページには本チーム固有の決定だけを書く。閾値や予算は機械的な合否判定ではなく、実ユーザーで検証する目標として扱う。

このアプリは画像を主体とするデジタルアーカイブであり、パフォーマンスの最大のレバーは画像と JavaScript である。まず目標と計測の考え方を示し、その後でレバーごとの具体的な指針を述べる。

目標(Core Web Vitals)

実ユーザー(フィールド)の 75 パーセンタイルで、次を目標とする。

  • LCP(最大コンテンツの描画)— 2.5 秒以下にする
  • INP(操作への応答)— 200 ミリ秒以下にする
  • CLS(レイアウトのズレ)— 0.1 以下にする

補助指標として TTFB・FCP・TBT も参考にする。これらの数値はあくまで目標であり、絶対の合否基準としては運用しない。最終的な良し悪しはフィールドで判断する。

計測の優先

推測で最適化しない。まず計測し、ボトルネックを特定してから手を入れる。早すぎる最適化は、効果の無い複雑さを持ち込むため避ける。

  • 公開後はフィールドデータ(CrUX / RUM)で 75 パーセンタイルの Core Web Vitals を監視する。
  • 開発時はラボ計測(Lighthouse)を再現と回帰検知に使う。ラボとフィールドは一致しないため、合否はフィールドで判断する。
  • パフォーマンスバジェット(ルートごとの JavaScript 量や Core Web Vitals の目標)を定め、超過したときに気付ける状態を保つ。

画像

画像はこのアプリで最大のレバーである。

  • 表示領域をアスペクト比で予約し、読み込み後のズレ(CLS)を防ぐ。Thumbnail はこの方針で実装してある。
  • 用途に応じた派生サイズを要求する(一覧は小さく、詳細は大きく)。可能なら srcset / sizes で解像度を出し分ける。
  • ファーストビューの外にある画像は遅延読込(loading="lazy")にする。ファーストビュー内で最大の画像(LCP の候補)は遅延させず優先的に読み込む。
  • 画像の配信元が別オリジン(IIIF など)のときは、その origin へ preconnect して接続確立の待ちを減らす。

プレーンな img を選んだ代償

本アプリは任意の IIIF オリジンを扱うため、Thumbnail は next/image ではなく意図的にプレーンな img 要素を使う(remotePatterns の制約を回避するためである)。その代償として、next/image が自動化する次の項目を自前で守る必要がある。

  • 寸法・アスペクト比の予約(CLS の防止)
  • 遅延読込の付与
  • 解像度の出し分け(srcset / sizes
  • LCP 画像の優先読込
  • 配信元への preconnect

JavaScript

送る量を減らすことが効く。

  • 既定は Server Component とする。'use client' は対話が要る末端に限定し、クライアント境界を小さく保つ。
  • 重い依存(高解像度ズームの DeepZoomViewer など)は動的 import でコード分割し、必要になったときにだけ読み込む。
  • 集約バレルを作らずツリーシェイクを効かせる。Icon は curated registry を介し、使うアイコンだけを静的 import する。
  • アニメーションは Composite のみで処理できる transformopacity に限定し、レイアウトを動かすプロパティをアニメートしない。理由と詳細はアニメーションに従う。これはメインスレッドを空け、INP を守ることにもつながる。

レイアウト安定性(CLS)

  • 画像・埋め込み・動的に差し込む領域は、寸法やアスペクト比、スケルトンで領域を予約する。
  • フォントは system フォントを主体にし、表示の遅延によるズレを抑える。Web フォントを使うときは表示設定(font-display)を行う。
  • レイアウトを動かすアニメーションは行わない(アニメーションに従う)。

配信

  • 公開側のページは内容が静的に近いため、静的生成 / ISR と適切なキャッシュを既定とする。TTFB・LCP・SEO に効く。
  • 管理側は対話が主のため、必要な範囲でクライアント処理を持たせる。

確認手段

  • /dev/components と実画面で目視し、Lighthouse でラボ計測する。
  • モバイル・タブレット・PC の各幅で確認する(レスポンシブに従う)。
  • 公開後はフィールドデータで Core Web Vitals を継続的に監視する。

関連項目

一般的な定義と手法は次の出典に譲る。本ページは、これらを本アプリでどう運用するかだけを定める。

On this page