Web Vitals — это набор метрик, предназначенных для оценки пользовательского опыта на веб-странице. Они фокусируются на производительности, интерактивности и визуальной стабильности страницы. В контексте JavaScript библиотека Web Vitals предоставляет удобный API для измерения этих метрик и отправки данных на сервер аналитики или для локального анализа.
1. Largest Contentful Paint (LCP) LCP измеряет время, за которое основной контент страницы становится видимым пользователю. Важные аспекты:
<img>,
<video>, <iframe> и блоками текста
внутри <p>,
<h1>–<h6>.observe библиотеки Web
Vitals:import { getLCP } from 'web-vitals';
getLCP(metric => {
console.log(metric.name, metric.value);
});
Особенности: если элемент динамически загружается после первичной загрузки страницы, библиотека автоматически обновит значение LCP.
2. First Input Delay (FID) FID измеряет задержку от первого взаимодействия пользователя с элементом (например, клик, нажатие клавиши) до того момента, когда браузер начинает обработку этого события.
Пример использования:
import { getFID } from 'web-vitals';
getFID(metric => {
console.log(metric.name, metric.value);
});
Особенность: если первый ввод отсутствует, FID не фиксируется, в отличие от LCP.
3. Cumulative Layout Shift (CLS) CLS фиксирует визуальную стабильность страницы, измеряя суммарное смещение всех элементов во время загрузки и пользовательских взаимодействий:
Пример:
import { getCLS } from 'web-vitals';
getCLS(metric => {
console.log(metric.name, metric.value);
});
Совет: чтобы уменьшить CLS, рекомендуется задавать размеры для изображений и видео, избегать динамической вставки контента без резервного места.
Для тонкой трассировки Web Vitals можно использовать встроенный API
PerformanceObserver и маркеры времени
performance.mark() и
performance.measure().
performance.mark('start-lcp') создаёт маркер начала
измерения.performance.measure('duration-lcp', 'start-lcp', 'end-lcp')
вычисляет разницу между маркерами.Пример интеграции с LCP:
performance.mark('start-lcp');
getLCP(metric => {
performance.mark('end-lcp');
performance.measure('lcp-duration', 'start-lcp', 'end-lcp');
console.log(metric.name, metric.value);
});
Примечание: такой подход позволяет детально отслеживать этапы загрузки и выявлять узкие места в производительности.
Web Vitals предоставляет объекты метрик с ключевыми полями:
name — название метрики (LCP,
FID, CLS).value — значение метрики (в миллисекундах для LCP и
FID, без единиц для CLS).delta — разница с предыдущим измерением (полезно для
динамических страниц).id — уникальный идентификатор события для корреляции с
серверными логами.Пример отправки на сервер:
import { getLCP, getFID, getCLS } from 'web-vitals';
function sendToAnalytics(metric) {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(metric),
headers: { 'Content-Type': 'application/json' }
});
}
getLCP(sendToAnalytics);
getFID(sendToAnalytics);
getCLS(sendToAnalytics);
resize или
scroll, влияющих на CLS.Хотите, я могу подготовить подробную схему визуализации всех метрик Web Vitals с примером трассировки на одной странице, чтобы сразу видеть взаимосвязь LCP, FID и CLS?