Ответ вслух Senior Производительность и Web Vitals обновлено

Как улучшить INP

Вопрос

Объясни, из чего складывается INP и как ты его улучшал бы в большом SPA.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

INP это время от действия пользователя до кадра, где виден результат. Оно состоит из трёх частей.

Что должно прозвучать в ответе

  • INP складывается из задержки ввода, времени обработчиков и задержки отрисовки

  • Задержку ввода создают длинные задачи, которые уже идут в момент клика

  • Разбивать работу и уступать главный поток: scheduler.yield или setTimeout

  • Сначала дать визуальный отклик, тяжёлое делать после

  • Сокращать JS, гидрацию и ререндеры: код-сплиттинг, startTransition, мемоизация, виртуализация

  • Мерить в поле с атрибуцией, чтобы знать конкретные медленные взаимодействия

Что могут спросить следом

  • Чем INP отличается от FID?
  • Как startTransition помогает отзывчивости?
  • Почему гидрация может портить INP?

Разбор

INP это время от действия пользователя до кадра, где виден результат. Оно состоит из трёх частей. Задержка ввода: в момент клика главный поток уже занят другой задачей, например гидрацией или таймером аналитики. Время обработки: сами обработчики и ререндер. Задержка отрисовки: пересчёт стилей, раскладки и отрисовка большого DOM. В SPA я бы начал с полевых данных с атрибуцией, чтобы видеть, какие взаимодействия медленные. Дальше: разбить длинные задачи и уступать поток через scheduler.yield, сначала показывать отклик, а тяжёлое делать после кадра. В React неважные обновления оборачиваю в startTransition, длинные списки виртуализирую, убираю лишние ререндеры. Уменьшаю JS и сторонние скрипты, тяжёлые вычисления выношу в воркер. Отдельно смотрю на размер DOM, потому что огромное дерево дорого пересчитывать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.