Event Loop

Тема дорожной карты · Node.js

Event loop (цикл событий) — это ключевой механизм Node.js, позволяющий JavaScript выполнять неблокирующие операции ввода-вывода, несмотря на работу в одном потоке. При запуске Node.js синхронно обрабатывает стек вызовов, затем входит в цикл событий, который непрерывно проверяет ряд фаз — таймеры, колбэки I/O, idle, poll, check и close callbacks — чтобы определить, какие колбэки из очереди выполнять следующими. Понимание цикла событий крайне важно для серверных разработчиков на Node.js, поскольку блокировка цикла событий ресурсоёмким синхронным кодом не позволит серверу обрабатывать другие входящие запросы. Микрозадачи, такие как колбэки выполненных Promise и вызовы process.nextTick(), выполняются между каждой фазой цикла событий, что придаёт им более высокий приоритет по сравнению с обычными колбэками. Владение принципами работы цикла событий помогает разработчикам JavaScript писать эффективные, отзывчивые приложения на Node.js, в полной мере использующие асинхронные паттерны, такие как async/await.

Как это работает

Event Loop запускает JavaScript вне браузера через V8 + libuv. V8 компилирует JS в машинный код; libuv даёт event loop, async I/O очередь и thread pool для блокирующих операций (fs, dns, crypto). Runtime однопоточный по исполнению JS, но использует non-blocking I/O — мало ядер CPU обслуживают много конкурентных соединений. Современные релизы — LTS (чётные, 30 месяцев поддержки) и Current (нечётные, 6 месяцев).

Когда применять

Берите Event Loop для I/O-bound бэкендов (API, real-time, прокси), тулинга (build-шаги, CLI, codemods) и full-stack приложений с общими типами между сервером и клиентом. Пропустите для CPU-тяжёлой работы (обработка изображений, ML inference) без выноса в worker threads или нативные модули — однопоточный JS становится боттлнеком. В production всегда последний LTS.

Типичные ошибки

Ловушки Event Loop: блокировка event loop синхронным кодом (один fs.readFileSync на горячем пути замораживает каждый запрос); console.log в production-горячих путях (медленнее, чем думают); закрепление на EOL Node-версии (security-дыры копятся); путаница CommonJS (require) и ESM (import) — у них тонкие различия в top-level await, расширениях файлов, динамической загрузке.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…