Эта функция вызывается, когда окончательные значения для любой из метрик завершают расчёт на странице. Вы можете использовать её для вывода результатов в консоль или отправки в определённую конечную точку.
Объект metric, передаваемый в функцию, содержит несколько свойств:
id: Уникальный идентификатор метрики в контексте текущей загрузки страницы
name: Название метрики
startTime: Первая зарегистрированная временная метка записи производительности в миллисекундах (если применимо)
value: Значение или длительность в миллисекундах записи производительности
Web Vitals — это набор полезных метрик, которые позволяют оценить пользовательский опыт взаимодействия с веб-страницей. Включаются следующие основные метрики:
Вы можете обрабатывать все результаты этих метрик, используя метку web-vital:
export function reportWebVitals(metric) { if (metric.label === 'web-vital') { console.log(metric) // Объект метрики ({ id, name, startTime, value, label }) выводится в консоль }}
Также есть возможность обрабатывать каждую метрику отдельно:
export function reportWebVitals(metric) { switch (metric.name) { case 'FCP': // обработка результатов FCP break case 'LCP': // обработка результатов LCP break case 'CLS': // обработка результатов CLS break case 'FID': // обработка результатов FID break case 'TTFB': // обработка результатов TTFB break case 'INP': // обработка результатов INP (примечание: INP всё ещё экспериментальная метрика) break default: break }}
Для измерения этих метрик используется сторонняя библиотека web-vitals. Совместимость с браузерами зависит от конкретной метрики, поэтому обратитесь к разделу Поддержка браузеров, чтобы узнать, какие браузеры поддерживаются.
В дополнение к основным метрикам, перечисленным выше, есть несколько дополнительных пользовательских метрик, которые измеряют время гидратации и отрисовки страницы:
Next.js-hydration: Время, необходимое для начала и завершения гидратации страницы (в мс)
Next.js-route-change-to-render: Время, необходимое для начала отрисовки страницы после изменения маршрута (в мс)
Next.js-render: Время, необходимое для завершения отрисовки страницы после изменения маршрута (в мс)
Вы можете обрабатывать все результаты этих метрик, используя метку custom:
export function reportWebVitals(metric) { if (metric.label === 'custom') { console.log(metric) // Объект метрики ({ id, name, startTime, value, label }) выводится в консоль }}
Также есть возможность обрабатывать каждую метрику отдельно:
export function reportWebVitals(metric) { switch (metric.name) { case 'Next.js-hydration': // обработка результатов гидратации break case 'Next.js-route-change-to-render': // обработка результатов изменения маршрута до отрисовки break case 'Next.js-render': // обработка результатов отрисовки break default: break }}
Эти метрики работают во всех браузерах, поддерживающих User Timing API.
С помощью функции ретрансляции вы можете отправлять результаты на любую конечную точку для измерения и отслеживания реальной производительности пользователей на вашем сайте. Например:
export function reportWebVitals(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 позволяет вручную строить распределения метрик (для расчёта процентилей и т.д.)
export function reportWebVitals({ id, name, label, value }) { // Используйте `window.gtag`, если вы инициализировали Google Analytics, как в этом примере: // https://github.com/vercel/next.js/blob/canary/examples/with-google-analytics/pages/_app.js window.gtag('event', name, { event_category: label === 'web-vital' ? 'Web Vitals' : 'Next.js custom metric', value: Math.round(name === 'CLS' ? value * 1000 : value), // значения должны быть целыми числами event_label: id, // уникальный id для текущей загрузки страницы non_interaction: true, // не влияет на показатель отказов. })}