対応ブラウザ
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
FCP とは
First Contentful Paint(FCP)は、ユーザーが最初にページに移動してから、ページのコンテンツの一部が画面に表示されるまでの時間を測定します。この指標の「content」はテキスト、画像(背景画像を含む)、<svg>
要素、白以外の <canvas>
要素を指します。
上の画像に示されている読み込みタイムラインでは、FCP は 2 番目のフレームで発生します。このとき、最初のテキスト要素と画像要素が画面にレンダリングされます。
一部のコンテンツはレンダリングされていますが、すべてがレンダリングされているわけではありません。この点が、First Contentful Paint と Largest Contentful Paint(LCP)の重要な違いです。LCP はページのメイン コンテンツの読み込みが完了したタイミングを測定することを目的としています。
優れた FCP スコアとは
優れたユーザー エクスペリエンスを提供するため、サイトは First Contentful Paint を 1.8 秒以下にする必要があります。ほとんどのユーザーに対してこの目標値を確実に達成するには、モバイル デバイスとデスクトップ デバイスで分けたページ読み込みの 75 パーセンタイルをしきい値として測定することをおすすめします。
<ph type="x-smartling-placeholder">FCP の測定方法
FCP は、ラボまたは現場で測定でき、以下のツールで利用できます。
フィールド ツール
ラボツール
JavaScript で FCP を測定する
JavaScript で FCP を測定するには、Paint Timing API を使用します。次の例は、first-contentful-paint
という名前の paint
エントリをリッスンし、コンソールに記録する PerformanceObserver
を作成する方法を示しています。
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntriesByName('first-contentful-paint')) {
console.log('FCP candidate:', entry.startTime, entry);
}
}).observe({type: 'paint', buffered: true});
<ph type="x-smartling-placeholder">
前のコード スニペットでは、ログに記録された first-contentful-paint
エントリから、最初のコンテンツ要素がいつ描画されたかがわかります。ただし、このエントリは FCP の測定に有効でない場合もあります。
次のセクションでは、API レポートと指標の計算方法の違いを示します。
指標と API の違い
- API は、バックグラウンド タブで読み込まれたページに対して
first-contentful-paint
エントリをディスパッチしますが、FCP の計算時にはこれらのページを無視する必要があります(First Paint のタイミングは、ページがずっとフォアグラウンドにあった場合のみ考慮する必要があります)。 - ページがバックフォワード キャッシュから復元された場合、API は
first-contentful-paint
エントリを報告しませんが、このようなケースでは、ユーザーが個別のページ訪問として認識されるため、FCP を測定する必要があります。 - API はクロスオリジンの iframe からのペイント タイミングを報告しない場合がありますが、FCP を適切に測定するには、すべてのフレームを考慮する必要があります。サブフレームは API を使用して、集約のためにペイントのタイミングを親フレームに報告できます。
- API はナビゲーション開始時から FCP を測定しますが、事前レンダリングされたページの場合、ユーザーが認識した FCP 時間に相当するため、
activationStart
から FCP を測定する必要があります。
デベロッパーは、こうした微妙な違いをすべて覚える代わりに、web-vitals
JavaScript ライブラリを使用して FCP を測定できます。これにより、これらの違いが自動的に処理されます(可能な場合、iframe の問題は対象外です)。
import {onFCP} from 'web-vitals';
// Measure and log FCP as soon as it's available.
onFCP(console.log);
JavaScript で FCP を測定する方法の詳細な例については、onFCP()
のソースコードをご覧ください。
FCP を改善する方法
特定のサイトの FCP を改善する方法については、Lighthouse のパフォーマンス監査を実施して、監査で示された最適化案や診断情報に注目してください。
サイトを問わず FCP 全般を改善する方法については、次のパフォーマンス ガイドをご覧ください。
- レンダリングをブロックするリソースを排除する
- CSS を最小化する
- 使用していない CSS を削除する
- 使用していない JavaScript を削除する
- 必要なオリジンに事前接続する
- サーバーの応答時間(TTFB)を短縮する
- 複数のページ リダイレクトを避ける
- キー リクエストをプリロードする
- 大規模なネットワーク ペイロードの回避
- 効率的なキャッシュ ポリシーを使用して静的アセットを提供する
- 過度の DOM サイズを避ける
- クリティカル リクエストの深度を最小限に抑える
- ウェブフォントの読み込み中もテキストを表示したままにする
- リクエスト数を低く抑え、転送サイズを小さくする
変更履歴
指標の測定に使用される API でバグが見つかることがありますが、指標自体の定義に見つかることもあります。そのため、変更が必要となることがあり、こうした変更は社内のレポートやダッシュボードに改善や回帰として表示されることがあります。
管理しやすくするために、これらの指標の実装または定義に対するすべての変更は、こちらの変更履歴で確認できます。
これらの指標についてフィードバックがある場合は、web-vitals-feedback Google グループからお寄せください。