Назад

Главный поток браузера — это ограниченный ресурс

Как управлять нагрузкой Main Thread: делить long tasks, уступать браузеру, группировать события и выносить вычисления в workers.

Главный поток браузера — это ограниченный ресурс

Когда мы думаем об оптимизации фронтенда, в голову обычно приходят размер бандлов, кэширование, сетевые запросы или сокращение лишних ререндеров. Но на интерактивных экранах (потоковый чат, фиды, анимации) узким местом часто становится сам Main Thread.

Вся проблема в том, что в главном потоке по цепочке исполняется абсолютно всё: исполнение JS, обработка событий, рендеринг DOM, вычисление стилей, Layout и Paint. Если функция задерживается на 200 мс, браузер на эти 200 мс буквально «слепнет» — не может нарисовать новый кадр или подхватить клик.

В статье выделяют два фундаментальных подхода к управлению нагрузкой на главный поток:

  1. Разумно делить время внутри потока (Yielding & Scheduling)

    Когда работа неизбежно должна выполняться в Main Thread, длинные задачи (Long Tasks > 50 мс) нужно «резать» на кванты:

    • Splitting & Yielding: Разбивать массивные вычисления или рендеринг большого числа элементов (например, пачки сообщений из WebSocket) на мелкие порции. Между кусками делать уступку (yield) через requestAnimationFrame или scheduler.yield(), чтобы браузер успел отрисовать кадр и отработать пользовательский ввод.
    • Batching: Группировать частые события (скролл, ввод текста, resize) через троттлинг/дебаунс или завязывать обновления строго на кадр перерисовки.
    • Prioritizing & Deferring: Откладывать некритичную работу (через requestIdleCallback или IntersectionObserver) и отдавать приоритет только тому, что напрямую влияет на отклик UI.
  2. Выносить работу за пределы Main Thread

    Самый эффективный способ оптимизации — вообще не нагружать главный поток:

    • Compositor-only анимации: Использовать только transform и opacity. Они обрабатываются отдельным потоком композитинга и не вызывают пересчёт Layout/Paint.
    • FLIP-паттерн: Считать сложную математику изменений перед анимацией, а затем анимировать только transform.
    • Web Workers: Отдавать тяжелый парсинг данных, фильтрацию или криптографию в фоновые потоки.

Читать полный разбор с интерактивными демками

А вы высчитываете бюджет кадра (10 мс) и дробите long tasks, или пока боритесь с оптимизацией бандла?

Скопировано