← Назад к вопросам

Какие знаешь фазы Node.js?

2.8 Senior🔥 111 комментариев
#Node.js и JavaScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Фазы жизненного цикла Node.js (Event Loop)

Node.js использует асинхронную архитектуру на основе event loop'а. Понимание его фаз критично для оптимизации производительности и отладки проблем синхронизации.

Основные фазы Event Loop

Event loop в Node.js имеет несколько последовательных фаз, которые выполняются циклически:

1. timers На этой фазе выполняются колбэки для setTimeout() и setInterval(), чей таймер истек:

setTimeout(() => {
  console.log('Выполнено на фазе timers');
}, 0);

2. pending callbacks Выполняются отложенные операции I/O из предыдущих итераций event loop'а, включая некоторые ошибки.

3. idle, prepare Внутренние фазы, используемые Node.js для подготовки. Обычно разработчики с ними не взаимодействуют.

4. poll Самая важная фаза! Здесь происходит основная работа:

  • Выполняются I/O операции (чтение файлов, сетевые запросы)
  • Node.js ожидает новых I/O событий
  • Если очередь пуста, может перейти к следующим фазам
fs.readFile('file.txt', (err, data) => {
  console.log('Выполнено на фазе poll');
});

5. check Выполняются колбэки setImmediate():

setImmediate(() => {
  console.log('Выполнено на фазе check');
});

6. close callbacks Закрываются сокеты и соединения, выполняются их колбэки:

socket.on('close', () => {
  console.log('Выполнено на фазе close');
});

Порядок выполнения микротасков

Между фазами выполняются микротаски (microtasks):

  • Колбэки Promise (.then(), .catch(), .finally())
  • queueMicrotask()
  • process.nextTick()
console.log('1. Синхронный код');

setTimeout(() => {
  console.log('2. setTimeout (timers phase)');
}, 0);

Promise.resolve()
  .then(() => {
    console.log('3. Promise (microtask)');
  });

setImmediate(() => {
  console.log('4. setImmediate (check phase)');
});

process.nextTick(() => {
  console.log('5. process.nextTick (microtask)');
});

console.log('6. Синхронный код (конец)');

Вывод будет:

1. Синхронный код
6. Синхронный код (конец)
5. process.nextTick
3. Promise
2. setTimeout
4. setImmediate

Визуализация Event Loop

Event loop имеет структуру:

  • timers (setTimeout, setInterval)
  • pending callbacks
  • idle, prepare
  • poll (I/O операции)
  • check (setImmediate)
  • close callbacks

Между фазами выполняются микротаски: process.nextTick, Promise

Практические примеры

Блокировка event loop'а:

// Плохо - синхронная операция блокирует event loop
function heavyComputation() {
  let sum = 0;
  for (let i = 0; i < 1000000000; i++) {
    sum += i;
  }
  return sum;
}

// Хорошо - используем асинхронность
setImmediate(() => {
  heavyComputation();
});

Понимание фаз event loop'а позволяет писать более эффективный асинхронный код и избегать deadlock'ов и race condition'ов в приложении.

Какие знаешь фазы Node.js? | PrepBro