Web Vitals — это набор метрик, разработанных Google для оценки качества пользовательского опыта на веб-страницах. Основные показатели включают Largest Contentful Paint (LCP), First Input Delay (FID), Cumulative Layout Shift (CLS) и Interaction to Next Paint (INP). В частности, INP является современным инструментом измерения отзывчивости интерфейса и охватывает полный цикл взаимодействия пользователя с элементами страницы.
INP (Interaction to Next Paint) измеряет время от первого действия пользователя (клик, нажатие клавиши, сенсорное взаимодействие) до момента, когда браузер завершает визуальное обновление страницы, связанное с этим действием. В отличие от FID, который фиксирует только задержку первого ввода, INP учитывает все действия пользователя на странице, обеспечивая более комплексное понимание отзывчивости интерфейса.
Ключевые моменты INP:
Для работы с метриками Web Vitals используется официальная библиотека
web-vitals, которая поддерживает все современные метрики,
включая INP.
Установка через npm:
npm install web-vitals
Подключение в скрипте:
import { getINP, getLCP, getCLS, getFID } from 'web-vitals';
Для измерения INP используется функция getINP, которая
принимает коллбек для обработки метрик:
getINP(metric => {
console.log('INP:', metric.value);
console.log('Event type:', metric.entryType);
console.log('Event target:', metric.target);
});
Объект metric содержит следующие свойства:
pointerdown или keydown.Для отправки метрик на сервер используется обычный AJAX-запрос или Fetch API:
getINP(metric => {
fetch('/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(metric)
});
});
При этом важно учитывать:
INP позволяет не только измерять задержку, но и атрибутировать задержку конкретным событиям и элементам.
Пример:
getINP(metric => {
const elementPath = metric.target ? metric.target.tagName : 'unknown';
console.log(`Задержка ${metric.value}мс произошла на элементе ${elementPath}`);
});
Такой подход позволяет:
Для динамических страниц, где пользователь выполняет множество действий, рекомендуется:
Пример агрегирования:
const inpMetrics = [];
getINP(metric => {
inpMetrics.push(metric);
if (inpMetrics.length >= 10) {
fetch('/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(inpMetrics)
});
inpMetrics.length = 0; // очистка массива
}
});
Web Vitals поддерживаются в современных браузерах, включая Chrome, Edge, Firefox и Safari. INP построен поверх Event Timing API, что позволяет получить точные значения времени отклика без сторонних библиотек.
Рекомендации по оптимизации:
INP предоставляет полное представление о циклe взаимодействия пользователя с интерфейсом, позволяя:
INP интегрируется в существующую аналитику так же просто, как FID или LCP, но обеспечивает более глубокое понимание отклика интерфейса на реальное взаимодействие.
Если требуется, могу составить подробный пример полного JS-модуля, который собирает INP для всех интерактивных элементов страницы, аггрегирует метрики и отправляет их на сервер в реальном времени. Это будет полноценный рабочий инструмент для учебника.
Хотите, чтобы я его написал?