Node.js: справочник и путь обучения с нуля
Содержание
Node.js — среда, которая запускает JavaScript вне браузера. Этот раздел собирает то, что нужно знать о ней на практике: не пересказ официальной документации, а разбор мест, где обычно ошибаются.
Как устроен этот справочник
Код запускается перед публикацией. Если в статье стоит бейдж «примеры выполнены на Node.js v22.23.1» — значит, весь код прогнан, а в тексте фактический вывод консоли. Не «должно вывести», а «вывело».
Числа — из собственных замеров. Мы не берём цифры из чужих статей. Когда написано, что синхронное чтение файла на 117 МБ останавливает событийный цикл, — это результат замера, где 10-миллисекундный таймер не сработал ни разу за 269 мс.
Где не проверяли — сказано прямо. В разборе MySQL живого сервера у нас не было, и об этом написано в самой статье. Бейджа «проверено» там нет.
Путь для начинающего
Порядок не случайный: каждый шаг опирается на предыдущий.
- 1 Что такое Node.jsСобытийный цикл, один поток и почему это не медленно
-
2
УстановкаСразу правильно:
aptдаёт версию без поддержки - 3 Первый HTTP-серверПять строк, ноль зависимостей
- 4 Промисы и async/awaitБез них дальше ничего не понять
- 5 Файлы и потокиГде живёт большинство ошибок новичков
Не пропускайте промисы. Это единственный шаг, без которого остальное превращается в копирование кода без понимания: и файловая система, и базы, и сокеты — всё асинхронное.
Что прочитать, даже если Node уже знаком
Места, где ошибаются и опытные. Каждое подтверждено замером:
| Что | Замер |
|---|---|
readFileSync блокирует всё |
269 мс — ноль тиков 10-мс таймера |
await в цикле |
1021 мс против 204 мс через Promise.all |
readFile против потока |
+169 МБ памяти против кусков по 64 КБ |
exec против execFile |
инъекция команд возможна и невозможна |
matchedCount ≠ modifiedCount |
matched: 2, modified: 0 на повторе |
| Индекс в MongoDB | 20 000 просмотренных документов против одного |
| Brotli по умолчанию | в 8 раз медленнее gzip ради 14% размера |
socket.id меняется |
после переподключения приходит другой id |
cpus() врёт в контейнере |
показывает ядра хоста, а не лимит |
Сквозная мысль всего раздела
Если читать материалы подряд, видно: половина ошибок в Node — это один и тот же принцип в разных костюмах.
Дорого не действие — дорого повторение накладных расходов.
| Где | По одному | Пачкой |
|---|---|---|
| Запись в файл | 433 мс | 64 мс через дескриптор |
| Команды Redis | 114 мс | 8 мс пайплайном |
| Вставка в MongoDB | N раундтрипов | один insertMany |
| Задачи в цикле | 1021 мс | 204 мс через Promise.all |
Защита работает не тем, что данные почистили, а тем, что интерпретировать их некому. execFile передаёт аргументы массивом мимо оболочки; параметризованный SQL отправляет данные мимо парсера запроса. Один принцип, два места.
Единственный поток — и преимущество, и потолок. Синхронное чтение файла и обычный счётный цикл дают одинаковый результат: ноль тиков таймера. Природа разная — диск и процессор, — вывод один.
Технологии редко умирают от плохого качества — их перестают выбирать. Так вышло с Memcached и Sails.js: оба работают до сих пор, просто экосистема ушла в другую сторону.
Полный индекс по темам
Ниже — все материалы раздела по темам. Клиентский JavaScript, DOM и jQuery — в соседнем разделе уроки JavaScript.
Полный список статей по темам
Node.js (42)
- Установка Node.js на Ubuntu: nvm, NodeSource или apt 7 мин
- HTTP-сервер на Node.js: «Hello, World!» без фреймворков 6 мин
- Middleware в Node.js: как устроена цепочка обработчиков 4 мин
- Redis в Node.js: кэш, счётчики, очереди и блокировки 6 мин
- EventEmitter в Node.js: события своими руками 6 мин
- ORM в Node.js: Sequelize, Prisma и когда ORM не нужен 5 мин
- Socket.io: чат на Node.js и что он добавляет к WebSocket 6 мин
- Объект process в Node.js: argv, env, память и выход 6 мин
- child_process в Node.js: exec, execFile, spawn и fork 6 мин
- Паттерны проектирования в Node.js: какие реально нужны 5 мин
- Node.js Promise: промисы и async/await на практике 7 мин
- Свой модуль в Node.js и публикация в NPM 6 мин
- Глобальные объекты Node.js: globalThis, Buffer, таймеры 6 мин
- Модуль os в Node.js: информация о системе и железе 5 мин
- Потоки в Node.js: Stream, pipeline и почему не readFile 6 мин
- Сжатие данных в Node.js: zlib, gzip и brotli 6 мин
- Buffer в Node.js: работа с бинарными данными 4 мин
- Cluster в Node.js: используем все ядра процессора 4 мин
- ESM против CommonJS: import и require в Node.js 4 мин
- Event Loop в Node.js: фазы и порядок выполнения 4 мин
- Express с нуля: первый сервер за 10 минут 4 мин
- Graceful shutdown в Node.js: корректное завершение сервера 3 мин
- HTTP-клиент в Node.js: fetch и запросы к API 4 мин
- JWT-авторизация в Express: токены на практике 4 мин
- Middleware в Express: сердце фреймворка 4 мин
- REPL в Node.js: интерактивная консоль для экспериментов 3 мин
- REST API на Express: строим по правилам 4 мин
- Transform-потоки в Node.js: обработка данных на лету 4 мин
- URL и строка запроса в Node.js: разбор и сборка 3 мин
- Worker threads в Node.js: параллельные вычисления 4 мин
- Валидация в Express: проверка входящих данных 4 мин
- Логирование в Node.js: от console.log к нормальным логам 4 мин
- Маршрутизация в Express: пути, параметры, роутеры 4 мин
- Модуль crypto в Node.js: хеши, соль, шифрование 4 мин
- Модуль readline в Node.js: чтение ввода построчно 3 мин
- Модуль util в Node.js: промисификация и отладка 3 мин
- Обработка ошибок в Express: middleware ошибок 4 мин
- Обработка ошибок в Node.js: не дать серверу упасть 4 мин
- Отладка Node.js: от console.log до отладчика 4 мин
- Переменные окружения в Node.js: конфигурация и секреты 4 мин
- Таймеры в Node.js: setTimeout, setInterval, setImmediate 4 мин
- Управление памятью в Node.js: куча, утечки, профилирование 4 мин
MongoDB (3)
Частые вопросы
Сколько времени займёт этот путь?
Нужно ли знать JavaScript перед Node.js?
Почему в статьях примеры на ESM, а не на require?
import — стандарт, а require — наследие. Код на require вы встретите в старых проектах, и он работает, но новый писать на нём незачем.Что значит бейдж «примеры выполнены»?
С чего начать, если Node уже знаком?
matchedCount против modifiedCount в MongoDB.