useReportWebVitals
useReportWebVitalsフックを使用すると、Core Web Vitalsをレポートできます。これはアナリティクスサービスと組み合わせて使用できます。
useReportWebVitalsに渡された新しい関数は、その時点で利用可能なメトリクスで呼び出されます。重複したデータのレポートを防ぐため、コールバック関数の参照が変更されないようにしてください(以下のコード例を参照)。
app/_components/web-vitals.js
'use client'
import { useReportWebVitals } from 'next/web-vitals'
const logWebVitals = (metric) => {
console.log(metric)
}
export function WebVitals() {
useReportWebVitals(logWebVitals)
return null
}app/layout.js
import { WebVitals } from './_components/web-vitals'
export default function Layout({ children }) {
return (
<html>
<body>
<WebVitals />
{children}
</body>
</html>
)
}
useReportWebVitalsフックは'use client'ディレクティブが必要であるため、最も効率的なアプローチは、ルートレイアウトがインポートする別のコンポーネントを作成することです。これにより、クライアント境界をWebVitalsコンポーネントのみに限定できます。
useReportWebVitals
フックの引数として渡されるmetricオブジェクトは、複数のプロパティで構成されています:
id:現在のページロード内でのメトリクスの一意の識別子name:パフォーマンスメトリクスの名前。可能な値には、Web アプリケーション固有のWeb Vitalsメトリクス(TTFB、FCP、LCP、FID、CLS)の名前が含まれます。delta:メトリクスの現在の値と前の値の差分。この値は通常ミリ秒単位で、メトリクスの値の時間経過に伴う変化を表します。entries:メトリクスに関連するPerformance Entriesの配列。これらのエントリはメトリクスに関連するパフォーマンスイベントに関する詳細情報を提供します。navigationType:メトリクス収集をトリガーしたナビゲーションのタイプを示します。可能な値は"navigate"、"reload"、"back_forward"、および"prerender"です。rating:メトリクス値の定性的な評価。パフォーマンスの評価を提供します。可能な値は"good"、"needs-improvement"、および"poor"です。評価は通常、メトリクス値を許容可能またはサブ最適なパフォーマンスを示す定義済みの閾値と比較することで決定されます。value:パフォーマンスエントリの実際の値または期間。通常ミリ秒単位です。この値はメトリクスで追跡されるパフォーマンス側面の定量的な測定を提供します。値のソースは測定中の特定のメトリクスに依存し、様々なPerformance APIから取得できます。
Web Vitals
Web VitalsはWebページのユーザー体験を捉えることを目的とした、有用なメトリクスのセットです。以下のWeb Vitalsがすべて含まれています:
- Time to First Byte(TTFB)
- First Contentful Paint(FCP)
- Largest Contentful Paint(LCP)
- First Input Delay(FID)
- Cumulative Layout Shift(CLS)
- Interaction to Next Paint(INP)
nameプロパティを使用して、これらのメトリクスすべての結果を処理できます。
app/components/web-vitals.tsx
TypeScript
'use client'
import { useReportWebVitals } from 'next/web-vitals'
type ReportWebVitalsCallback = Parameters<typeof useReportWebVitals>[0]
const handleWebVitals: ReportWebVitalsCallback = (metric) => {
switch (metric.name) {
case 'FCP': {
// FCP結果を処理
}
case 'LCP': {
// LCP結果を処理
}
// ...
}
}
export function WebVitals() {
useReportWebVitals(handleWebVitals)
}外部システムへの結果の送信
サイト上の実際のユーザーパフォーマンスを測定および追跡するため、任意のエンドポイントに結果を送信できます。例:
function postWebVitals(metrics) {
const body = JSON.stringify(metric)
const url = 'https://example.com/analytics'
// 利用可能な場合は`navigator.sendBeacon()`を使用し、そうでない場合は`fetch()`にフォールバックします。
if (navigator.sendBeacon) {
navigator.sendBeacon(url, body)
} else {
fetch(url, { body, method: 'POST', keepalive: true })
}
}
useReportWebVitals(postWebVitals)補足:Google Analyticsを使用する場合、
id値を使用することでメトリクス分布を手動で構築できます(パーセンタイルを計算するなど)。
useReportWebVitals(metric => { // このサンプルのようにGoogle Analyticsを初期化した場合、`window.gtag`を使用してください: // https://github.com/vercel/next.js/blob/canary/examples/with-google-analytics window.gtag('event', metric.name, { value: Math.round(metric.name === 'CLS' ? metric.value * 1000 : metric.value), // 値は整数である必要があります event_label: metric.id, // 現在のページロードに一意のid non_interaction: true, // バウンス率に影響しません。 }); }Google Analyticsへの結果の送信についてさらに読む。