Учебник Node.js для начинающих
Node.js выводит JavaScript за пределы браузера: на нём пишут веб-серверы, REST API, утилиты и инструменты разработки. Этот курс — для тех, кто уже знаком с базовым JavaScript и хочет научиться писать серверный код. Вы пройдёте путь от первого скрипта и модульной системы до собственного REST API на Express: разберётесь, как устроен событийный цикл и асинхронность, научитесь работать с файлами и окружением, поднимать веб-сервер и грамотно обрабатывать ошибки. К концу курса вы будете понимать, как устроено серверное приложение на Node, и сможете строить его сами.
Курс «Node.js» состоит из 10 разделов и 41 урока: Введение в Node.js, Модули и npm, Асинхронность, Работа с системой, HTTP и веб-сервер, Практика: REST API на Express, Событийный цикл и libuv вглубь, Потоки, буферы и события, Параллелизм и многопроцессность и Node.js в продакшене. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в Node.js
- Что такое Node.js: JavaScript вне браузера
Node.js — это среда выполнения JavaScript на движке V8 вне браузера. Разбираемся, что это, где применяется и почему так популярна.
- Установка Node.js и проверка версии
Как установить Node.js, проверить версию через node -v и npm -v, что такое LTS и зачем нужен менеджер версий nvm.
- REPL и первый скрипт
Интерактивный режим REPL для экспериментов и запуск файла через node app.js — два способа выполнять JavaScript в Node.js.
- Чем серверный JavaScript отличается от браузерного
В Node.js нет window и DOM, зато есть process, fs и глобальные объекты Node. Разбираем ключевые отличия серверного JS от браузерного.
- Что такое Node.js: JavaScript вне браузера
2 Модули и npm
- CommonJS: require и module.exports
Как Node разбивает код на модули по системе CommonJS: экспорт через module.exports и импорт через require. Каждый файл — отдельный модуль.
- ES-модули: import и export
Современный синтаксис модулей в Node.js: import/export, отличия от CommonJS, как включить ESM через type module и расширение mjs.
- Встроенные модули Node
Node поставляется с набором встроенных модулей: fs, path, http, os, crypto и другими. Как их подключать без установки и зачем нужны.
- npm и package.json
npm — менеджер пакетов Node. Что такое package.json, npm install, dependencies vs devDependencies, node_modules и package-lock.json.
- npm-скрипты: автоматизация команд
Раздел scripts в package.json позволяет давать длинным командам короткие имена и запускать их через npm run. start, test и пользовательские скрипты.
- CommonJS: require и module.exports
3 Асинхронность
- Событийный цикл наглядно
Event loop простыми словами: почему Node однопоточный, но не блокируется. Стек вызовов, очередь задач и кто их забирает.
- Колбэки и callback hell
Колбэк — функция, которую вызывают по завершении операции. Что такое callback hell и почему вложенные колбэки трудно читать.
- Промисы
Promise — объект-обещание будущего результата. then, catch, цепочки и Promise.all вместо вложенных колбэков в Node.
- async/await
async/await — синтаксис, делающий асинхронный код похожим на синхронный. await ждёт промис, try/catch ловит ошибки.
- Событийный цикл наглядно
4 Работа с системой
- Файловая система: чтение и запись (модуль fs)
Модуль fs для работы с файлами в Node: чтение и запись, синхронные и асинхронные методы, версия на промисах.
- Пути к файлам (модуль path)
Модуль path в Node для безопасной работы с путями: join, resolve, basename, extname и переменные __dirname / __filename.
- Переменные окружения и аргументы
process.env для переменных окружения и process.argv для аргументов командной строки — как настраивать Node-приложения снаружи.
- Потоки (streams): обзор
Streams в Node обрабатывают данные по частям, не загружая всё в память. Зачем нужны потоки, их типы и идея pipe.
- Файловая система: чтение и запись (модуль fs)
5 HTTP и веб-сервер
- Простейший сервер на модуле http
Создаём веб-сервер на встроенном модуле http: createServer, объекты req и res, listen на порту. Основа всех Node-серверов.
- Маршрутизация вручную
Как на чистом модуле http разводить запросы по URL и методу: ручная маршрутизация, ответы 404 и почему это утомительно без фреймворка.
- Знакомство с Express
Express — минималистичный веб-фреймворк для Node. Установка, app.get/app.post, объекты req и res, запуск сервера через listen.
- Middleware и разбор JSON
Middleware в Express — функции в конвейере обработки запроса. Что такое next, express.json() для разбора тела и логирующий middleware.
- Простейший сервер на модуле http
6 Практика: REST API на Express
- REST API на Express: CRUD
Строим REST API на Express: CRUD-операции над списком в памяти, маршруты GET/POST/PUT/DELETE и правильные HTTP-статусы.
- Обработка ошибок
Как обрабатывать ошибки в Express и Node: try/catch в async-маршрутах, error-handling middleware с четырьмя аргументами и валидация входных данных.
- Подключение к базе данных: обзор
Как Node работает с базами данных: SQL и NoSQL, драйверы и ORM, пул соединений и почему запросы к БД асинхронны. Обзорный урок.
- Структура проекта и что дальше
Как организовать реальный Node-проект: routes, controllers, services, models. Куда расти дальше: NestJS, тесты, TypeScript и деплой.
- REST API на Express: CRUD
7 Событийный цикл и libuv вглубь
- Фазы событийного цикла
Разбор фаз событийного цикла Node.js: timers, pending, poll, check, close. Как libuv крутит цикл и почему Node однопоточный, но неблокирующий.
- Микрозадачи: process.nextTick и промисы
Микрозадачи в Node.js: чем microtask отличается от macrotask, почему очередь process.nextTick идёт перед промисами и как не уморить событийный цикл голодом.
- setTimeout, setImmediate и порядок
Разница setImmediate и setTimeout(0) в Node.js: почему порядок на верхнем уровне недетерминирован, а внутри I/O-колбэка setImmediate всегда первым.
- Что блокирует цикл и как не блокировать
Что блокирует событийный цикл Node.js: синхронные тяжёлые операции, sync-методы fs и crypto. Как выносить CPU-нагрузку и мониторить лаг цикла.
- Фазы событийного цикла
8 Потоки, буферы и события
- Buffer: бинарные данные в Node
Buffer в Node.js: зачем нужны бинарные данные, кодировки utf-8/hex/base64, чтение и запись байтов, разница между Buffer и строкой, типичные ошибки с кодировкой.
- Потоки: Readable и Writable
Потоки в Node.js: зачем обрабатывать большие данные по кускам, Readable и Writable, режимы flowing и paused, события data, end и error, метод write.
- pipe, Transform и backpressure
pipe и pipeline в Node.js: как соединять потоки, Transform-потоки для преобразования данных, что такое backpressure и почему обратное давление важно для памяти.
- EventEmitter: основа событийной модели
EventEmitter в Node.js: методы on, emit и once, паттерн издатель-подписчик, утечки слушателей и maxListeners, обязательная обработка события error.
- Buffer: бинарные данные в Node
9 Параллелизм и многопроцессность
- worker_threads: настоящие потоки для CPU-задач
worker_threads в Node.js: настоящие потоки внутри одного процесса для тяжёлых вычислений, обмен сообщениями через MessagePort, передача буферов и кратко про SharedArrayBuffer.
- cluster: масштабирование на все ядра
Модуль cluster в Node.js: один процесс использует одно ядро, мастер форкает воркеры по числу ядер, они слушают общий порт, а ОС или Node балансируют входящие соединения.
- child_process: запуск внешних программ
Модуль child_process в Node.js: spawn, exec, execFile и fork, потоки stdio дочернего процесса, когда какой метод выбрать и почему важна безопасная передача аргументов без оболочки.
- Когда параллелизм нужен (и когда нет)
Выбор параллелизма в Node.js: чем отличаются I/O-bound и CPU-bound задачи, почему для ввода-вывода хватает событийного цикла и когда брать worker_threads, cluster или child_process.
- worker_threads: настоящие потоки для CPU-задач
10 Node.js в продакшене
- Обработка ошибок: uncaughtException, промисы
Как правильно обрабатывать ошибки в Node.js: try/catch в async, unhandledRejection, uncaughtException, почему нельзя «глотать» ошибки и graceful shutdown по SIGTERM.
- Логи и конфигурация
Структурированные логи вместо console.log, уровни логирования, конфигурация через переменные окружения, принципы 12-factor и почему секреты не хранят в коде.
- Безопасность Node-приложения
Оборонительная защита Node-приложения: валидация ввода, защита от инъекций, заголовки helmet, ограничение размера тела запроса, npm audit и запуск не от root.
- Тестирование и эксплуатация
Тестирование Node через node:test и Jest, что именно тестировать, менеджеры процессов pm2 и systemd, автоматический рестарт, кластеризация и мониторинг здоровья.
- Обработка ошибок: uncaughtException, промисы