Web Vitals — это набор ключевых метрик, оценивающих пользовательский опыт с точки зрения производительности веб-страниц. Они помогают измерять, насколько быстро страница загружается, насколько быстро становится интерактивной и насколько стабильно отображается для пользователя.
Среди основных показателей выделяются:
Для начала работы с библиотекой необходимо установить её через npm:
npm install web-vitals
Или подключить через CDN:
<script src="https://unpkg.com/web-vitals@2.1.4/dist/web-vitals.iife.js"></script>
После подключения можно использовать функции для измерения основных метрик:
import { getLCP, getFID, getCLS } from 'web-vitals';
getLCP(console.log);
getFID(console.log);
getCLS(console.log);
Каждая из функций принимает callback, который получает объект метрики
с ключевыми полями: name, value и
id.
Largest Contentful Paint (LCP)
LCP отслеживает время рендеринга самого крупного блока контента, видимого пользователю. Крупный блок может быть текстом, изображением или видео.
Пример использования:
import { getLCP } from 'web-vitals';
getLCP((metric) => {
console.log('LCP:', metric.value, 'ms');
});
Можно отправлять данные на сервер для аналитики:
getLCP((metric) => {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(metric),
keepalive: true
});
});
First Input Delay (FID)
FID измеряет интерактивность страницы. Чем меньше задержка между действием пользователя и реакцией страницы, тем лучше UX.
import { getFID } from 'web-vitals';
getFID((metric) => {
console.log('FID:', metric.value, 'ms');
});
FID полезен для анализа того, как скрипты и тяжелые ресурсы влияют на реакцию интерфейса.
Cumulative Layout Shift (CLS)
CLS фиксирует визуальные сдвиги элементов страницы. Даже если страница быстро загрузилась, резкие перемещения элементов создают негативное впечатление.
import { getCLS } from 'web-vitals';
getCLS((metric) => {
console.log('CLS:', metric.value);
});
Web Vitals позволяет настраивать измерения и объединять их с пользовательской аналитикой:
import { getLCP, getFID, getCLS } from 'web-vitals';
function sendToAnalytics(metric) {
const body = JSON.stringify({
metricName: metric.name,
value: metric.value,
id: metric.id
});
navigator.sendBeacon('/analytics', body);
}
getLCP(sendToAnalytics);
getFID(sendToAnalytics);
getCLS(sendToAnalytics);
Использование navigator.sendBeacon гарантирует, что
данные будут отправлены даже при закрытии вкладки пользователем.
Метрики Web Vitals не существуют сами по себе, их нужно интерпретировать в контексте страницы:
Web Vitals легко интегрируется с Google Analytics 4 и другими аналитическими платформами. Пример для GA4:
import { getLCP, getFID, getCLS } from 'web-vitals';
function sendToGA(metric) {
gtag('event', metric.name, {
event_category: 'Web Vitals',
value: metric.value,
event_label: metric.id,
non_interaction: true
});
}
getLCP(sendToGA);
getFID(sendToGA);
getCLS(sendToGA);
Такой подход позволяет отслеживать показатели UX в реальном времени на всех страницах сайта.
requestIdleCallback, оптимизация
рендеринга.Web Vitals превращает субъективное ощущение скорости и стабильности страницы в конкретные, измеримые показатели, что делает оптимизацию пользовательского опыта структурированной и эффективной.