Next.js includes built-in support for performance analytics. You can use the useReportWebVitals hook to manage metrics manually, or rely on Vercel’s managed service for automatic collection and visualization.
For advanced tracking, create an instrumentation-client.js or .ts file in your project root. This file runs before your frontend code and is ideal for initializing global analytics or error tracking:
// instrumentation-client.js
console.log('Analytics initialized')
window.addEventListener('error', (event) => {
reportError(event.error)
})To report Web Vitals, create a separate client component:
// app/_components/web-vitals.js
'use client'
import { useReportWebVitals } from 'next/web-vitals'
export function WebVitals() {
useReportWebVitals((metric) => {
console.log(metric)
})
}Then import it in your root layout:
// app/layout.js
import { WebVitals } from './_components/web-vitals'
export default function Layout({ children }) {
return (
<html>
<body>
<WebVitals />
{children}
</body>
</html>
)
}Web Vitals are key performance metrics that reflect user experience:
You can handle each metric using its name property:
useReportWebVitals((metric) => {
switch (metric.name) {
case 'FCP': {
// handle FCP
}
case 'LCP': {
// handle LCP
}
// ...
}
})To send metrics to a custom endpoint:
useReportWebVitals((metric) => {
const body = JSON.stringify(metric)
const url = 'https://example.com/analytics'
if (navigator.sendBeacon) {
navigator.sendBeacon(url, body)
} else {
fetch(url, { body, method: 'POST', keepalive: true })
}
})If you use Google Analytics, you can send metrics using window.gtag:
useReportWebVitals((metric) => {
window.gtag('event', metric.name, {
value: Math.round(
metric.name === 'CLS' ? metric.value * 1000 : metric.value
),
event_label: metric.id,
non_interaction: true,
})
})Next.js provides powerful tools for performance tracking and analytics. With Web Vitals, instrumentation-client, and external reporting, you can monitor real user experience and optimize your application effectively.