Core Web Vitals:ウェブパフォーマンスの測定と改善
ユーザーはせっかちです。サイトの読み込みに数秒以上かかると、離れてしまいます。検索エンジンも同様で、Core Web Vitalsはランキングシグナルです。しかし、改善しようとすると、指標やツールの迷路のように感じられます。このガイドでは、混乱を取り除きます。各指標の意味、正確な測定方法、そして改善するための具体的な手順を学べます。
Core Web Vitalsとは?
Core Web Vitalsは、実際のユーザー体験を定量化する3つの指標です:
- Largest Contentful Paint (LCP):メインコンテンツが読み込まれるまでの時間。目標:2.5秒未満。
- Interaction to Next Paint (INP):ページがユーザー入力にどれだけ迅速に応答するか。目標:200ミリ秒未満。
- Cumulative Layout Shift (CLS):読み込み中にレイアウトがどれだけ動くか。目標:0.1未満。
これらの指標は、実際のユーザーセッション(フィールドデータ)と合成テスト(ラボデータ)から測定されます。ランキングで重要なのはフィールドデータです。
Core Web Vitalsの測定方法
ラボデータとフィールドデータの両方が必要です。ラボデータはデバッグに役立ち、フィールドデータは実際のユーザー体験を反映します。
ラボツール
- Chrome DevToolsのLighthouse:監査を実行してスコアと改善点を取得します。
- PageSpeed Insights:URLのラボデータとフィールドデータを組み合わせて表示します。
- WebPageTest:高度なウォーターフォール分析。
フィールドツール
- Chrome User Experience Report (CrUX):Chromeからの実ユーザーデータ。PageSpeed InsightsやBigQuery経由で利用できます。
- web-vitals JavaScriptライブラリ:自サイトのユーザーから指標を収集し、アナリティクスに送信します。
フィールドデータを収集するには、web-vitalsライブラリをサイトに追加します:
import {onLCP, onINP, onCLS} from 'web-vitals';
function sendToAnalytics(metric) {
const body = JSON.stringify(metric);
navigator.sendBeacon('/analytics', body);
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);
これにより、実ユーザー指標の継続的なストリームが得られます。
LCPの改善
LCPは通常、最大の画像、動画、またはテキストブロックです。改善するには、クリティカルパスに焦点を当てます。
- 画像を最適化する:画像を圧縮し、WebPやAVIFなどのモダンなフォーマットを使用し、明示的な幅と高さを設定します。Image Compressorのようなツールは、目に見える品質低下なしにファイルサイズを削減するのに役立ちます。
- LCPリソースをプリロードする:ヒーロー画像やフォントに
<link rel="preload">を追加します。 - サーバー応答時間を短縮する:CDNを使用し、キャッシュを有効にし、バックエンドクエリを最適化します。
- レンダリングをブロックするリソースを排除する:クリティカルCSSをインライン化し、非クリティカルなJavaScriptを遅延させます。
- レスポンシブ画像を使用する:
srcsetで適切なサイズの画像を配信します。
LCP画像をプリロードする例:
<link rel="preload" as="image" href="/hero.webp" fetchpriority="high">
INPの改善
INPは応答性を測定します。長いタスクはメインスレッドをブロックし、視覚的なフィードバックを遅らせます。
- 長いタスクを分割する:
setTimeoutやrequestIdleCallbackを使用してメインスレッドに譲ります。 - イベントハンドラを最適化する:高コストなハンドラをデバウンスまたはスロットルします。
- JavaScriptを削減する:未使用コードを削除し、コード分割し、非クリティカルなモジュールを遅延読み込みします。
- 重い計算にはWeb Workersを使用する。
- 大きなDOMサイズを避ける:DOMを1,500ノード未満に保ちます。
メインスレッドに譲る例:
async function yieldToMain() {
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
} else {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
CLSの改善
CLSは、要素が予期せず移動したときに発生します。一般的な原因:サイズ未指定の画像、広告、埋め込み、動的に挿入されるコンテンツ。
- 画像と動画には常に幅と高さを設定する。
- 広告と埋め込みにはスペースを確保する:CSSの
aspect-ratioや固定コンテナを使用します。 - ユーザー操作による場合を除き、既存コンテンツの上にコンテンツを挿入しない。
font-display: optionalを使用する:フォントスワップによるシフトを避けるか、フォントをプリロードします。- レイアウトをトリガーするプロパティの代わりに
transformアニメーションを適用する。
画像のスペースを確保する例:
<img src="#" width="800" height="600" alt="...">
ツールとワークフロー
パフォーマンスチェックを開発ワークフローに統合します:
- CIでLighthouseを実行してリグレッションを検出します。
web-vitalsを使用してフィールドデータを監視し、アラートを設定します。- サーバーログを分析して遅いエンドポイントを特定します。Nginx Log Analyzerは、遅いリクエストやエラーの発見に役立ちます。
- 実機と帯域制限されたネットワークでテストします。
指標と目標の比較
| 指標 | 測定内容 | 良好な目標 |
|---|---|---|
| LCP | 読み込みパフォーマンス | < 2.5 s |
| INP | 応答性 | < 200 ms |
| CLS | 視覚的安定性 | < 0.1 |
FAQ
Core Web Vitalsとは何ですか?
Core Web Vitalsは、LCP、INP、CLSの3つの指標で、読み込み、インタラクティブ性、視覚的安定性を測定します。Googleがランキングシグナルとして使用しています。
Core Web Vitalsを測定するにはどうすればよいですか?
デバッグにはLighthouseなどのラボツールを、実ユーザーデータにはweb-vitalsライブラリやCrUXなどのフィールドツールを使用します。両方が重要です。
良好なLCPスコアとは?
良好なLCPは2.5秒未満です。4秒を超えると不良です。画像を最適化し、クリティカルリソースをプリロードし、サーバー応答時間を短縮します。
サイトを高速化する準備はできましたか?まずは無料のImage Compressorで画像を圧縮して、LCPをすぐに改善しましょう。