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
- Timers —
setTimeout,setInterval - Pending callbacks — системные callbacks
- Idle, prepare — внутренние операции
- Poll — получение новых I/O событий
- Check —
setImmediate - 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
Проверь себя
- Что такое Event Loop?
- Почему Node.js однопоточный, но эффективный?
- Когда выполняется
process.nextTick?