awesome-everything EN
↑ Обратно к восхождению

Браузер и фронтенд-рантайм

Event loop: вытащи взаимодействие из INP-ада

Суть Практический проект — загони реальное взаимодействие в long task, диагностируй через LoAF, поделить его под планку 50 мс и докажи фикс INP числами до/после и CI-гейтом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 240 min

Читать про long task — не то же, что вытащить взаимодействие из него. Собери страницу с намеренно дёргающимся взаимодействием, измерь его INP под реалистичным троттлингом, диагностируй виновный кадр через LoAF и применяй дисциплину yield из юнита, пока ввод не станет отвечать за один кадр — с доказательством на каждом шаге.

Цель

Преврати модель тайминга юнита в воспроизводимый инженерный цикл: воспроизведи long task, атрибутируй его из телеметрии, поделить под планку 50 мс реальным task-уровневым yield, защити выигрыш CI-гейтом и проверь числами INP до/после.

Проект
0 из 7
Цель

Возьми взаимодействие, блокирующее main thread (своё приложение или стартер ниже), и снизь его INP до уровня под 200 мс p75 на троттленном железе — не удаляя фичу — доказывая каждый шаг измерениями, а не оценками.

Требования
Критерии приёмки
  • Таблица до/после: INP p75, самый долгий task на main thread (мс) и число пропущенных кадров во время фиксированной последовательности набора — всё измерено при троттлинге CPU 4x, не оценено.
  • Ни один task на main thread не превышает 50 мс в трассе после; поток LoAF больше не репортит медленный кадр для взаимодействия.
  • INP p75 держится под 200 мс для взаимодействия на устойчивой скорости набора.
  • Абзац-описание с указанием, какой yield-примитив ты использовал и почему microtask-yield (await Promise.resolve()) не сработал бы, со ссылкой на твою трассу.
Senior-стретч
  • Добавь INP CI-гейт: Playwright-тест в headless Chrome с --cpu-throttling-rate=4, проигрывающий последовательность набора, измеряющий INP тем же кодом PerformanceObserver и валящий сборку, если p75 пересекает бюджет. Покажи, что он ловит регрессию, которую ты намеренно вернул.
  • Добавь guard от starvation: напиши классическую заморозку Promise.resolve().then(self), наблюдай ноль отрисованных кадров и INP свыше 1 с в трассе, затем разорви цикл одним task-уровневым yield и покажи восстановление страницы.
  • Перенеси тот же тяжёлый обработчик на Node HTTP-эндпоинт, измерь event-loop lag через perf_hooks.monitorEventLoopDelay() под нагрузкой и покажи, что фикс с Worker-потоком снижает p99 lag так же, как браузерный фикс снизил INP.
  • Прогони LoAF sourceCharPosition через реальный sourcemap (библиотека source-map или резолвер уровня Sentry), чтобы телеметрия репортила исходную file:line, а не позицию в бандле.
Итог

Это цикл, который ты будешь прогонять в каждом реальном инциденте INP: воспроизведи long task под троттлингом, атрибутируй медленный кадр через LoAF плюс sourcemap, поделить работу под планку 50 мс настоящим task-уровневым yield (никогда microtask), вынеси CPU-bound работу на Worker, когда деления мало, и проверь числами INP до/после при идентичной нагрузке. Закрой это в CI тем же троттлингом, чтобы выигрыш не откатился тихо. Сделав это однажды на игрушечной странице, ты превращаешь production-версию в мышечную память.

Продолжить восхождение ↑Render pipeline: шесть стадий от байтов до пикселей
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.