Event Loop браузера

↑ 2.1 JavaScript: продвинутый · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Как event loop связан с рендерингом: requestAnimationFrame, layout thrashing, «подвисания» интерфейса.

Объяснение

Один цикл в браузере (упрощённо):

flowchart LR
  T[Макрозадача] --> M[Все микрозадачи]
  M --> R{Пора рендерить? ~16 мс}
  R -- да --> RAF[requestAnimationFrame коллбэки] --> S[Style + Layout] --> P[Paint] --> C[Composite]
  R -- нет --> N[Следующая макрозадача]
  C --> N
APIКогда выполняется
setTimeoutмакрозадача после задержки
requestAnimationFrameперед следующей отрисовкой (~60 Гц)
requestIdleCallbackв простое, для низкоприоритетной работы
queueMicrotask / Promiseдо рендера, сразу после задачи
scheduler.postTask, scheduler.yieldприоритетные задачи, уступка потоку
События вводамакрозадачи с высоким приоритетом

Бюджет кадра — ~16 мс: JS, style, layout, paint должны уложиться, иначе пропуски кадров (jank). INP измеряет отзывчивость на ввод.

Layout thrashing: чередование чтения (offsetHeight, getBoundingClientRect) и записи стилей в цикле заставляет браузер пересчитывать layout многократно.

// Плохо
for (const el of els) { el.style.width = el.offsetWidth + 10 + "px"; }     // read/write чередуются
// Хорошо: сначала читаем всё, затем пишем
const widths = els.map(el => el.offsetWidth);
els.forEach((el, i) => el.style.width = widths[i] + 10 + "px");
requestAnimationFrame(() => { /* визуальные изменения синхронно с кадром */ });

Выносите тяжёлое: Web Workers, OffscreenCanvas, разбиение на чанки, content-visibility: auto, виртуализация списков.

Нюансы и подводные камни

  • Фоновые вкладки: таймеры и rAF замедляются/останавливаются.
  • Долгие задачи (> 50 мс) — «long tasks», ухудшают INP.
  • alert/confirm блокируют цикл.
  • rAF вызывается перед paint, но не гарантирует рендер каждого кадра.

Практика

  1. Найдите long tasks в Performance и разбейте функцию на части.
  2. Устраните layout thrashing в примере.
  3. Реализуйте плавную анимацию через requestAnimationFrame.

Вопросы с ответами

Связанные темы