Web Vitals — это набор метрик, позволяющих измерять пользовательский опыт на сайте с точки зрения скорости загрузки, интерактивности и стабильности визуального контента. Основные показатели включают Largest Contentful Paint (LCP), First Input Delay (FID) и Cumulative Layout Shift (CLS). Эти метрики предоставляют количественные данные о том, насколько быстро пользователь видит значимый контент, как быстро страница реагирует на действия и насколько стабильно отображается контент при загрузке.
Для работы с библиотекой Web Vitals в JavaScript используется пакет
web-vitals, который позволяет подписываться на события
изменения метрик и получать их значения в реальном времени. Установка
происходит через npm:
npm install web-vitals
Импорт необходимых функций:
import { getLCP, getFID, getCLS, getFCP, getTTFB } from 'web-vitals';
Каждая метрика предоставляется в виде колбэка, который возвращает
объект с ключевыми параметрами: name, value,
delta, entries и id. Значение
entries особенно важно для анализа, так как содержит стек
вызовов и детальные данные об элементах, повлиявших на метрику.
Для детального анализа влияния конкретного кода на Web Vitals важен стек вызовов. Метрики, такие как LCP и CLS, предоставляют массив PerformanceEntry объектов, которые содержат подробные сведения о рендеринге элементов. Пример получения стека для LCP:
getLCP(metric => {
console.log('LCP value:', metric.value);
console.log('LCP entries:', metric.entries);
});
metric.entries возвращает объекты типа
LargestContentfulPaint, содержащие такие свойства, как
element, startTime, size и
url. Используя element, можно определить
конкретный DOM-узел, который стал причиной задержки.
Для CLS важно изучить metric.entries типа
LayoutShift:
getCLS(metric => {
metric.entries.forEach(entry => {
console.log('Shift value:', entry.value);
console.log('Shift sources:', entry.sources.map(source => source.node));
});
});
Каждый объект source в массиве sources
указывает на DOM-элемент, вызвавший смещение. Таким образом, можно
локализовать проблемный код, вызывающий нестабильность интерфейса.
FID измеряет задержку между первым взаимодействием пользователя и
реакцией страницы. Здесь стек вызовов представлен через
EventTiming entries, если браузер поддерживает эту
спецификацию. Для получения деталей:
getFID(metric => {
metric.entries.forEach(entry => {
console.log('Event type:', entry.name);
console.log('Processing start:', entry.processingStart);
console.log('Target element:', entry.target);
});
});
entry.target указывает на элемент, на котором произошло
взаимодействие. Это позволяет сопоставить длинные задачи с конкретным
обработчиком событий, что является ключевым при поиске узких мест в
скриптах.
Для эффективного поиска виновного кода часто используют сочетание Web
Vitals и Performance API. Например,
performance.getEntriesByType('longtask') возвращает массив
долгих задач (Long Tasks), которые могут влиять на FID и LCP.
Объединение данных с Web Vitals дает полное понимание того, какие
скрипты вызывают проблемы:
const longTasks = performance.getEntriesByType('longtask');
longTasks.forEach(task => {
console.log('Long task start:', task.startTime);
console.log('Duration:', task.duration);
console.log('Attribution:', task.attribution);
});
task.attribution содержит стек вызовов, где каждая
запись указывает на скрипт и функцию, участвовавшие в выполнении
задачи.
entries.element и target определить узлы, влияющие на
LCP, CLS и FID.longtask и layoutShift для нахождения участков
кода, вызывающих задержки или нестабильность.attribution и стек вызовов, чтобы связать проблему с
конкретным файлом или функцией.Асинхронные операции, такие как загрузка изображений, выполнение fetch-запросов и динамическая вставка контента, напрямую влияют на LCP и CLS. Для точной диагностики следует:
entries и анализировать
startTime относительно времени загрузки страницы.requestIdleCallback и
PerformanceObserver для мониторинга асинхронных изменений
DOM.Для системного анализа можно интегрировать Web Vitals с бэкендом, отправляя JSON-объекты метрик и стеков вызовов на сервер. Это позволяет строить:
Пример отправки метрик на сервер:
function sendToServer(metric) {
fetch('/log-metrics', {
method: 'POST',
body: JSON.stringify(metric),
headers: { 'Content-Type': 'application/json' }
});
}
getLCP(sendToServer);
getFID(sendToServer);
getCLS(sendToServer);