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)
})
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
:メトリックに関連するパフォーマンスエントリの配列。これらのエントリは、メトリックに関連するパフォーマンスイベントの詳細な情報を提供します。navigationType
:メトリック収集をトリガーしたナビゲーションの種類を示します。可能な値は"navigate"
、"reload"
、"back_forward"
、"prerender"
です。rating
:メトリック値の定性的な評価で、パフォーマンスの評価を提供します。可能な値は"good"
、"needs-improvement"
、"poor"
です。評価は通常、許容可能またはサブ最適なパフォーマンスを示す所定のしきい値と比較して決定されます。value
:パフォーマンスエントリの実際の値または期間。通常はミリ秒単位で、追跡されているパフォーマンス側面の定量的な測定を提供します。値の出典は、測定される特定のメトリックによって異なり、さまざまなパフォーマンスAPIから取得できます。
Web Vitals
Web Vitalsは、Webページのユーザーエクスペリエンスをキャプチャするのに役立つ一連の有用なメトリックです。以下のWeb Vitalsがすべて含まれています:
- 最初のバイトまでの時間(TTFB)
- 最初のコンテンツフル描画(FCP)
- 最大コンテンツフル描画(LCP)
- 最初の入力遅延(FID)
- 累積レイアウトシフト(CLS)
- 次の描画までの相互作用(INP)
name
プロパティを使用して、これらのメトリックのすべての結果を処理できます。
app/components/web-vitals.tsx
TypeScript
'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はuseReportWebVitals
ではなく、@vercel/speed-insights
パッケージを使用します。useReportWebVitals
フックは、ローカル開発時、または別のサービスでWeb Vitalsを収集する場合に便利です。
外部システムへの結果の送信
サイト上の実際のユーザーパフォーマンスを測定およびトラッキングするために、任意のエンドポイントに結果を送信できます。例:
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 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への結果の送信について詳しく読む。