Web Vitals — это набор метрик, предназначенных для измерения качества пользовательского опыта на веб-страницах. Одной из ключевых задач является определение наихудшего взаимодействия пользователя с сайтом, что позволяет выявлять узкие места в производительности и оптимизировать интерфейс.
На практике наихудшее взаимодействие определяется по показателю Largest Contentful Paint (LCP), First Input Delay (FID) и Cumulative Layout Shift (CLS). Эти метрики оценивают визуальное наполнение страницы, отклик на действия пользователя и стабильность элементов интерфейса соответственно.
Web Vitals предоставляет официальный пакет web-vitals,
который позволяет регистрировать метрики в реальном времени:
import {getCLS, getFID, getLCP} from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getLCP(console.log);
Каждая функция принимает callback, который получает объект метрики:
{
name: 'LCP', // Имя метрики
value: 1234.56, // Значение в миллисекундах или баллах
delta: 0, // Изменение значения с предыдущей отправки
id: 'v1-12345' // Уникальный идентификатор измерения
}
Для выявления наихудшего взаимодействия требуется собрать все события FID и LCP, а затем выбрать максимальные значения:
Сбор событий FID FID фиксирует задержку отклика на первый ввод пользователя:
let worstFID = 0;
getFID(metric => {
if (metric.value > worstFID) {
worstFID = metric.value;
console.log('Наихудший FID:', worstFID);
}
});
В этом коде происходит постоянное сравнение текущего события с предыдущим наихудшим.
Сбор событий LCP LCP фиксирует время рендеринга наибольшего видимого элемента на экране:
let worstLCP = 0;
getLCP(metric => {
if (metric.value > worstLCP) {
worstLCP = metric.value;
console.log('Наихудший LCP:', worstLCP);
}
});
Этот метод позволяет выбрать событие с максимальной задержкой рендеринга, что важно для анализа визуальной производительности.
Сбор событий CLS CLS фиксирует смещения элементов страницы, влияющие на визуальную стабильность:
let worstCLS = 0;
getCLS(metric => {
if (metric.value > worstCLS) {
worstCLS = metric.value;
console.log('Наихудший CLS:', worstCLS);
}
});
CLS измеряется в баллах от 0 до бесконечности, где более высокие значения указывают на более заметные сдвиги.
Для комплексной оценки взаимодействия можно использовать взвешенную шкалу, учитывая важность каждой метрики:
function calculateInteractionScore(fid, lcp, cls) {
return (fid * 0.4) + (lcp * 0.4) + (cls * 0.2);
}
let worstInteractionScore = 0;
let worstInteractionMetric = null;
function evaluateWorstInteraction(metric) {
const score = calculateInteractionScore(
metric.name === 'FID' ? metric.value : 0,
metric.name === 'LCP' ? metric.value : 0,
metric.name === 'CLS' ? metric.value : 0
);
if (score > worstInteractionScore) {
worstInteractionScore = score;
worstInteractionMetric = metric;
console.log('Наихудшее взаимодействие:', worstInteractionMetric);
}
}
Такой подход позволяет не ограничиваться одной метрикой, а оценивать взаимодействие пользователя комплексно, учитывая как задержки отклика, так и визуальную стабильность страницы.
Для оптимизации анализа можно хранить метрики в объекте:
const worstMetrics = {
FID: {value: 0, id: ''},
LCP: {value: 0, id: ''},
CLS: {value: 0, id: ''}
};
function updateWorst(metric) {
if (metric.value > worstMetrics[metric.name].value) {
worstMetrics[metric.name] = {value: metric.value, id: metric.id};
console.log(`Наихудший ${metric.name}:`, worstMetrics[metric.name]);
}
}
Эта структура позволяет быстро находить максимальные значения каждой метрики и использовать их для дальнейшего анализа.
Для массового сбора данных на продуктивных страницах применяется автоматическая отправка событий на аналитический сервер:
function sendMetricToServer(metric) {
fetch('/api/metrics', {
method: 'POST',
body: JSON.stringify(metric),
headers: {'Content-Type': 'application/json'}
});
}
getFID(sendMetricToServer);
getLCP(sendMetricToServer);
getCLS(sendMetricToServer);
Это обеспечивает централизованное хранение данных и позволяет строить отчеты по наихудшим взаимодействиям в разрезе устройств, браузеров и регионов.