Библиотека Web Vitals предоставляет удобный API для измерения ключевых метрик производительности веб-страниц, таких как Largest Contentful Paint (LCP), First Input Delay (FID), Cumulative Layout Shift (CLS) и другие. Одним из критически важных аспектов при работе с этими метриками является корректное управление повторными вызовами callback, чтобы данные были точными и не искажали аналитику.
В Web Vitals каждый callback, переданный в функцию измерения, может быть вызван несколько раз, но правила поведения зависят от конкретной метрики:
LCP (Largest Contentful Paint) Callback вызывается каждый раз, когда браузер фиксирует новый элемент с большей площадью рендеринга. Однако окончательное значение LCP определяется только в момент завершения загрузки страницы или при переходе в фоновую вкладку. Для предотвращения накопления устаревших данных рекомендуется использовать структуру:
import { getLCP } from 'web-vitals';
let lastLCP;
getLCP((metric) => {
if (!lastLCP || metric.value > lastLCP.value) {
lastLCP = metric;
console.log('Обновленное значение LCP:', metric.value);
}
});
Здесь проверка metric.value > lastLCP.value
обеспечивает, что callback обрабатывает только актуальные
значения.
FID (First Input Delay) FID фиксируется один раз при первом взаимодействии пользователя с сайтом (клик, нажатие клавиши, касание). Callback вызывается единожды, поэтому повторные вызовы не характерны, однако библиотека сохраняет обработчик для потенциального восстановления события при раннем взаимодействии.
CLS (Cumulative Layout Shift) CLS может обновляться многократно, так как метрика суммирует смещения элементов в течение жизненного цикла страницы. Для корректной обработки повторных вызовов используют аккумулятор:
import { getCLS } from 'web-vitals';
let totalCLS = 0;
getCLS((metric) => {
totalCLS += metric.value;
console.log('Текущее суммарное смещение CLS:', totalCLS);
});
Такой подход позволяет отслеживать кумулятивные смещения без потери промежуточных данных.
Web Vitals поддерживает одновременное подключение нескольких callback к одной метрике. Каждый callback получает независимый поток данных, что позволяет:
Пример нескольких подписок на LCP:
import { getLCP } from 'web-vitals';
getLCP((metric) => console.log('Callback 1:', metric.value));
getLCP((metric) => console.log('Callback 2:', metric.value));
Каждый callback вызывается отдельно при каждом новом значении LCP, но библиотека гарантирует, что порядок вызова предсказуем и не приводит к пропуску данных.
Для предотвращения ложного накопления данных при повторных вызовах рекомендуется:
id или entries, что
позволяет фильтровать повторные уведомления.Пример дебаунсинга CLS:
import { getCLS } from 'web-vitals';
let clsValue = 0;
let timer;
getCLS((metric) => {
clsValue += metric.value;
clearTimeout(timer);
timer = setTimeout(() => {
console.log('Отфильтрованное значение CLS:', clsValue);
}, 500);
});
Эти правила обеспечивают точное измерение Web Vitals, предотвращают дублирование данных и позволяют строить надежную аналитику производительности.