useReportWebVitals
useReportWebVitals
钩子允许您报告 核心 Web 指标 (Core Web Vitals),并可与您的分析服务结合使用。
传递给 useReportWebVitals
的新函数会使用当前可用的指标进行调用。为防止重复报告数据,请确保回调函数引用保持不变(如下方代码示例所示)。
import { useReportWebVitals } from 'next/web-vitals'
const logWebVitals = (metric) => {
console.log(metric)
}
function MyApp({ Component, pageProps }) {
useReportWebVitals(logWebVitals)
return <Component {...pageProps} />
}
useReportWebVitals
作为钩子参数传递的 metric
对象包含以下属性:
id
:当前页面加载上下文中该指标的唯一标识符name
:性能指标名称。可能值包括特定于 Web 应用的 Web 指标 名称(TTFB、FCP、LCP、FID、CLS)delta
:该指标当前值与先前值的差异。值通常以毫秒为单位,表示指标随时间的变化entries
:与指标关联的 性能条目 (Performance Entries) 数组。这些条目提供与指标相关的性能事件的详细信息navigationType
:指示触发指标收集的 导航类型。可能值包括"navigate"
、"reload"
、"back_forward"
和"prerender"
rating
:指标值的定性评级,提供性能评估。可能值为"good"
(良好)、"needs-improvement"
(需改进)和"poor"
(较差)。评级通常通过将指标值与预定义阈值进行比较来确定value
:性能条目的实际值或持续时间,通常以毫秒为单位。该值提供了指标跟踪的性能方面的定量测量。值的来源取决于具体测量的指标,可能来自各种 性能 API (Performance API)
Web 指标
Web 指标 (Web Vitals) 是一组旨在捕捉网页用户体验的有用指标。包含以下所有 Web 指标:
- 首字节时间 (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
属性处理所有这些指标的结果。
import { useReportWebVitals } from 'next/web-vitals'
const handleWebVitals = (metric) => {
switch (metric.name) {
case 'FCP': {
// 处理 FCP 结果
}
case 'LCP': {
// 处理 LCP 结果
}
// ...
}
}
function MyApp({ Component, pageProps }) {
useReportWebVitals(handleWebVitals)
return <Component {...pageProps} />
}
自定义指标
除了上述核心指标外,还有一些额外的自定义指标用于测量页面水合 (hydrate) 和渲染所需时间:
Next.js-hydration
:页面开始和完成水合所需时间(毫秒)Next.js-route-change-to-render
:路由变更后页面开始渲染所需时间(毫秒)Next.js-render
:路由变更后页面完成渲染所需时间(毫秒)
您可以分别处理这些指标的结果:
import { useReportWebVitals } from 'next/web-vitals'
function handleCustomMetrics(metrics) {
switch (metric.name) {
case 'Next.js-hydration':
// 处理水合结果
break
case 'Next.js-route-change-to-render':
// 处理路由变更到渲染结果
break
case 'Next.js-render':
// 处理渲染结果
break
default:
break
}
}
function MyApp({ Component, pageProps }) {
useReportWebVitals(handleCustomMetrics)
return <Component {...pageProps} />
}
这些指标在所有支持 用户计时 API (User Timing API) 的浏览器中均可工作。
将结果发送到外部系统
您可以将结果发送到任何端点以测量和跟踪您网站上的真实用户性能。例如:
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 的信息。