Cloudflare Web Analytics の LCP がひどかったので Google Fonts をやめた

このブログの Cloudflare Web Analytics を眺めていたら、LCP(Largest Contentful Paint)の評価がなかなかひどいことになっていた。

Cloudflare Web Analytics の Core Web Vitals。LCP が Good 0%、Needs Improvement 50%、Poor 50%

体感では全然遅くないんだけどなぁ、と思いつつ、Claude さんに原因を調べてもらった。

結論:Google Fonts

Claude さん、さすがに早い。表題の通りの結論でした。

どうやら、デザインで使っていた、M+PLUS+Rounded+1c という日本語の丸ゴシックフォントが犯人。

グリフ数が数万文字規模になるので、ファイルサイズが英字フォントとは桁違いに重いとのこと。

詳しく説明してもらいました。

Hugo の設定を見たら、こういう記述があった。

googleFontsLink = "https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c:wght@300;400;700&family=JetBrains+Mono:wght@400;500&display=swap"

しかも外部 CDN(fonts.googleapis.com)へのリクエストが発生するので:

  1. DNS 解決
  2. TCP 接続
  3. TLS ハンドシェイク
  4. フォント CSS の取得
  5. 実際のフォントファイルの取得

という連鎖が初回訪問のクリティカルパスに入ってくる。LCP がテキスト要素(見出し)だったとすれば、フォントが読み込まれるまでレンダリングがブロックされる。

体感と計測がズレる理由

キャッシュだよ、キャッシュ。

Claude さんに言われて気づいたわ。

自分のブラウザに既にあるんだもん、そりゃ速いはずだよ。

Cloudflare Web Analytics は実際の訪問者のブラウザで計測した RUM(Real User Monitoring)データを集めている。

訪問者のほとんどは初回訪問でキャッシュなし。

見た人は、「おっそ!」って思ってたことでしょう。

ほんとすみません。

システムフォントに切り替えた

ということで、Google Fonts をやめてシステムフォントに切り替えました。「丸みがあれば何でもいい」という半ば投げやりな姿勢で選んでもらった。

"Hiragino Maru Gothic ProN", "Hiragino Maru Gothic Pro", "BIZ UDPGothic", "Noto Sans JP", sans-serif
OS使われるフォント
macOS / iOSヒラギノ丸ゴ ProN(丸みは M PLUS とほぼ同等)
Windows 10/11BIZ UDPGothic(UD 系、やや丸み)
Android / LinuxNoto Sans JP

コードブロックの JetBrains Mono も同様にシステムフォントへ:

ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, monospace

変更は hugo.toml から googleFontsLink を削除して、custom.css の CSS 変数を書き換えるだけ。外部へのフォントリクエストがゼロになった。めでたしめでたし。

重ね重ね申し訳ございませんでした…

監視は大切

先日 Lighthouse の対応して一安心だったんだけど、今回の Cloudflare の Web Analytics はびっくりした。監視できるところがあるって良いですね。Cloudflare にしといてよかった。