JS Tower
Node.jsМодуль 1: Введение в Node.js

Что такое Node.js

Архитектура и особенности Node.js

Цель урока

В этом уроке ты научишься:

  • Понимать, что такое Node.js
  • Разбираться в архитектуре и Event Loop
  • Понимать преимущества и ограничения

Что такое Node.js

Node.js — это среда выполнения JavaScript вне браузера, построенная на движке V8 от Google Chrome.

// Этот код работает в Node.js, а не в браузере
const os = require('os');

console.log('Платформа:', os.platform());
console.log('Архитектура:', os.arch());
console.log('Память:', Math.round(os.totalmem() / 1024 / 1024 / 1024) + ' GB');

Ключевые особенности

Однопоточность

Node.js выполняет JavaScript в одном потоке, но использует асинхронные операции для эффективности.

// Однопоточность — код выполняется последовательно
console.log('1');
console.log('2');
console.log('3');
// 1, 2, 3

Неблокирующий I/O

Операции ввода-вывода не блокируют основной поток:

const fs = require('fs');

console.log('Начало');

// Асинхронное чтение — не блокирует
fs.readFile('file.txt', 'utf8', (err, data) => {
  console.log('Файл прочитан');
});

console.log('Конец');

// Вывод:
// Начало
// Конец
// Файл прочитан

Event-Driven архитектура

Node.js построен на событиях:

const EventEmitter = require('events');

const emitter = new EventEmitter();

emitter.on('message', (data) => {
  console.log('Получено:', data);
});

emitter.emit('message', 'Привет!');

Event Loop

Event Loop — механизм, который позволяет Node.js выполнять асинхронные операции.

Фазы Event Loop

  1. TimerssetTimeout, setInterval
  2. Pending callbacks — системные callbacks
  3. Idle, prepare — внутренние операции
  4. Poll — получение новых I/O событий
  5. ChecksetImmediate
  6. Close callbacks — закрытие соединений
console.log('1 - Синхронный');

setTimeout(() => console.log('2 - setTimeout'), 0);

setImmediate(() => console.log('3 - setImmediate'));

process.nextTick(() => console.log('4 - nextTick'));

console.log('5 - Синхронный');

// Вывод:
// 1 - Синхронный
// 5 - Синхронный
// 4 - nextTick
// 2 - setTimeout (или 3)
// 3 - setImmediate (или 2)

process.nextTick

process.nextTick выполняется перед следующей фазой Event Loop, даже перед setTimeout(fn, 0).


V8 Engine

Node.js использует движок V8 от Google:

  • JIT-компиляция — JavaScript компилируется в машинный код
  • Garbage Collection — автоматическое управление памятью
  • Оптимизация — hot code оптимизируется для быстрого выполнения

Когда использовать Node.js

Подходит для:

  • API серверы — REST, GraphQL
  • Real-time приложения — чаты, игры, уведомления
  • Микросервисы — легковесные сервисы
  • CLI инструменты — командная строка
  • Потоковая обработка — работа с большими файлами

Не подходит для:

  • CPU-интенсивные задачи — тяжёлые вычисления блокируют Event Loop
  • Обработка видео/изображений — лучше использовать специализированные решения

Проверка установки

# Версия Node.js
node --version
# v20.10.0

# Версия npm
npm --version
# 10.2.3

# Запуск REPL
node
> 2 + 2
4
> .exit

Первая программа

Создай файл app.js:

// app.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Привет от Node.js!');
});

server.listen(3000, () => {
  console.log('Сервер запущен на http://localhost:3000');
});

Запусти:

node app.js

Открой в браузере: http://localhost:3000


Сравнение с браузером

ВозможностьБраузерNode.js
DOMДаНет
windowДаНет (есть global)
documentДаНет
fetchДаДа (с Node 18+)
fs (файлы)НетДа
http (сервер)НетДа
processНетДа

Практика

Задание 1: Информация о системе

Задача: Выведи информацию о системе.

const os = require('os');

// Выведи:
// - Платформу
// - Количество CPU
// - Свободную память в MB

Решение:

const os = require('os');

console.log('Платформа:', os.platform());
console.log('CPU:', os.cpus().length, 'ядер');
console.log('Свободная память:', Math.round(os.freemem() / 1024 / 1024), 'MB');

Задание 2: Event Loop

Задача: Предскажи порядок вывода.

console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
process.nextTick(() => console.log('D'));
console.log('E');

Ответ: A, E, D, C, B


Проверь себя

  1. Что такое Event Loop?
  2. Почему Node.js однопоточный, но эффективный?
  3. Когда выполняется process.nextTick?