First Input Delay (FID) — метрика, измеряющая задержку первого взаимодействия пользователя с веб-страницей. FID фиксирует время между первым действием пользователя (например, клик или нажатие клавиши) и моментом, когда браузер фактически способен обработать это событие. Основное ограничение FID — он учитывает только первое взаимодействие, игнорируя последующие действия на странице. Это создаёт неполную картину интерактивности, особенно на страницах с динамическим контентом и длительной загрузкой скриптов.
Interaction to Next Paint (INP) — новая метрика Web Vitals, призванная заменить FID. INP учитывает все пользовательские взаимодействия на странице, измеряя задержку реакции на каждое событие и вычисляя медианное или максимальное значение для всех взаимодействий. Такой подход позволяет получить более точную и репрезентативную оценку интерактивности страницы. INP измеряет:
Для работы с метриками используется официальная библиотека web-vitals. Установка через npm или yarn:
npm install web-vitals
# или
yarn add web-vitals
Импорт необходимых функций:
import { getFID, getINP } from 'web-vitals';
INP предоставляет объект события с ключевыми свойствами:
value — задержка события в миллисекундах.id — уникальный идентификатор события.entries — массив всех наблюдаемых событий с их
детализацией.Пример использования:
getINP(metric => {
console.log('INP value:', metric.value);
console.log('Event entries:', metric.entries);
});
Особенности обработки:
entries) для
анализа узких мест.Исходный код с FID:
getFID(metric => {
console.log('FID value:', metric.value);
});
Преобразованный код с INP:
getINP(metric => {
console.log('INP value:', metric.value);
metric.entries.forEach(entry => {
console.log('Interaction type:', entry.name, 'Duration:', entry.duration);
});
});
Важные изменения:
entry) имеет длительность и тип события.getFID на getINP.async и defer для скриптов уменьшают задержку
интерактивности.requestIdleCallback или setTimeout для тяжелых
операций снижает влияние на общую метрику.import { getINP } from 'web-vitals';
function reportINPToAnalytics(metric) {
const data = {
value: metric.value,
entries: metric.entries.map(entry => ({
name: entry.name,
duration: entry.duration,
startTime: entry.startTime
}))
};
fetch('/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
}
getINP(reportINPToAnalytics);
Преимущества такой реализации:
| Метрика | Измеряет | Преимущество | Ограничение |
|---|---|---|---|
| FID | Первое взаимодействие | Простая реализация | Игнорирует последующие события |
| INP | Все взаимодействия | Репрезентативная интерактивность | Немного более сложная обработка |
Переход на INP позволяет перейти от оценки лишь первого впечатления пользователя к объективной оценке всей интерактивности страницы, что критично для современных веб-приложений с динамическим контентом.