Библиотека Web Vitals предоставляет инструменты для измерения ключевых показателей пользовательского опыта на веб-страницах: LCP (Largest Contentful Paint), FID (First Input Delay), CLS (Cumulative Layout Shift) и дополнительные метрики, такие как TTFB (Time to First Byte) и INP (Interaction to Next Paint). Эти метрики критически важны для оценки производительности и стабильности интерфейса.
Для отслеживания метрик используется объект web-vitals в
JavaScript. Примеры базового подключения и измерения:
import { getLCP, getFID, getCLS } from 'web-vitals';
getLCP(metric => {
console.log('LCP:', metric.value);
});
getFID(metric => {
console.log('FID:', metric.value);
});
getCLS(metric => {
console.log('CLS:', metric.value);
});
Каждая функция принимает callback, который вызывается при изменении
соответствующей метрики. Значение метрики содержится в объекте
metric.value, а дополнительные сведения — в
metric.entries и metric.id.
Edge cases в контексте Web Vitals — это ситуации, когда пользовательское взаимодействие или визуальные изменения страницы происходят крайне редко или не происходят вообще. К ним относятся:
Эти случаи критически важны для корректного измерения метрик, поскольку большинство инструментов Web Vitals опирается на события пользовательского взаимодействия и визуальные изменения.
Метрика FID измеряет задержку между первым действием
пользователя и откликом страницы. В случае отсутствия взаимодействий
метрика не фиксируется, так как событие
first-input не происходит.
Для таких сценариев можно использовать INP (Interaction to Next Paint), который отслеживает все возможные взаимодействия, но при их отсутствии значение INP также будет отсутствовать.
Пример мониторинга FID с fallback на INP:
import { getFID, getINP } from 'web-vitals';
getFID(metric => {
if (metric.value === 0) {
console.log('FID отсутствует, используем INP');
getINP(inpMetric => {
console.log('INP:', inpMetric.value);
});
} else {
console.log('FID:', metric.value);
}
});
Метрика CLS измеряет накопленные сдвиги элементов на странице. Если сдвигов нет, значение CLS остаётся 0, что корректно отражает отсутствие визуальной нестабильности. При этом важно различать инициализацию метрики и запись значения:
import { getCLS } from 'web-vitals';
getCLS(metric => {
console.log('CLS:', metric.value); // 0, если сдвигов нет
});
Даже при полной статичности страницы библиотека корректно возвращает 0, что позволяет безопасно собирать данные без ложных тревог.
import { getLCP } from 'web-vitals';
let lcpTimeout = setTimeout(() => {
console.log('LCP не зафиксирован, принудительно устанавливаем 0');
}, 10000); // 10 секунд
getLCP(metric => {
clearTimeout(lcpTimeout);
console.log('LCP:', metric.value);
});
Web Vitals использует PerformanceObserver для
отслеживания событий layout-shift и
largest-contentful-paint. В сценариях без сдвигов или
взаимодействий observer фиксирует отсутствие событий, что отражается в
метриках корректно:
const observer = new PerformanceObserver(list => {
const entries = list.getEntries();
if (entries.length === 0) {
console.log('Событий нет, метрики остаются 0 или отсутствуют');
} else {
entries.forEach(entry => console.log(entry));
}
});
observer.observe({ type: 'layout-shift', buffered: true });
observer.observe({ type: 'largest-contentful-paint', buffered: true });
Использование buffered: true позволяет отследить все
события, даже если они произошли до подключения observer, что критично
для страниц с быстрым рендером и минимальной активностью
пользователя.
buffered: true для
фиксации всех событий.Такой подход обеспечивает надёжную проверку всех критических сценариев, включая страницы без интерактивности и без визуальных изменений.