useReportWebVitals

useReportWebVitals フックを使用すると Core Web Vitals をレポートでき、アナリティクスサービスと組み合わせて使用できます。

app/_components/web-vitals.js
'use client'

import { useReportWebVitals } from 'next/web-vitals'

export function WebVitals() {
  useReportWebVitals((metric) => {
    console.log(metric)
  })
}
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 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 Vitals がすべて含まれます:

これらのメトリックの結果はすべて name プロパティを使用して処理できます。

'use client'

import { useReportWebVitals } from 'next/web-vitals'

export function WebVitals() {
  useReportWebVitals((metric) => {
    switch (metric.name) {
      case 'FCP': {
        // FCP 結果の処理
      }
      case 'LCP': {
        // LCP 結果の処理
      }
      // ...
    }
  })
}
'use client'

import { useReportWebVitals } from 'next/web-vitals'

export function WebVitals() {
  useReportWebVitals((metric) => {
    switch (metric.name) {
      case 'FCP': {
        // FCP 結果の処理
      }
      case 'LCP': {
        // LCP 結果の処理
      }
      // ...
    }
  })
}

Vercel での使用

Vercel Speed Insights は Vercel デプロイメントで自動的に設定され、useReportWebVitals の使用は不要です。このフックはローカル開発時や別のアナリティクスサービスを使用する場合に有用です。

外部システムへの結果送信

結果を任意のエンドポイントに送信し、サイト上の実際のユーザーパフォーマンスを測定・追跡できます。例えば:

useReportWebVitals((metric) => {
  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 })
  }
})

豆知識: Google Analytics を使用する場合、 id 値を使用して手動でメトリック分布を構築できます(パーセンタイルなどを計算するため)

useReportWebVitals(metric => {
  // この例のように Google Analytics を初期化した場合は `window.gtag` を使用:
  // https://github.com/vercel/next.js/blob/canary/examples/with-google-analytics/pages/_app.js
  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 への結果送信 について詳しく読む