Справочник по Node
Play ITЗагрузка интерактивного демо…
Область справочника
Справочник-шпаргалка по Node — типы, синтаксис, стандартная библиотека, типовые паттерны. Не заменяет пошаговое обучение — учебный курс: раздел Node.js. Таблицы синтаксиса, API, команд и параметров — для быстрого поиска фактов.
Компактные таблицы в §0.5 частично восходят к шпаргалке OverAPI Node.js (MIT, исходники); здесь они переведены и приведены к Node.js 20 LTS (без удалённых API вроде domain, встроенного punycode, new Buffer()).
Быстрый старт
npm install -g pm2
pm2 start src/index.js --name "my-app"
pm2 startup # автозапуск при старте системы
pm2 save # сохранить список процессов
pm2 logs my-app # просмотр логов
Справочные таблицы
Содержание справочника
- 0.5. Компактные шпаргалки (OverAPI)
- 1. Глобальные объекты и переменные
- 2. Встроенные модули
- 3. Параметры командной строки (
node --help) - 4. Структура проекта Node.js
- 5.
package.json— справочник - 6. Управление зависимостями
- 7. Скрипты в
package.json - 8. Обработка ошибок
- 9. Безопасность
- 10. CLI-инструменты и отладка
- 11. Практические шаблоны
- 12. Производительность
- 13. Работа с базами данных
- 14. Тестирование
- 15. Деплой и эксплуатация
- 16. Мониторинг и логирование
- 17. Сравнение с другими средами выполнения
0. Карта тем Node.js (курс + справочник)
Этот блок закрывает типовой маршрут изучения Node.js и связывает его со справочным API:
- Введение в Node.js — Node.js - серверный JavaScript
- Таймеры (
setTimeout,setInterval,setImmediate) - Модули и
npm— npm — команды, зависимости и lock-файлы - Структура проекта — Структура Node-проекта и правила разработки
- Работа с файловой системой (
fs) — Встроенные модули Node.js — fs, потоки и http- введение в
fs - синхронные операции
- асинхронные операции через callback
- асинхронные операции через
then - асинхронные операции через
async/await fs.promisesи сокращённые импорты- относительные пути и
__dirname - проверка существования файла/папки
- потоки (
createReadStream,createWriteStream) pipe
- введение в
- Сервер на Node.js — Встроенные модули Node.js — fs, потоки и http, Первая программа на Node.js
- разворачивание сервера
- настройка ответа
- понимание цикла "запрос -> обработка -> ответ"
- объект запроса (
req) и объект ответа (res) - базовый роутинг
- отдача HTML из файлов
- раздача ресурсов (CSS/JS/изображения)
- статический сервер
- шаблонизация и элементы в шаблонах
Для практики переходите к Первая программа на Node.js и Express — middleware, маршруты и ошибки, а ниже используйте A-Z как быстрый словарь API.
A-Z: быстрый словарь API Node.js
Ниже собраны ключевые элементы API из повседневной практики (сгруппированы по буквам, дубликаты объединены, формулировки нормализованы).
A
appendFile(fs) — добавляет данные в конец файла.access(fs) — проверяет доступ к файлу или директории.arch(os.arch()) — возвращает архитектуру процессора.availableParallelism(os.availableParallelism()) — рекомендуемое число потоков параллелизма.AssertionError(assert) — тип ошибки при провале утверждения.assert(assert) — проверка истинности значения/утверждения.addListener(EventEmitter) — добавляет обработчик события.addEventListener(EventTarget) — добавляет обработчик события.alloc(Buffer.alloc) — создаёт и инициализирует буфер.allocUnsafe(Buffer.allocUnsafe) — создаёт неинициализированный буфер.allocUnsafeSlow(Buffer.allocUnsafeSlow) — неинициализированный буфер вне малого пула.
B
basename(path.basename) — имя файла из полного пути.byteLength(Buffer.byteLength) — количество байтов строки/данных.byteOffset(Buffer) — смещение view в базовомArrayBuffer.
C
copyFile(fs) — копирует файл.createReadStream(fs) — открывает поток чтения.createWriteStream(fs) — открывает поток записи.closeSync(fs) — синхронно закрывает файловый дескриптор.cp(fs) — копирует директории/деревья файлов.chmod(fs) — меняет права доступа.chown(fs) — меняет владельца/группу.cpus(os.cpus) — сведения о логических ядрах CPU.constants(os.constants) — системные константы.Console(console.Console) — конструктор отдельного экземпляра консоли.count(console.count) — счётчик вызовов по метке.countReset(console.countReset) — сбрасывает счётчик по метке.clear(console.clear) — очищает терминал/консоль.cancelable(Event) — признак, можно ли отменить событие.clearInterval— отменяет интервал.clearImmediate— отменяетsetImmediate.clearTimeout— отменяет таймер.compare(Buffer.compare) — сравнение буферов.concat(Buffer.concat) — склейка массива буферов.copyBytesFrom(Buffer.copyBytesFrom) — копирует байты изTypedArray/ArrayBuffer.buffer.compare— сравнивает текущий буфер с другим.buffer.copy— копирует данные текущего буфера в целевой.
D
delimiter(path.delimiter) — разделитель PATH-переменных (;/:).dirname(path.dirname) — директория пути.devNull(os.devNull) — путь к "нулевому" устройству.deepStrictEqual(assert) — глубокая строгая проверка равенства.doesNotMatch(assert) — проверяет, что строка не подходит под RegExp.doesNotReject(assert) — проверяет, что промис не отклоняется.dirxml(console.dirxml) — структурный вывод объекта/XML-подобного содержимого.debug(console.debug) — отладочный вывод.defaultPrevented(Event) — признак, чтоpreventDefault()уже вызван.defaultMaxListeners(events) — лимит слушателей по умолчанию.dispatchEvent(EventTarget) — отправляет событие подписчикам.
E
extname(path.extname) — расширение файла.EOL(os.EOL) — символ конца строки ОС.endianness(os.endianness) — порядок байтов CPU.escape(querystring.escape) — экранирует строку для URL.error(console.error) — вывод ошибки.EventEmitter(events) — базовый класс событий.emit(EventEmitter) — вызывает слушателей события.eventNames(EventEmitter) — список имён событий.errorMonitor(events.errorMonitor) — специальный канал наблюдения ошибок.EventTarget— модель событий Web-стиля в Node.entries(Buffer.entries) — итератор пар[index, byte].equals(Buffer.equals) — проверяет равенство буферов.
F
ftruncate(fs) — меняет размер файла по дескриптору.fchmod(fs) — меняет права по дескриптору.fchown(fs) — меняет владельца по дескриптору.fstat(fs) — возвращает статистику по дескриптору.futimes(fs) — меняет временные метки по дескриптору.format(path.format) — собирает путь из объекта.freemem(os.freemem) — свободная память.fail(assert.fail) — явное падение проверки.from(Buffer.from) — создаёт буфер из строки/массива/буфера.fill(Buffer.fill) — заполняет буфер значением.
G
getPriority(os.getPriority) — приоритет планирования процесса.group(console.group) — начинает группу сообщений.groupCollapsed(console.groupCollapsed) — начинает свёрнутую группу.groupEnd(console.groupEnd) — завершает группу.getMaxListeners(EventEmitter) — текущий лимит слушателей.getEventListeners(events.getEventListeners) — копия массива слушателей.
H
homedir(os.homedir) — домашний каталог пользователя.hostname(os.hostname) — имя хоста.hasRef(Timeout/Immediate) — влияет ли таймер на цикл событий.
I
isAbsolute(path.isAbsolute) — проверка абсолютного пути.ifError(assert.ifError) — выбрасывает ошибку, если аргумент неnull/undefined.info(console.info) — информационный вывод.isTrusted(Event) — пользовательское/программное происхождение события.isBuffer(Buffer.isBuffer) — проверка, что объект —Buffer.isEncoding(Buffer.isEncoding) — поддерживается ли кодировка.includes(Buffer.includes) — содержит ли буфер значение.indexOf(Buffer.indexOf) — первый индекс вхождения.
J
join(path.join) — объединяет сегменты пути.
K
keys(Buffer.keys) — итератор индексов буфера.
L
link(fs.link) — создаёт жёсткую ссылку.lstat(fs.lstat) — статистика по пути без разыменования symlink.loadavg(os.loadavg) — средняя системная нагрузка.log(console.log) — стандартный вывод.listenerCount(EventEmitter) — число слушателей события.listeners(EventEmitter) — копия списка слушателей.lastIndexOf(Buffer.lastIndexOf) — последний индекс вхождения.length(Buffer.length) — длина буфера в байтах.
M
mkdir(fs.mkdir) — создаёт директорию.mkdtemp(fs.mkdtemp) — создаёт временную директорию.machine(os.machine) — тип аппаратной платформы.match(assert.match) — проверка совпадения строки с RegExp.
N
realpath.native(fs.realpath.native) — реальный путь через нативный resolver.normalize(path.normalize) — нормализует путь.networkInterfaces(os.networkInterfaces) — сетевые интерфейсы.notDeepStrictEqual(assert) — глубокое строгое неравенство.notStrictEqual(assert) — строгое неравенство.
O
open(fs.open) — открывает файл и возвращает дескриптор.opendir(fs.opendir) — открывает директорию для итерации.on(EventEmitter.on) — добавляет слушателя в конец списка.once(EventEmitter.once) — одноразовый слушатель.off(EventEmitter.off) — удаляет конкретный слушатель.once(events.once) — промис, который резолвится при событии.on(events.on) — async-итератор событий.
P
parse(path.parse) — разбирает путь в объект.posix(path.posix) — POSIX-реализации path-методов.platform(os.platform) — платформа ОС.parse(url.parse) — объект из URL (legacy API).prependListener(EventEmitter) — слушатель в начало списка.prependOnceListener(EventEmitter) — одноразовый слушатель в начало.poolSize(Buffer.poolSize) — размер пула маленьких буферов.
R
readFile(fs.readFile) — читает файл целиком.read(fs.read) — читает данные по файловому дескриптору.rename(fs.rename) — переименовывает/перемещает файл.rm(fs.rm) — удаляет файлы и директории.readdir(fs.readdir) — читает содержимое директории.rmdir(fs.rmdir) — удаляет директорию (legacy; чащеrm).readlink(fs.readlink) — читает символьную ссылку.realpath(fs.realpath) — канонический путь.relative(path.relative) — относительный путь между двумя точками.resolve(path.resolve) — абсолютный путь из сегментов.release(os.release) — версия ОС.rejects(assert.rejects) — ожидаемое отклонение промиса.removeAllListeners(EventEmitter) — удаляет все/часть слушателей.removeListener(EventEmitter) — удаляет один слушатель.rawListeners(EventEmitter) — слушатели включая внутренние обёртки.removeEventListener(EventTarget) — удаляет обработчик события.ref(Timeout/Immediate) — удерживает активным event loop.refresh(Timeout.refresh) — перезапускает таймер без нового объекта.
S
symlink(fs.symlink) — создаёт символьную ссылку.stat(fs.stat) — статистика файла/директории.sep(path.sep) — разделитель сегментов пути.setPriority(os.setPriority) — устанавливает приоритет процесса.stringify(querystring.stringify) — строка query-параметров из объекта.strictEqual(assert.strictEqual) — строгая проверка равенства.setMaxListeners(events.setMaxListeners) — лимит слушателей для эмиттеров.setMaxListeners(EventEmitter#setMaxListeners) — лимит для конкретного эмиттера.setImmediate— немедленное выполнение callback (после I/O phase).setInterval— периодический таймер.setTimeout— однократный таймер.
T
truncate(fs.truncate) — обрезает/расширяет файл до заданного размера.toNamespacedPath(path.toNamespacedPath) — путь с namespace-префиксом (Windows).type(os.type) — имя ОС (Windows_NT,Linuxи т.д.).totalmem(os.totalmem) — общий объём памяти.tmpdir(os.tmpdir) — временная директория.throws(assert.throws) — ожидаемое исключение в функции.table(console.table) — табличный вывод.time(console.time) — старт таймера по метке.timeEnd(console.timeEnd) — остановка и вывод времени.timeLog(console.timeLog) — промежуточное время.trace(console.trace) — вывод stack trace.timeStamp(Event.timeStamp) — время создания события.toJSON(Buffer.toJSON) — JSON-представление буфера.toString(Buffer.toString) — строка из буфера в выбранной кодировке.
U
unlink(fs.unlink) — удаляет файл/ссылку.unwatchFile(fs.unwatchFile) — прекращает наблюдение за файлом.utimes(fs.utimes) — меняет временные метки файла.userInfo(os.userInfo) — данные текущего пользователя.uptime(os.uptime) — время работы системы.unescape(querystring.unescape) — декодирует URL-escaped строку.unref(Timeout/Immediate) — не удерживает event loop активным.
V
version(os.version) — версия ядра/сборки ОС.values(Buffer.values) — итератор байтов буфера.
W
writeFile(fs.writeFile) — записывает данные в файл целиком.write(fs.write) — записывает данные через файловый дескриптор.watchFile(fs.watchFile) — наблюдает за файлом через polling.watch(fs.watch) — наблюдает за файлами/директориями (событийно).win32(path.win32) — Windows-реализации path-методов.warn(console.warn) — предупреждающий вывод.write(Buffer.write) — записывает строку в буфер.
0.5 Компактные шпаргалки
Таблицы для быстрого поиска по API. Подробные разборы — в §1–§2; практика — Встроенные модули — fs, потоки и http.
Версия блока соответствует Node.js 20 LTS.
CommonJS: require, module, exports
| Элемент | Назначение |
|---|---|
require(id) | Загружает модуль (core, файл, пакет из node_modules) |
require.resolve(id) | Абсолютный путь к модулю без выполнения |
require.cache | Кэш уже загруженных модулей |
require.main | Ссылка на главный модуль (точка входа) |
module.exports | То, что получает вызывающий код через require() |
exports | Ссылка на module.exports (удобство) |
module.id | Полный путь к файлу модуля |
module.filename | Имя файла модуля |
module.loaded | true, если модуль уже выполнен |
module.parent | Модуль, который вызвал require (legacy; в ESM — граф импортов) |
module.children | Модули, загруженные из текущего |
__filename, __dirname | Путь к файлу и каталогу (только CommonJS) |
ESM-аналоги: import, import.meta.url, проверка точки входа — Точка входа — require.main и import.meta.
HTTP: IncomingMessage (req) и ServerResponse (res)
Справочник кодов: http.STATUS_CODES — объект { 200: 'OK', 404: 'Not Found', ... }.
Запрос (req):
| Свойство / метод | Назначение |
|---|---|
req.method | HTTP-метод (GET, POST, …) |
req.url | Путь и query (без хоста) |
req.headers | Заголовки (нижний регистр ключей) |
req.httpVersion | Версия протокола (1.1) |
req.setEncoding('utf8') | Декодировать тело как строку |
req.pause() / req.resume() | Управление потоком чтения |
'data', 'end', 'close' | События тела запроса |
Ответ (res):
| Свойство / метод | Назначение |
|---|---|
res.statusCode | Код ответа (по умолчанию 200) |
res.writeHead(code, [reason], [headers]) | Статус и заголовки одним вызовом |
res.setHeader(name, value) | Установить заголовок |
res.getHeader(name) / res.removeHeader(name) | Чтение / удаление заголовка |
res.writeContinue() | Ответ 100 Continue (ожидание Expect: 100-continue) |
res.write(chunk, [encoding]) | Фрагмент тела |
res.end([data], [encoding]) | Завершить ответ (обязательно) |
res.addTrailers(headers) | Trailers после chunked-тела |
Клиент: http.request(options, cb), сокращение http.get(options, cb), пул — http.globalAgent / https.globalAgent.
readline — интерактивный ввод в терминале
import readline from 'node:readline/promises';
import { stdin as input, stdout as output } from 'node:process';
const rl = readline.createInterface({ input, output });
const answer = await rl.question('Имя? ');
rl.close();
| Метод / событие | Назначение |
|---|---|
readline.createInterface({ input, output, prompt }) | Создать интерфейс |
rl.question(query, cb) / await rl.question(query) | Запросить строку |
rl.setPrompt(prompt) / rl.prompt() | Приглашение REPL-подобного CLI |
rl.write(data, [key]) | Вставить текст в буфер ввода |
rl.pause() / rl.resume() / rl.close() | Управление и закрытие |
'line' | Пользователь нажал Enter |
'close' | Интерфейс закрыт |
'SIGINT' | Ctrl+C (можно перехватить для graceful exit) |
repl — Read-Eval-Print Loop
import repl from 'node:repl';
repl.start({ prompt: '> ' });
| Элемент | Назначение |
|---|---|
repl.start([options]) | Запуск REPL (порт, eval, prompt) |
'exit' | Выход из сессии |
| Встроенные команды | .help, .break, .clear, .load, .save, .exit |
В CLI достаточно node без аргументов — тот же REPL.
StringDecoder — декодирование потока байтов в строку
Полезен при чтении бинарного потока по частям, когда многобайтовые символы UTF-8 могут «разрезаться» между chunk'ами.
import { StringDecoder } from 'node:string_decoder';
const decoder = new StringDecoder('utf8');
let text = '';
stream.on('data', (chunk) => { text += decoder.write(chunk); });
stream.on('end', () => { text += decoder.end(); });
| Метод | Назначение |
|---|---|
decoder.write(buffer) | Декодировать порцию; «хвост» символа хранится внутри |
decoder.end([buffer]) | Финальный flush оставшихся байтов |
Buffer: чтение и запись чисел
Современное создание: Buffer.alloc(n), Buffer.from(str|array) — не new Buffer().
| Метод | Назначение |
|---|---|
buf.readUInt8(offset) | Беззнаковый байт |
buf.readUInt16LE / readUInt16BE | 16-bit unsigned |
buf.readUInt32LE / readUInt32BE | 32-bit unsigned |
buf.readInt8, readInt16LE, readInt32LE | Знаковые аналоги |
buf.readFloatLE / readFloatBE | IEEE 754 float |
buf.readDoubleLE / readDoubleBE | IEEE 754 double |
buf.writeUInt8, writeUInt16LE, … | Запись (симметрично read*) |
buf.slice([start], [end]) | View на тот же memory (изменения видны в обоих) |
buf.copy(target, [tStart], [sStart], [sEnd]) | Копирование байтов |
Buffer.concat(list, [totalLength]) | Склейка массива буферов |
DNS: типы записей
import dns from 'node:dns/promises';
await dns.lookup('example.com'); // A или AAAA
await dns.resolve4('example.com'); // только A
await dns.resolve6('example.com'); // только AAAA
await dns.resolveMx('example.com'); // MX
await dns.resolveTxt('example.com'); // TXT
await dns.resolveSrv('_service._tcp.example.com');
await dns.reverse('93.184.216.34'); // PTR
| Метод | Тип записи |
|---|---|
lookup | IP-адрес (как getaddrinfo) |
resolve4 / resolve6 | A / AAAA |
resolveMx | почтовые серверы |
resolveTxt | текстовые записи |
resolveSrv | сервисные записи |
resolveNs / resolveCname | NS / CNAME |
reverse | обратное разрешение IP → имя |
net.Socket: свойства и события
| Свойство | Назначение |
|---|---|
socket.remoteAddress / remotePort | Адрес пира |
socket.localAddress / localPort | Локальный endpoint |
socket.bytesRead / bytesWritten | Статистика I/O |
socket.setTimeout(ms, cb) | Таймаут бездействия |
socket.setNoDelay(true) | Отключить Nagle (TCP_NODELAY) |
socket.setKeepAlive(true, [delay]) | TCP keep-alive |
| Событие | Когда |
|---|---|
connect | Соединение установлено |
data | Пришли данные |
end | Пир закончил передачу |
close | Сокет закрыт |
error | Ошибка |
timeout | Сработал таймаут |
drain | Буфер записи опустошён — можно снова write |
Проверка IP: net.isIP(str) → 0 | 4 | 6; net.isIPv4, net.isIPv6.
cluster: процессы-воркеры
| API | Назначение |
|---|---|
cluster.isPrimary | true в главном процессе (раньше isMaster) |
cluster.isWorker | true в воркере |
cluster.fork([env]) | Новый воркер с тем же entry point |
cluster.workers | { id: Worker } активных воркеров |
worker.id | Числовой ID |
worker.send(msg) / 'message' | IPC между primary и worker |
worker.disconnect() / 'disconnect' | Мягкое отключение |
'fork', 'online', 'listening', 'exit' | Жизненный цикл воркера |
Устаревшее: не использовать в новом коде
| Было (старые шпаргалки) | Сейчас |
|---|---|
new Buffer(size|str|array) | Buffer.alloc(), Buffer.from() |
domain | async/await, try/catch, domain удалён |
require('punycode') | import punycode from 'punycode' (npm) или url.domainToASCII() |
util.debug, util.puts, util.print, util.pump | console, stream.pipeline() |
util.isArray, util.isDate, … | Array.isArray(), util.types.isDate() |
http.createClient() | http.request() / http.get() |
fs.exists() | fs.access() или try { await fs.stat() } |
cluster.isMaster | cluster.isPrimary |
os.tmpDir() | os.tmpdir() |
response.sendDate | по умолчанию включено; редко настраивают вручную |
1. Глобальные объекты и переменные
Node.js предоставляет ряд глобальных объектов, доступных без импорта.
global
Объект верхнего уровня, аналогичный window в браузере. Все свойства, присвоенные global, становятся глобальными.
global.myVar = 'hello';
console.log(myVar); // 'hello'
process
Объект, содержащий информацию о текущем процессе Node.js и методы для взаимодействия с ним.
Свойства process
process.argv— массив аргументов командной строки.process.env— объект с переменными окружения.process.pid— числовой идентификатор процесса.process.platform— строка с именем платформы (win32,linux,darwin).process.version— версия Node.js (например,'v20.11.0').process.versions— объект с версиями зависимостей (V8, OpenSSL, zlib и др.).process.execPath— путь к исполняемому файлу Node.js.process.cwd()— текущая рабочая директория.process.arch— архитектура процессора (x64,arm64,ia32).process.release— информация о сборке Node.js (тип, заголовки, исходники).
Методы process
process.exit([code])— завершает процесс с кодом выхода.process.nextTick(callback[, ...args])— планирует вызов функции на следующей итерации цикла событий.process.kill(pid[, signal])— отправляет сигнал процессу.process.chdir(directory)— изменяет текущую рабочую директорию.process.memoryUsage()— возвращает объект с информацией об использовании памяти.process.cpuUsage([previousValue])— возвращает использование CPU в микросекундах.process.hrtime([time])— высокоточное измерение времени.process.on(event, listener)— подписка на события (exit,SIGINT,uncaughtExceptionи др.).
console
Объект для вывода информации в терминал.
Методы:
console.log()console.info()console.warn()console.error()console.time(label),console.timeEnd(label)console.trace()console.table(data)
Buffer
Глобальный класс для работы с бинарными данными.
Примеры:
const buf = Buffer.from('hello');
const buf2 = Buffer.alloc(10); // 10 байт, заполненных нулями
const buf3 = Buffer.allocUnsafe(10); // неинициализированный буфер
setTimeout, setInterval, setImmediate
Функции таймеров, унаследованные из браузерного JavaScript, но реализованные в Node.js через libuv.
setTimeout(callback, delay, ...args)setInterval(callback, delay, ...args)setImmediate(callback, ...args)
Отмена:
clearTimeout(timeoutObject)clearInterval(intervalObject)clearImmediate(immediateObject)
__dirname, __filename
Строки с абсолютным путём к текущему файлу и его директории. Доступны только в CommonJS.
В ESM заменяются на:
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
2. Встроенные модули
Node.js поставляется с множеством встроенных модулей. Их можно импортировать без установки.
assert
Модуль для написания тестов и проверок.
Основные методы:
assert(value, message)— выбрасывает AssertionError, еслиvalueложно.assert.strictEqual(actual, expected)assert.deepStrictEqual(actual, expected)assert.throws(fn, ErrorConstructor)assert.doesNotThrow(fn)
buffer
Работа с бинарными данными. Хотя Buffer глобален, модуль buffer предоставляет дополнительные утилиты.
Свойства:
Buffer.poolSize— размер пула для быстрого выделения памяти (по умолчанию 8192 байта).Buffer.isBuffer(obj)— проверка, является ли объект буфером.
child_process
Создание дочерних процессов.
Методы:
child_process.spawn(command, [args], [options])— запуск команды.child_process.exec(command, [options], callback)— выполнение команды с буферизацией вывода.child_process.execFile(file, [args], [options], callback)child_process.fork(modulePath, [args], [options])— создаёт новый процесс Node.js с IPC-каналом.
Опции:
cwd— рабочая директория.env— переменные окружения.stdio— настройка стандартных потоков (['pipe', 'pipe', 'pipe']по умолчанию).detached— запуск в фоне (Unix).shell— использовать оболочку (/bin/sh,cmd.exe).
События дочернего процесса:
closedisconnecterrorexitmessage
cluster
Модуль для создания нескольких процессов-воркеров, использующих общие порты.
Методы:
cluster.isPrimary—true, если текущий процесс — основной.cluster.isWorker—true, если текущий процесс — воркер.cluster.fork([env])— создаёт новый воркер.cluster.workers— объект с активными воркерами.
События:
forkonlinelisteningdisconnectexitsetup
console
Уже описан выше как глобальный объект.
crypto
Криптографические функции:
- хэши;
- HMAC;
- шифрование;
- дешифрование;
- генерация ключей.
Примеры:
const hash = crypto.createHash('sha256').update('data').digest('hex');
const cipher = crypto.createCipher('aes-192-cbc', key);
const decipher = crypto.createDecipher('aes-192-cbc', key);
Алгоритмы:
- Хэши —
md5,sha1,sha256,sha512 - Шифрование —
aes-128-gcm,aes-192-cbc,chacha20-poly1305 - Ключи:
generateKeyPair,createSecretKey
dgram
Работа с UDP-сокетами.
Методы:
dgram.createSocket(type[, callback])—type:'udp4'или'udp6'.socket.bind(port[, address][, callback])socket.send(msg, offset, length, port, address, callback)socket.close()
События:
messagelisteningcloseerror
dns
Разрешение доменных имён.
Методы:
dns.lookup(hostname[, options], callback)dns.resolve(hostname[, rrtype], callback)dns.resolve4(hostname, callback)dns.resolve6(hostname, callback)dns.reverse(ip, callback)
Опции lookup:
family—0(любой),4(IPv4),6(IPv6)hints: флаги, влияющие на выбор адреса
events
Базовый класс EventEmitter.
Методы:
emitter.on(eventName, listener)emitter.once(eventName, listener)emitter.emit(eventName, ...args)emitter.removeListener(eventName, listener)emitter.removeAllListeners([eventName])emitter.listenerCount(eventName)emitter.setMaxListeners(n)
fs (File System)
Работа с файловой системой.
Асинхронные методы (callback-based)
fs.readFile(path[, options], callback)fs.writeFile(file, data[, options], callback)fs.appendFile(file, data[, options], callback)fs.unlink(path, callback)— удаление файлаfs.mkdir(path[, options], callback)fs.rmdir(path[, options], callback)fs.readdir(path[, options], callback)fs.stat(path, callback)— информация о файле/директорииfs.access(path[, mode], callback)— проверка прав доступаfs.copyFile(src, dest[, flags], callback)fs.watch(filename[, options][, listener])fs.watchFile(filename[, options], listener)
Синхронные методы
fs.readFileSyncfs.writeFileSyncfs.existsSyncfs.statSync- и так далее — суффикс
Sync
Промисы и async/await
Доступны через fs.promises:
import { promises as fs } from 'fs';
const data = await fs.readFile('file.txt', 'utf8');
Потоковые операции
fs.createReadStream(path[, options])fs.createWriteStream(path[, options])
Опции:
encoding— кодировка ('utf8','base64','binary')flag— режим открытия ('r','w','a','wx','ax'и др.)mode— права доступа (например,0o666)autoClose— автоматически закрывать потокhighWaterMark— размер внутреннего буфера
http
Модуль для создания HTTP-серверов и клиентов.
Сервер
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});
Методы сервера:
server.listen(port, [hostname], [backlog], [callback])server.close([callback])server.address()— возвращает объект{ port, family, address }
События сервера:
request— при получении запросаconnection— при установке TCP-соединенияcloseerror
Клиент
const req = http.request(options, (res) => {
res.on('data', (chunk) => { /* ... */ });
res.on('end', () => { /* ... */ });
});
req.write('data');
req.end();
Опции запроса:
host/hostnameportpathmethod(GET,POST, и т.д.)headerstimeoutagent— управление пулом соединений
События клиента:
responsesockettimeouterror
https
Расширение http с поддержкой TLS/SSL. Использует те же API, но требует сертификатов.
Пример сервера:
const options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
https.createServer(options, (req, res) => {
res.end('Secure Hello\n');
}).listen(443);
net
Низкоуровневый модуль для работы с TCP-сокетами.
Сервер:
const server = net.createServer((socket) => {
socket.write('Echo server\r\n');
socket.pipe(socket); // эхо
});
server.listen(8124);
Клиент:
const client = net.createConnection({ port: 8124 }, () => {
client.write('Hello');
});
События:
connectdataenderrorclosedrain— когда буфер отправки освобождается
os
Информация о системе.
Методы:
os.arch()— архитектура (x64,arm64)os.cpus()— массив информации о ядрах CPUos.freemem()— свободная память в байтахos.totalmem()— общая памятьos.homedir()— домашняя директория пользователяos.hostname()— имя хостаos.networkInterfaces()— сетевые интерфейсыos.platform()—win32,linux,darwinos.release()— версия ОСos.tmpdir()— временная директорияos.uptime()— время работы системы в секундахos.userInfo([options])— информация о пользователе
path
Работа с путями файловой системы.
Методы:
path.join(...paths)— объединяет пути с учётом разделителя ОСpath.resolve(...paths)— преобразует в абсолютный путьpath.basename(path[, ext])— имя файлаpath.dirname(path)— директорияpath.extname(path)— расширениеpath.parse(path)— разбивает путь на объект{ root, dir, base, name, ext }path.format(pathObject)— обратная операцияpath.isAbsolute(path)— проверка абсолютностиpath.relative(from, to)— относительный путь между двумя точкамиpath.normalize(path)— нормализует путь (..,., двойные слэши)
Свойства:
path.sep— разделитель (/или\)path.delimiter— разделитель переменных окружения (:или;)
querystring
Парсинг и сериализация query-строк.
Методы:
querystring.parse(str[, sep][, eq][, options])querystring.stringify(obj[, sep][, eq][, options])querystring.escape(str)querystring.unescape(str)
Опции:
maxKeys— максимальное число параметровdecodeURIComponent— функция декодирования значений
stream
Базовая абстракция для потоковой обработки данных.
Типы потоков:
Readable— источник данныхWritable— приёмник данныхDuplex— одновременно читаемый и записываемый (net.Socket)Transform— Duplex с преобразованием (zlib.createGzip())
Методы Readable:
read([size])setEncoding(encoding)pause(),resume()pipe(destination[, options])unpipe([destination])
События Readable:
dataenderrorclosereadable
Методы Writable:
write(chunk[, encoding][, callback])end([chunk][, encoding][, callback])
События Writable:
drainfinisherrorclose
timers
Уже частично описан через глобальные setTimeout и др. Дополнительно:
timers.setImmediateиtimers.clearImmediate— доступны как модуль.timers.promises— версии с промисами:
import { setTimeout } from 'timers/promises';
await setTimeout(1000);
tls
Работа с TLS-сокетами (без HTTP).
Создание сервера:
const server = tls.createServer(options, (socket) => {
socket.write('Secure connection\n');
});
Клиент:
const socket = tls.connect(8000, 'localhost', () => {
socket.write('Client hello');
});
tty
Проверка, является ли поток терминалом.
tty.isatty(fd)— возвращаетtrue, если файловый дескриптор связан с TTY.process.stdin.isTTY,process.stdout.isTTY— часто используются для определения контекста выполнения.
url
Парсинг и формирование URL.
Методы:
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])— устаревший, но поддерживается.new URL(input[, base])— современный способ (Web Standard).url.format(urlObject)— обратная операция кparse.url.resolve(from, to)— разрешение относительного URL.
Пример:
const myURL = new URL('https://example.com:8080/path?query=1#frag');
console.log(myURL.hostname); // 'example.com'
console.log(myURL.port); // '8080'
console.log(myURL.searchParams.get('query')); // '1'
util
Утилитарные функции.
Методы:
util.inspect(object[, options])— строковое представление объекта для отладки.util.promisify(fn)— преобразует функцию с callback в промис.util.callbackify(promiseFn)— обратная операция.util.types.isDate(obj),util.types.isRegExp(obj)— точная типизация.util.inherits(constructor, superConstructor)— устаревшее наследование (до ES6 классов).util.format(format[, ...args])— аналогprintf.
Опции inspect:
depth— глубина рекурсииcolors— цветной выводshowHidden— показывать неперечисляемые свойстваcompact— компактный вывод
v8
Доступ к внутренним данным движка V8.
Методы:
v8.getHeapStatistics()— статистика кучиv8.getHeapSpaceStatistics()— информация о сегментах кучиv8.serialize(value)/v8.deserialize(buffer)— сериализация, совместимая с structured clone algorithmv8.setFlagsFromString(flags)— динамическая настройка флагов V8
vm
Выполнение кода в изолированном контексте.
Пример:
const vm = require('vm');
const sandbox = { x: 1 };
vm.createContext(sandbox);
vm.runInContext('x += 1;', sandbox);
console.log(sandbox.x); // 2
Методы:
vm.createContext([sandbox])vm.runInContext(code, contextifiedSandbox[, options])vm.runInNewContext(code[, sandbox][, options])vm.runInThisContext(code[, options])
worker_threads
Многопоточность в Node.js.
Основные элементы:
Worker— отдельный потокparentPort— порт для обмена сообщениямиworkerData— данные, переданные при созданииisMainThread—trueв основном потокеthreadId— уникальный ID потока
Пример:
// main.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename, { workerData: 42 });
worker.on('message', (msg) => console.log(msg));
} else {
parentPort.postMessage(workerData * 2);
}
zlib
Сжатие и распаковка данных.
Методы:
zlib.gzip(buf, callback)zlib.gunzip(buf, callback)zlib.deflate(buf, callback)zlib.inflate(buf, callback)zlib.brotliCompress(buf, callback)zlib.brotliDecompress(buf, callback)
Потоковые версии:
zlib.createGzip()zlib.createGunzip()zlib.createDeflate()zlib.createInflate()zlib.createBrotliCompress()zlib.createBrotliDecompress()
3. Параметры командной строки (node --help)
Node.js поддерживает множество флагов при запуске.
Основные флаги
--version/-v— вывод версии--help/-h— справка--eval "code"/-e "code"— выполнить JavaScript-код--print "code"/-p "code"— выполнить и вывести результат--require module/-r module— загрузить модуль до запуска скрипта--input-type=type— указать тип входных данных (moduleилиcommonjs) при использовании--eval--loader=specifier— указать custom loader для ESM
Отладка
--inspect[=[host:]port]— включить инспектор (по умолчанию127.0.0.1:9229)--inspect-brk— пауза при старте--trace-warnings— трассировка предупреждений--trace-deprecation— трассировка устаревших API--throw-deprecation— выбрасывать ошибки вместо предупреждений
Производительность
--max-old-space-size=size— лимит памяти в мегабайтах--no-warnings— отключить все предупреждения--experimental-modules— включить экспериментальные ESM-фичи (в новых версиях не требуется)--conditions=condition— задать условия импорта (для package.json exports)
Переменные окружения
NODE_OPTIONS— передача флагов через переменную окруженияNODE_ENV— окружение (production,Разработка)NODE_PATH— дополнительные пути для поиска модулейUV_THREADPOOL_SIZE— размер пула потоков libuv (по умолчанию 4)
4. Структура проекта Node.js
Типичная структура проекта на Node.js включает следующие элементы:
my-node-app/
├── package.json
├── package-lock.json (или yarn.lock, pnpm-lock.yaml)
├── node_modules/
├── src/ # исходный код приложения
│ ├── index.js # точка входа
│ ├── routes/
│ ├── controllers/
│ ├── models/
│ ├── middleware/
│ └── utils/
├── public/ # статические файлы (если есть веб-интерфейс)
├── config/ # конфигурационные файлы
├── tests/ # тесты (unit, integration)
├── scripts/ # вспомогательные скрипты
├── .env # переменные окружения (не в репозитории)
├── .gitignore
├── README.md
└── LICENSE
Рекомендуется разделять логику по слоям — маршрутизация, контроллеры, бизнес-логика, доступ к данным, утилиты. Это упрощает поддержку, тестирование и масштабирование.
5. package.json — справочник
Файл package.json описывает проект, его зависимости, скрипты и метаданные.
Обязательные поля
"name"— имя пакета (должно быть уникальным в npm, без заглавных букв и спецсимволов кроме-,_)"version"— версия в формате SemVer (MAJOR.MINOR.PATCH)
Основные поля
"description"— краткое описание"main"— точка входа (по умолчаниюindex.js)"type"— тип модулей:"commonjs"(по умолчанию) или"module"(включает ESM)"exports"— тонкая настройка экспорта для разных условий (например,import,require,node,browser)"scripts"— команды, запускаемые черезnpm run <script>
npm run <script>
"dependencies"— зависимости времени выполнения"devDependencies"— зависимости только для разработки (тесты, сборка)"peerDependencies"— зависимости, которые должны быть установлены в основном проекте (часто в библиотеках)"engines"— требуемые версии Node.js и npm:
"engines": {
"node": ">=18.0.0",
"npm": ">=8.0.0"
}
"files"— список файлов, включаемых при публикации пакета"keywords"— ключевые слова для поиска в npm"author","contributors","license","repository","homepage"
Пример package.json
Код ITЗагрузка примера кода…
6. Управление зависимостями
Команды npm
npm init— созданиеpackage.jsonnpm install/npm i— установка всех зависимостей изpackage.jsonnpm install <package>— установка и добавление вdependencies
npm install <package>
npm install <package> --save-dev— установка вdevDependencies
npm install <package> --save-dev
npm uninstall <package>— удаление пакета
npm uninstall <package>
npm update— обновление зависимостей в пределах версионных ограниченийnpm outdated— показ устаревших пакетов
npm outdated
npm audit— проверка уязвимостейnpm audit fix— автоматическое исправление некоторых уязвимостей
npm audit fix
Версионные диапазоны
1.2.3— точная версия~1.2.3— совместимость с патчами (>=1.2.3 <1.3.0)^1.2.3— совместимость с минорными и патчами (>=1.2.3 <2.0.0)*— любая версия (не рекомендуется)latest— последняя опубликованная версия
Файлы блокировки
package-lock.json— фиксирует точные версии всех зависимостей (включая вложенные)- Обеспечивает воспроизводимую установку на всех машинах
- Должен быть включён в систему контроля версий
7. Скрипты в package.json
Скрипты позволяют стандартизировать рабочие процессы.
Примеры:
"scripts": {
"start": "node server.js",
"dev": "NODE_ENV=Разработка nodemon server.js",
"test": "jest --coverage",
"test:watch": "jest --watch",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"format": "prettier --write .",
"build": "webpack --mode production",
"prepublishOnly": "npm test && npm run build"
}
Особые скрипты:
prepublishOnly— запускается перед публикациейpreinstall,postinstall— до и после установкиprestart,poststart— до и послеnpm start
Переменные окружения в скриптах:
- Windows:
set NODE_ENV=production && node app.js - Unix:
NODE_ENV=production node app.js - Кроссплатформенно: использовать пакет
cross-env
8. Обработка ошибок
Node.js использует несколько моделей обработки ошибок:
Callback-стиль
fs.readFile('file.txt', (err, data) => {
if (err) {
console.error('Ошибка чтения:', err.message);
return;
}
console.log(data.toString());
});
Промисы и async/await
try {
const data = await fs.promises.readFile('file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Ошибка:', err.message);
}
Глобальные обработчики
process.on('uncaughtException', (err) => {
console.error('Необработанное исключение:', err);
process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Необработанный промис:', reason);
process.exit(1);
});
Рекомендуется логировать ошибки, очищать ресурсы и завершать процесс в случае критических сбоев.
9. Безопасность
Основные практики
- Регулярно обновлять зависимости (
npm outdated,npm update)
npm outdated
- Использовать
npm auditи инструменты вродеsnyk,dependabot - Не коммитить
.envи другие секреты - Валидировать и санировать все входные данные
- Использовать
helmetв Express-приложениях - Ограничивать размеры запросов (
body-parserс лимитами) - Отключать отладочные эндпоинты в продакшене
- Использовать HTTPS в продакшене
- Устанавливать минимально необходимые права для процесса
Защита от распространённых уязвимостей
- Prototype Pollution — избегать небезопасного использования
Object.assign,lodash.merge - Command Injection — не передавать пользовательский ввод напрямую в
child_process.exec - Path Traversal — нормализовать пути и проверять, что они находятся внутри разрешённой директории:
const path = require('path');
const filePath = path.join(__dirname, 'public', userProvidedPath);
if (!filePath.startsWith(path.resolve(__dirname, 'public'))) {
throw new Error('Недопустимый путь');
}
10. CLI-инструменты и отладка
Полезные глобальные пакеты
nodemon— перезапуск приложения при изменении файловpm2— продакшен-менеджер процессовhttp-server— простой статический серверtsx/esbuild-runner— запуск TypeScript без предварительной компиляции
Встроенная отладка
- Запуск с
--inspectи подключение через Chrome DevTools (chrome://inspect) - Использование
debugger;в коде - Точки останова в VS Code через launch-конфигурацию
Профилирование
--prof— генерация лога V8 profiler--prof-process— анализ лога- Инструменты: Clinic.js, 0x, Chrome DevTools Performance tab
11. Практические шаблоны
Сервер на чистом Node.js
Код ITЗагрузка примера кода…
Чтение конфигурации
// config/index.js
const dotenv = require('dotenv');
dotenv.config();
module.exports = {
port: process.env.PORT || 3000,
dbUrl: process.env.DATABASE_URL,
jwtSecret: process.env.JWT_SECRET
};
Логирование
Использовать специализированные библиотеки — winston, pino, bunyan.
Пример с console (для простых случаев):
const log = (level, message) => {
console.log(`[${new Date().toISOString()}] [${level}] ${message}`);
};
12. Производительность
Основные принципы
- Использовать неблокирующие операции
- Избегать синхронных методов (
fs.readFileSync,child_process.execSync) в продакшене - Минимизировать количество блокирующих вычислений в основном потоке
- Использовать кэширование (в памяти, Redis, CDN)
- Оптимизировать сериализацию/десериализацию JSON
- Использовать стриминг для больших объёмов данных
Инструменты профилирования
clinic.js— автоматический анализ производительности0x— генерация flamegraphNode.js built-in profiler— флаги--prof,--prof-processChrome DevTools— CPU profiling, memory snapshotsprocess.memoryUsage(),process.cpuUsage()— ручной мониторинг
Работа с памятью
- Избегать утечек: не хранить ссылки на объекты дольше необходимого
- Использовать
WeakMap,WeakSetдля кэшей - Ограничивать размеры коллекций
- Периодически вызывать
global.gc()(только при запуске с--expose-gc)
Масштабирование
- Кластеризация:
clusterмодуль для использования всех ядер CPU - Микросервисы: разделение логики на независимые сервисы
- Worker Threads: вынос тяжёлых вычислений в отдельные потоки
- Очереди задач: Bull, Agenda — для отложенной обработки
13. Работа с базами данных
Node.js поддерживает широкий спектр СУБД через драйверы и ORM.
Реляционные базы
- PostgreSQL —
pg(node-postgres),Sequelize,TypeORM,Prisma - MySQL/MariaDB —
mysql2,Sequelize,TypeORM - SQLite:
better-sqlite3,sqlite3
Пример с pg:
const { Client } = require('pg');
const client = new Client({ connectionString: process.env.DATABASE_URL });
await client.connect();
const res = await client.query('SELECT * FROM users WHERE id = $1', [1]);
await client.end();
NoSQL
- MongoDB:
mongodb(официальный драйвер),Mongoose - Redis —
redis— для кэширования, очередей, сессий - CouchDB, DynamoDB, Firestore — через соответствующие SDK
Пулы соединений
Все современные драйверы поддерживают пул соединений. Это критически важно для производительности:
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
max: 20, // максимальное число соединений
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000
});
Миграции
- Использовать инструменты —
knex,sequelize-cli,Prisma Migrate - Версионировать схему БД вместе с кодом
- Избегать прямого изменения схемы вручную
14. Тестирование
Уровни тестирования
- Unit-тесты — проверка отдельных функций
- Integration-тесты — взаимодействие модулей
- E2E-тесты — сквозные сценарии
Фреймворки
- Jest — всё в одном — runner, assertions, mocks, coverage
- Mocha + Chai + Sinon — классический стек
- Vitest — быстрый альтернативный runner (для ESM)
- Supertest — тестирование HTTP-серверов
Пример unit-теста:
// math.js
exports.add = (a, b) => a + b;
// math.test.js
const { add } = require('./math');
test('adds 1 + 2 to equal 3', () => {
expect(add(1, 2)).toBe(3);
});
Пример integration-теста:
const request = require('supertest');
const app = require('./app');
test('GET /users returns 200', async () => {
const res = await request(app).get('/users');
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
});
Покрытие кода
jest --coverage— генерация отчёта- Целевой уровень покрытия: 70–90% для критических модулей
CI/CD
- Запуск тестов при каждом push в репозиторий
- Блокировка мержа при падении тестов
- Использование GitHub Actions, GitLab CI, CircleCI
15. Деплой и эксплуатация
Варианты развёртывания
- Собственный сервер (VPS): Ubuntu + Nginx + PM2
- PaaS — Heroku, Render, Railway, Vercel (для serverless)
- Контейнеризация: Docker + Kubernetes
- Serverless: AWS Lambda, Cloudflare Workers (ограниченная совместимость)
Dockerfile пример
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
PM2 (Process Manager)
npm install -g pm2
pm2 start src/index.js --name "my-app"
pm2 startup # автозапуск при старте системы
pm2 save # сохранить список процессов
pm2 logs my-app # просмотр логов
Обратный прокси
Nginx перед Node.js:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
Переменные окружения
- Все конфигурационные параметры — через
.envили переменные окружения - Никаких "магических" значений в коде
- Использовать
dotenvтолько в разработке
16. Мониторинг и логирование
Логирование
- Структурированные логи в формате JSON
- Уровни —
debug,info,warn,error - Библиотеки —
pino,winston,bunyan - Отправка логов в централизованные системы — ELK, Datadog, Sentry
Метрики
- Количество запросов в секунду
- Время ответа (p50, p95, p99)
- Использование памяти и CPU
- Количество активных соединений
Алертинг
- Настройка оповещений при превышении порогов
- Интеграция с Slack, Telegram, Email
Инструменты
- Prometheus + Grafana — сбор и визуализация метрик
- New Relic, Datadog — коммерческие APM-системы
- Sentry — отслеживание ошибок
17. Сравнение с другими средами выполнения
Node.js и Deno
- Deno — безопаснее по умолчанию (требует явных разрешений)
- Поддержка TypeScript "из коробки"
- Единый исполняемый файл
- Модули по URL, без
package.json - Меньше зрелых библиотек
Node.js и Bun
- Bun — написан на Zig, значительно быстрее в запуске и установке
- Совместим с большинством npm-пакетов
- Встроенный bundler, тест-раннер, transpiler
- Ещё не стабилен для продакшена (на начало 2026 года)
Node.js и Python (FastAPI/Django)
- Node.js лучше для I/O-интенсивных задач (чаты, реалтайм)
- Python предпочтителен для CPU-интенсивных задач (ML, Data Science)
Node.js и Go
- Go — компилируемый язык, выше производительность и потребление памяти
- Node.js — быстрее в разработке, богаче экосистема для веба
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Справочники — Справочник по JavaScript, Справочник по React, Справочник-шпаргалка по Git, Справочник по Vue.js, Справочник по CSS, Справочник по Angular.