このサイト自体を題材に、Core Web Vitals(CWV)を実測しながら改善した記録です。見た目は一切変えず、Lighthouse のモバイル Performance を 58 → 99、LCP を 8.6s → 2.3s まで改善しました。

まず計測する(推測しない)

改善は計測から始めます。本番URLに対して Lighthouse を回し、ラボ値を取りました。

  • Performance: 58
  • LCP: 8.6s("poor")
  • FCP: 6.9s / Speed Index: 6.9s
  • CLS: 0(良好)/ TBT: 80ms(良好)

最大の改善機会は render-blocking resources で約3,961ms。CLS と TBT は良好なので、ボトルネックは「最初の描画までの待ち」に集中していると分かります。

原因の特定:フォント

ネットワークを実測すると、犯人は Google Fonts でした。

  • フォント宣言CSS(css2)だけで 約475KB
  • 日本語の Noto Sans JP がサブセット分割で woff2 を約19ファイル取得
  • これらが render-blocking で、最初の描画を大きく遅らせていた

日本語 Web フォントは、サブセットが unicode-range ごとに大量展開されるため、weight を増やすほど宣言CSSもダウンロードも膨らみます。

改善ステップ

1. 使っていないウェイト・ファミリーを削る

実使用を確認し、4ウェイト読み込んでいた Noto Sans JP を 2ウェイトに、ほぼ未使用だった Roboto Mono を撤廃。宣言CSSは 475KB → 238KB(▲49%) に。

2. 日本語はシステムフォントへ

表示の主役は欧文のディスプレイ書体だったため、日本語本文を OS 標準の高品質フォント(Hiragino / Yu Gothic / Meiryo 等)に切り替え。Noto Sans JP の Web フォント読み込みを撤廃しました。これで css2 は 10KB、woff2 リクエストは 約19 → 0。Performance は 81、LCP 4.3s まで改善。

3. 欧文は next/font で自己ホスト

最後に残った render-blocking は、欧文フォントの cross-origin な Google Fonts CSS でした。next/font/google で Inter / Space Grotesk を自己ホスト(同一オリジン配信・自動 preload・size-adjust フォールバック)に変更。フォント自体は同じなので見た目は不変です。

結果、render-blocking が消滅し、最終スコアは:

指標 Before After
Performance 58 99
LCP 8.6s 2.3s
FCP 6.9s 0.8s
Speed Index 6.9s 1.7s
TBT 80ms 20ms
CLS 0 0

学び

  • フォントは最大のレバーになりやすい。特に日本語 Web フォントは重い。
  • 見た目を変えずに大幅改善できる余地は意外と大きい(自己ホスト化・不要ウェイト削減)。
  • 数値で before/after を取ると、何が効いたか・どこで止めるべきかを判断できる。LCP が "良好"(<2.5s)に入った時点で、演出に手を入れるリスクを取る必要はないと判断しました。

パフォーマンスは「速くする」こと自体が目的ではなく、見てくれる人の体験を損なわないための土台です。計測 → 原因特定 → 最小の変更、のサイクルを回すのが結局いちばん近道でした。

ご相談はこちらからどうぞ。