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 のみで処理できる
transformとopacityに限定し、レイアウトを動かすプロパティをアニメートしない。理由と詳細はアニメーションに従う。これはメインスレッドを空け、INP を守ることにもつながる。
レイアウト安定性(CLS)
- 画像・埋め込み・動的に差し込む領域は、寸法やアスペクト比、スケルトンで領域を予約する。
- フォントは system フォントを主体にし、表示の遅延によるズレを抑える。Web フォントを使うときは表示設定(
font-display)を行う。 - レイアウトを動かすアニメーションは行わない(アニメーションに従う)。
配信
- 公開側のページは内容が静的に近いため、静的生成 / ISR と適切なキャッシュを既定とする。TTFB・LCP・SEO に効く。
- 管理側は対話が主のため、必要な範囲でクライアント処理を持たせる。
確認手段
/dev/componentsと実画面で目視し、Lighthouse でラボ計測する。- モバイル・タブレット・PC の各幅で確認する(レスポンシブに従う)。
- 公開後はフィールドデータで Core Web Vitals を継続的に監視する。
関連項目
一般的な定義と手法は次の出典に譲る。本ページは、これらを本アプリでどう運用するかだけを定める。
- Core Web Vitals — web.dev / Core Web Vitals
- 画像・読み込みの最適化 — Fast load times(web.dev)
- アニメーションのレンダリング費用 — How to create high-performance CSS animations(web.dev)