Prerendering позволяет предварительно загружать страницы перед тем, как пользователь действительно на них перейдет. Это снижает время до интерактивности и улучшает воспринимаемую производительность, но также вносит специфические нюансы в измерение Web Vitals. Библиотека Web Vitals в JavaScript предоставляет API для отслеживания ключевых метрик производительности, таких как Largest Contentful Paint (LCP), First Input Delay (FID), Cumulative Layout Shift (CLS) и Interaction to Next Paint (INP), которые необходимо корректно интерпретировать при prerendering.
Когда страница находится в состоянии prerendering:
Для корректного измерения важно отслеживать событие
visibilitychange или использовать свойство
document.prerendering (доступно в современных браузерах),
чтобы знать момент активации страницы.
if ('prerendering' in document && document.prerendering) {
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
startWebVitalsTracking();
}
});
} else {
startWebVitalsTracking();
}
Функция startWebVitalsTracking запускает регистрацию
метрик через Web Vitals:
import { getCLS, getFID, getLCP, getINP } from 'web-vitals';
function startWebVitalsTracking() {
getCLS(console.log); // или отправка на аналитический сервер
getFID(console.log);
getLCP(console.log);
getINP(console.log);
}
Важный момент: вызов этих функций до того, как страница станет видимой, приведет к отсутствию данных, поскольку все метрики ориентируются на реальные пользовательские события и визуальные изменения.
loading="lazy", LCP
может не зафиксироваться сразу, даже после активации. Рекомендуется
использовать IntersectionObserver или слушать событие
load для ключевых медиа-ресурсов.Cumulative Layout Shift измеряет неожиданные смещения элементов:
getCLS(metric => {
console.log('CLS:', metric.value);
});
FID измеряет задержку первого взаимодействия, INP – качество интерактивности на протяжении сессии:
visibilityState === 'visible'.visibilitychange позволяет собирать чистые данные для
анализа.function initWebVitals() {
const startTracking = () => {
import('web-vitals').then(({ getCLS, getFID, getLCP, getINP }) => {
getCLS(sendMetric);
getFID(sendMetric);
getLCP(sendMetric);
getINP(sendMetric);
});
};
if ('prerendering' in document && document.prerendering) {
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
startTracking();
}
});
} else {
startTracking();
}
function sendMetric(metric) {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(metric),
headers: { 'Content-Type': 'application/json' }
});
}
}
initWebVitals();
Такой подход обеспечивает точное измерение метрик Web Vitals для страниц с prerendering, минимизируя искажения данных и позволяя получить достоверные показатели производительности.