Web Vitals — это набор метрик, предназначенных для измерения ключевых аспектов производительности веб-страниц, напрямую влияющих на пользовательский опыт. Основные показатели включают Largest Contentful Paint (LCP), First Input Delay (FID) и Cumulative Layout Shift (CLS), а также дополнительные метрики, такие как Interaction to Next Paint (INP) и Total Blocking Time (TBT).
JavaScript предоставляет средства для работы с Web Vitals через
библиотеку web-vitals.
Она упрощает сбор метрик и интеграцию с аналитическими системами.
Установка через npm или yarn:
npm install web-vitals
# или
yarn add web-vitals
Импорт функций в коде:
import { getCLS, getFID, getLCP, getINP, getTTFB } from 'web-vitals';
Каждая функция принимает callback, который будет вызван при получении значения метрики:
getLCP(metric => {
console.log('LCP:', metric.value);
});
Назначение: измеряет время рендеринга самого большого видимого элемента на странице.
Применение:
getLCP(metric => {
console.log('LCP:', metric.value); // значение в миллисекундах
});
Интерпретация:
LCP измеряет именно время появления наиболее значимого элемента на экране, например, заголовка, изображения или блока контента.
Назначение: измеряет задержку отклика страницы на первое взаимодействие пользователя (клик, нажатие клавиши).
Применение:
getFID(metric => {
console.log('FID:', metric.value);
});
Интерпретация:
FID отражает реактивность страницы и чувствительность интерфейса.
Назначение: измеряет суммарную нестабильность макета, выраженную в смещениях элементов во время загрузки.
Применение:
getCLS(metric => {
console.log('CLS:', metric.value);
});
Интерпретация:
CLS критичен для визуальной стабильности страницы и предотвращения неожиданных сдвигов контента.
Назначение: измеряет задержку между взаимодействием пользователя и следующей отрисовкой.
Применение:
getINP(metric => {
console.log('INP:', metric.value);
});
INP служит расширением FID, учитывая не только первое взаимодействие, но и последовательные события на протяжении сессии.
Назначение: измеряет общее время, в течение которого основной поток заблокирован длительными задачами (>50 мс).
Применение:
TBT можно рассчитать с использованием PerformanceObserver:
const observer = new PerformanceObserver(list => {
for (const entry of list.getEntries()) {
if (entry.duration > 50) {
console.log('Blocked for:', entry.duration, 'ms');
}
}
});
observer.observe({ type: 'longtask', buffered: true });
TBT полезен для оценки интерактивности страницы и оптимизации скриптов.
Метрики можно отправлять на сервер или в аналитические системы:
function sendToAnalytics(metric) {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(metric),
headers: { 'Content-Type': 'application/json' },
});
}
getLCP(sendToAnalytics);
getFID(sendToAnalytics);
getCLS(sendToAnalytics);
getINP(sendToAnalytics);
Сбор и анализ этих данных позволяет выявлять проблемные участки страницы и улучшать пользовательский опыт.
Библиотека Web Vitals автоматически использует PerformanceObserver, но его можно подключать вручную для дополнительных метрик:
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
entries.forEach(entry => {
console.log(entry.name, entry.startTime, entry.duration);
});
});
observer.observe({ type: 'paint', buffered: true });
observer.observe({ type: 'largest-contentful-paint', buffered: true });
observer.observe({ type: 'layout-shift', buffered: true });
Такой подход позволяет создавать собственные метрики и расширять стандартный набор Web Vitals.
Эта структура кода и методики измерения Web Vitals дают полное понимание, как оценивать и улучшать ключевые показатели пользовательского опыта через JavaScript.