Skip to content

INP-оптимизация в Next.js 16: почему 43% сайтов проваливают метрику и как это исправить

INP заменила FID в качестве Core Web Vital в марте 2024 года. Два года спустя 43% мобильных сайтов по-прежнему не проходят порог в 200 мс. Это не проблема инструментов - это архитектурная проблема.

Диаграмма оптимизации INP - планировщик задач главного потока
Опубликовано:Обновлено:Время чтения:14 мин

Аннотация. 12 марта 2024 года рабочая группа W3C по веб-производительности официально заменила First Input Delay (FID) на Interaction to Next Paint (INP) как Core Web Vital. Переход обнажил системную слепую зону: 94% сайтов имели оценку 'Good' по FID, но лишь 54% прошли более строгий порог INP. Согласно HTTP Archive Web Almanac 2025, 43% мобильных источников по-прежнему не укладываются в 200 мс. Статья представляет формальную таксономию причин отказов, декомпозиционную модель трёх фаз и шесть конкретных векторов оптимизации для приложений на Next.js 16 с данными производственных бенчмарков.

Смена парадигмы: почему FID был недостаточным прокси

FID измерял исключительно задержку ввода перед самым первым взаимодействием на странице - как правило, кликом до завершения гидратации JavaScript. Фундаментальный статистический изъян: пользователь, нажавший 'Добавить в корзину' через три секунды после загрузки, вообще не влияет на показатель FID - независимо от скорости отклика интерфейса. INP фиксирует задержку всех квалифицированных взаимодействий за сессию и возвращает значение на уровне 98-го перцентиля. По Web Almanac 2025: снижение общего показателя прохождения CWV на 5 п.п. после перехода с FID на INP. Google подтвердил в мае 2023 года, что INP входит в сигналы page experience для органического ранжирования.

Модель измерения: три субинтервала и пороги

  • Задержка ввода (input delay): от аппаратного прерывания до начала выполнения первого обработчика события.
  • Время обработки (processing time): суммарная длительность всех синхронных обработчиков и DOM-мутаций.
  • Задержка презентации (presentation delay): от завершения последнего обработчика до коммита кадра в compositor.
  • Good: ≤ 200 мс | Needs Improvement: 201–500 мс | Poor: > 500 мс.
  • Правило 75-го перцентиля: не менее 75% сессий должны иметь 'Good' INP для классификации URL в CrUX.

Таксономия причин отказов

  • Монополизация главного потока (~67%): Синхронный блок JS > 50 мс блокирует обработку событий ввода. Наиболее частая причина в React-приложениях.
  • Гидратация (~20%): На Moto G Power гидратация 200-компонентной страницы занимает 350–800 мс непрерывного времени главного потока.
  • Re-render-трэшинг (~10%): Без мемоизации один setFilter() провоцирует O(n) вычислений компонентов.
  • Сторонние скрипты (~3%): 47 сторонних запросов на медианной eCommerce-странице, 1.2 с блокировки главного потока (HTTP Archive 2025).

Вектор I: scheduler.yield() - декомпозиция главного потока

  • Антипаттерн: Последовательный useEffect с 4+ функциями инициализации - составная задача 300–700 мс.
  • Паттерн: async function init() { await step1(); await scheduler.yield(); await step2(); } - каждый yield создаёт границу задачи для очереди событий ввода.
  • Полифилл: const yield_ = () => 'scheduler' in window ? scheduler.yield() : new Promise(r => setTimeout(r, 0));
  • Эффект: Фрагментация одной задачи 500 мс в несколько задач < 50 мс. Снижение input delay на 60–150 мс.

Вектор II: Компилятор React 19 и автоматическая мемоизация

React Compiler (v1.0, октябрь 2025) автоматически вставляет мемоизацию там, где статический анализ доказывает ссылочную стабильность, устраняя потребность в ручных React.memo, useMemo, useCallback. Бенчмарки Meta и Vercel: −20–40% повторных рендеров, −30–80 мс INP на листинговых страницах. Включение в Next.js 15.1+: experimental: { reactCompiler: true }. Проверка совместимости: npx react-compiler-healthcheck.

Вектор III: React Server Components

Компоненты без browser API, обработчиков событий и состояния рендерятся на сервере и не добавляют JavaScript в клиентский бандл. Меньший бандл → быстрее парсинг → короче гидратация → меньше конкуренции → ниже задержка ввода. По данным Vercel: миграция 200 КБ на RSC сокращает TTI на 800 мс–1.2 с. Ключевое правило: размещайте 'use client' максимально низко - только на действительно интерактивных 'островах'.

Вектор IV: startTransition

  • Паттерн фильтрации: startTransition(() => { setFilter(v); }) - React прерывает дорогой рендер при новом взаимодействии.
  • Важно: Срочные обновления (инпут, кнопки) - синхронными. startTransition только для 'навигационных' переходов.
  • `isPending`: Для skeleton-состояний во время отложенного рендера - предотвращает CLS.

Вектор V: Изоляция сторонних скриптов

  • Partytown: Web Worker для сторонних скриптов. TBT −200–600 мс на страницах с 5+ маркетинговыми скриптами.
  • Facade Pattern: Заглушка вместо виджета; реальный скрипт - при первом взаимодействии.
  • Next.js Script: lazyOnload → пиксели; afterInteractive → A/B-тестирование; beforeInteractive → только CMP/полифилы.

Вектор VI: Архитектурные паттерны Next.js 16

  • Partial Prerendering: Статическая оболочка мгновенно из edge-кэша, персонализированный контент - асинхронный стриминг. export const experimental_ppr = true.
  • `useOptimistic`: Немедленный отклик UI до ответа сервера. Воспринимаемый INP → 0 мс.
  • Кэширование Route Handler: s-maxage=60, stale-while-revalidate=300 - устраняет искусственные задержки клиентской навигации.

Инфраструктура измерений и производственные бенчмарки

  • CrUX API: Авторитетные полевые данные - 75-й перцентиль реальных пользователей.
  • web-vitals.js: onINP(({ value, rating }) => sendToAnalytics({ inp: value, rating })); - точный алгоритм CrUX.
  • Lighthouse CI: TBT ≤ 300 мс как ворота регрессии в CI/CD.
  • RSC: INP −120–280 мс | scheduler.yield(): −60–150 мс | Compiler: −30–80 мс | Partytown: TBT −200–600 мс.
  • Совокупно: Переход из 'Needs Improvement' в 'Good' достижим при базовом INP < 450 мс. Сайты с 'Good' CWV: +24% мобильная конверсия (Google, 2024).

Заключение

INP - фундаментальный архитектурный сигнал о качестве взаимодействия фронтенд-системы с главным потоком браузера. Устойчивость показателя отказов в 43% спустя два года отражает архитектурную природу проблемы - она не решается точечными правками. Шесть представленных векторов образуют системный подход к управлению главным потоком как явно управляемым ресурсом. Если ваш INP превышает 200 мс - это конкретная инженерная задача с устранимой первопричиной. Для структурированного аудита: услуга Core Web Vitals | кейсы | консультация.

Похожие статьи