Skip to main content

useWebVitals

Description and use case

useWebVitals provides live Core Web Vitals data and optional metric callbacks for analytics pipelines.

API signature

function useWebVitals(options?: UseWebVitalsOptions): WebVitalsState;

Parameters

NameTypeRequiredDescription
options.onMetric(metric: WebVitalMetric) => voidNoCallback fired whenever a metric is updated.
options.enabledbooleanNoSet false to disable subscriptions (useful for SSR/tests).

Return value

FieldTypeDescription
CLSWebVitalMetric | nullCumulative Layout Shift metric.
LCPWebVitalMetric | nullLargest Contentful Paint metric.
INPWebVitalMetric | nullInteraction to Next Paint metric.
FCPWebVitalMetric | nullFirst Contentful Paint metric.
TTFBWebVitalMetric | nullTime to First Byte metric.

Live interactive demo (StackBlitz)

GitHub Pages does not serve the isolation headers required for embedded StackBlitz WebContainers. Open the demo in StackBlitz to run it interactively.

Code example

import { useWebVitals } from 'react-perf-hooks';

export function VitalsOverlay() {
const vitals = useWebVitals({
onMetric: (metric) => {
navigator.sendBeacon('/api/vitals', JSON.stringify(metric));
},
});

return <p>LCP: {vitals.LCP?.value ?? 'waiting'}</p>;
}

Companion article