LabHub

ブログ

パフォーマンス·Core Web Vitals 2025 — LCP·CLS·INP·RUM·Image·Font·JS·Cache·Edge·CDN·HTTP/3 (シーズン6 第6回)

한국어English日本語

プロローグ — パフォーマンスは機能ではない

開発者がよく誤解すること: 「パフォーマンス最適化は出荷後のチューニング」。2025年の現実は違う。

「パフォーマンスは機能ではない。全機能の条件だ」

良いAI·UX·モーションも遅ければ無価値。本稿は2025年実戦ガイド。


1章. Core Web Vitals 2025 — 3指標

LCP (Largest Contentful Paint)

CLS (Cumulative Layout Shift)

INP (Interaction to Next Paint) — 2024 FID置換

測定基準

補助指標


2章. RUM vs Synthetic

Synthetic

RUM

両方

CrUX

Chromeオプトインデータ、月次集計。PageSpeed Insightsで活用、BigQueryで公開。


3章. Critical Rendering Path

Network → Parse HTML → CSSOM → Render Tree → Layout → Paint → Composite。

主要ボトルネック

2025年標準

  1. Critical CSSをAbove-the-foldにインライン。
  2. <script defer>/async
  3. <img fetchpriority="high"> をLCP画像に。
  4. <link rel="preconnect"> サードパーティオリジンに。
  5. <link rel="preload"> 重要フォント·Hero画像に。

4章. JSバンドルダイエット

2025年の良サイズ: 初期 < 170kb gzipped、ルート < 50kb。

バンドラ地図

よくある犯人


5章. 画像最適化 — LCPの要

フォーマット

AVIF (最強圧縮) + WebP + JPEGフォールバック。ベクタはSVG。

Next.js <Image>

import Image from 'next/image'
<Image src="/hero.jpg" width={1200} height={600} priority placeholder="blur" blurDataURL={blur} alt="Hero" />

自動AVIF/WebP、レスポンシブsrcset、デフォルトlazy (priorityでeager)、CLS防止。

コツ


6章. フォント最適化

font-display

size-adjust + ascent-override

フォールバックとWebフォントのメトリクス整合 — CLS大幅減。

サブセット化

日韓中フォントはMBオーダー。常用漢字·KS X 1001 2,350字等にサブセット。SubfontやGlyphhangerで自動化。

Variable Font

1ファイルで全weight·width。日本語はNoto Sans JP、韓国語はPretendard Variable、Latin語はInter/Geist。

推奨スタック (日本語)

Noto Sans JP / Yu Gothic + font-display: swap + size-adjust


7章. Caching

HTTPキャッシュ

Next.js 15 Caching (再設計)

Request Memoization、Data Cache、Full Route Cache、Router Cache。2025~: 明示的 use cache ディレクティブでopt-in。

Service Worker

Offline、app-shell、アセットcache-first (Workbox)。iOS制限緩和でPWA復活気配。

Edgeキャッシュ

CDNレベル stale-while-revalidateISR は今もNext.js代表技法。


8章. Edge·CDN·HTTP/3

役割

地理的近接、オリジン負荷減、TLS/HTTP/3/圧縮オフロード。

プレイヤー

Cloudflare (価格·機能バランス最強)、Vercel Edge、Fastly (VCL)、AWS CloudFront、Netlify Edge。日本: さくら、IIJ、AWS Tokyo。

Edge Function

Cloudflare Workers、Vercel Edge、Deno Deploy、Fastly Compute@Edge。Cold Startほぼなし (V8 Isolate)。A/B、認証、Rate Limit、i18nに。

HTTP/3 (QUIC)

UDP、Head-of-line Blocking解消、0-RTT、TLS 1.3内蔵。2025年CDNデフォルト。モバイル·不安定ネットワークで特に威力。


9章. INP最適化

Long Task (>50ms) がメインスレッドを占有して応答性破壊。

  1. 検索input·スクロールリスナーにDebounce/Throttle
  2. Scheduler API: scheduler.postTask(() => heavy(), { priority: 'background' })
  3. React 18+の**useDeferredValue/useTransition**。
  4. 重い計算はWeb Workers
  5. 長リストに仮想化 (react-window、TanStack Virtual)。
  6. 偶発使用機能をコード分割

Chrome DevTools Performance → INPで測定、本番はLong Task API。


10章. ツーリング


11章. 実戦チェックリスト

プロジェクト初期

リリース前

リリース後


12章. 2025年高度パターン


12項目チェックリスト

  1. CWV p75をRUMで追跡?
  2. p75で LCP<2.5sCLS<0.1INP<200ms?
  3. LCP画像に priority + fetchpriority="high"?
  4. 全画像に明示 width/height?
  5. フォント font-display + size-adjust?
  6. 初期バンドル <170kb、ルート <50kb?
  7. 重いコードにDynamic import?
  8. CDN + Edgeキャッシュ設定?
  9. HTTP/3有効?
  10. Lighthouse CIで回帰検知?
  11. 本番でRUM運用?
  12. 日韓モバイル/地下鉄ネットワークテスト?

10アンチパターン

  1. 実ユーザー計測なしで出荷。
  2. Lighthouseスコア最適化、p75 RUMを見ない。
  3. サイズ未指定画像 (CLS爆弾)。
  4. font-display: block (FOITでコンテンツ非表示)。
  5. 巨大な moment.js/lodash フル import。
  6. ホットパスのランタイムCSS-in-JS。
  7. LCP画像の <link rel="preload"> 忘れ。
  8. INPをFIDのようにテスト (単発インタラクションだけ)。
  9. RUMサンプリング低すぎ、テール回帰検知不能。
  10. 日韓ネットワーク現実を無視。

次回予告

シーズン6 第7回: 接続性と国際化 2025 — WCAG 2.2、EU Accessibility Act、ARIA、next-intl、日韓タイポグラフィ、RTL。

「速いプロダクトは良いプロダクト。遅いプロダクトは存在しないプロダクトだ」

— パフォーマンス·Core Web Vitals編、完。

コメント

まだコメントはありません。

ログインするとコメントできます