Браузер и фронтенд-рантайм
Event loop: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение из реального инцидента производительности — не определение для заучивания, а в какую очередь попадает примитив и чего это стоит следующему кадру.
Убедись, что связываешь семантику очередей, шаг рендеринга, троттлинг таймеров, starvation и различия рантаймов — тот синтез, к которому вели отдельные уроки.
Внутри click-обработчика ты вызываешь setTimeout(t, 0), затем queueMicrotask(m), затем обработчик возвращается. В каком порядке выполнятся t и m относительно следующего paint?
Click-обработчик выполняется 400 мс. Что из этого продолжает работать во время блокировки и почему?
Тебе нужно сделать 200 мс работы, не заморозив ввод. Ты пробуешь await Promise.resolve() между чанками, и страница всё равно зависает. Почему и что реально уступает поток?
Фоновая вкладка крутит setInterval(poll, 1000). Спустя несколько минут в фоне, как часто срабатывает колбэк и что с этим складывается?
Поисковый инпут показывает INP 410 мс. Long Tasks API логирует task на 312 мс, но атрибутирует его лишь как 'same-origin'. Какой следующий инструмент верный и почему?
Библиотека, протестированная только в Node, цепляет process.nextTick(a), затем Promise.resolve().then(b) и полагается, что a выполнится до b. Перенесённая в браузер через polyfill для nextTick, она переворачивает порядок. Почему?
Сквозная линия юнита — одно решение: в какую очередь попадает этот примитив и чего это стоит следующему кадру. Microtask (колбэки промисов, queueMicrotask, MutationObserver) дренируются до рендеринга и starve его при самопланировании; task (setTimeout, MessageChannel, диспетчеризация ввода) уступают рендерингу, но платят клампами и троттлингом; rAF выполняется только на границе кадра. Диагностируй воспринимаемую задержку через INP, атрибутируй её через LoAF плюс sourcemap и помни, что Node переупорядочивает всё это, ставя process.nextTick выше microtask.