Interaction to Next Paint (INP) — это показатель производительности веб-страницы, ориентированный на измерение интерактивности. Он оценивает, насколько быстро пользовательский интерфейс реагирует на действия пользователя, такие как клики, нажатия кнопок или ввод текста. В отличие от других метрик Web Vitals, INP фокусируется не только на первичных задержках, но и на задержках, возникающих при обработке длинных задач в браузере.
Длинной задачей считается выполнение JavaScript, которое занимает более 50 миллисекунд без перерыва. Такие задачи блокируют основной поток браузера, что приводит к задержкам отклика интерфейса. Даже если страница визуально загрузилась полностью, пользователь может столкнуться с «тормозами» при взаимодействии, потому что основной поток занят обработкой тяжелых операций.
Ключевые факторы появления длинных задач:
Каждая из этих причин напрямую влияет на значение INP: чем больше и дольше выполняются задачи, тем выше задержка отклика.
INP рассчитывается как медианное значение всех взаимодействий, или, при наличии критических задержек, как 99-й процентиль, чтобы учесть редкие, но заметные «зависания». Алгоритм оценки включает следующие шаги:
Чтобы снизить INP, необходимо разбивать длинные задачи на более короткие, давая браузеру возможность обрабатывать пользовательский ввод между вычислениями.
Стратегии оптимизации:
requestIdleCallback для
выполнения менее критичных операций, когда основной поток свободен.setTimeout или
queueMicrotask.Пример разбивки длинной задачи на небольшие фрагменты:
function processLargeArray(items) {
const chunkSize = 100;
let index = 0;
function processChunk() {
const end = Math.min(index + chunkSize, items.length);
for (; index < end; index++) {
// обработка одного элемента
processItem(items[index]);
}
if (index < items.length) {
setTimeout(processChunk, 0); // освобождаем поток для UI
}
}
processChunk();
}
Такой подход позволяет освобождать основной поток между обработкой частей массива, что снижает задержку отклика и улучшает INP.
Библиотека Web Vitals предоставляет метод getINP,
позволяющий собирать данные о взаимодействии в реальном
времени:
import { getINP } from 'web-vitals';
getINP((metric) => {
console.log(metric.value); // задержка отклика в миллисекундах
});
Ключевые свойства объекта metric:
name — имя метрики (INP).value — время задержки отклика в миллисекундах.id — уникальный идентификатор метрики для текущей
страницы.entries — массив PerformanceEntry, содержащий
информацию о конкретных взаимодействиях.Анализируя entries, можно выявлять конкретные
события, которые вызывают длинные задачи, и оптимизировать их
отдельно.
INP напрямую отражает ощущение плавности взаимодействия. Даже если страница быстро загружается и LCP (Largest Contentful Paint) достигает оптимального значения, длинные задачи могут создавать эффект «подвисаний», что ухудшает общее восприятие сайта. Правильное управление задачами и распределение вычислений обеспечивает быстрый отклик интерфейса и улучшает показатели Web Vitals, что особенно важно для мобильных устройств и слабых процессоров.