Menu

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がすべて含まれています:

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への結果の送信についてさらに読む。