Перейти к основному содержимому

Node.js - серверный JavaScript

Разработчику Архитектору

Node.js

JavaScript в браузере ограничен песочницей. Node.js — программа, которая выполняет JS на сервере или в CLI — сеть, файлы, процессы, криптография. Один язык на фронте (React) и в API (Express) ускоряет обучение и работу команды.

Практическая связка

Рекомендуемый порядок: первая программа → эта статья (устройство runtime) → npm и структура проектавстроенные модулиExpressFullstack.


Маршрут по разделу Node.js

ТемаСтатья
1Первая программа, Express APIПервая программа на Node.js
2Runtime, event loop, модуливы здесь
3npm: install, scripts, auditnpm — команды, зависимости и lock-файлы
4Папки, package.json, envСтруктура Node-проекта и правила разработки
5fs, http, потокиВстроенные модули Node.js — fs, потоки и http
6Express: middleware, CORSExpress — middleware, маршруты и ошибки
7CLI, Docker, productionCLI Node.js — запуск, отладка и деплой
8API + фронтFullstack на JavaScript — API и фронтенд
Шпаргалка APIСправочник по Node

Что такое Node.js

Node.js — среда выполнения JavaScript вне браузера: движок V8 (как в Chrome) плюс привязки к ОС через libuv. Сильная сторона платформы — I/O-bound нагрузка: много одновременных соединений при умеренном расходе RAM. Долгие вычисления в одном потоке лучше выносить в worker_threads или отдельный сервис.

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

node -v
npm -v

Минимальный сервер на встроенном http (разбор построчно — Встроенные модули Node.js — fs, потоки и http):

const { createServer } = require('node:http');
const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
node server.js

Скачать LTS: nodejs.org. Несколько версий на одной машине — nvm (см. ниже).


История

Райан Даль выпустил Node.js в 2009 году, предложив event loop и неблокирующий I/O вместо модели "поток на каждый запрос". С появлением npm (2010) выросла крупнейшая экосистема пакетов для одного языка. С 2015 года идут параллельные линии LTS (долгая поддержка, обычно 30+ месяцев) и Current (свежие возможности). Для production берите LTS.


Архитектура — event loop

Сердце Node — цикл событий на libuv:

  1. JS вызывает, например, fs.readFile() — задача уходит в пул потоков libuv.
  2. Основной поток не ждёт — выполняет следующий JS.
  3. По завершении I/O колбэк попадает в очередь; event loop вызывает его в V8.

Так достигается высокая пропускная способность при сетевых и файловых операциях. Синхронные API (readFileSync) и долгий CPU-код в одном потоке блокируют весь сервер — для вычислений используйте worker_threads или вынос в отдельный сервис.

Подробнее про fs, потоки и httpВстроенные модули Node.js — fs, потоки и http.


Принципы платформы

Ядро намеренно небольшое — сеть, файлы и процессы есть в стандартной библиотеке, а фреймворки и ORM живут в npm. Пакеты обычно делают одну задачу, I/O по умолчанию асинхронный (*Sync — исключение для скриптов и редких случаев). Один язык на фронте и в API упрощает общие типы, особенно с TypeScript.

Встроенные модули, с которыми вы столкнётесь чаще всего — fs, http/https, stream, child_process, crypto, os, path, worker_threads.


Установка

Официальный установщик (Windows .msi, macOS .pkg, Linux через NodeSource) — node и npm в PATH.

nvm (macOS/Linux) — несколько версий Node:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
nvm install --lts
nvm use --lts

В корне проекта файл .nvmrc с версией (20) — nvm use без аргументов. На Windows — nvm-windows.


Глобальные объекты

ОбъектНазначение
globalКорень глобального контекста (аналог window)
processargv, env, cwd(), сигналы, exit()
consolelog / error / time — stderr vs stdout важен для логов
BufferБинарные данные
__dirname, __filenameПуть модуля (только CommonJS)
setTimeout, setInterval, setImmediateТаймеры в фазах event loop

Пример process:

console.log(process.env.NODE_ENV);
console.log(process.argv.slice(2));

Модули — CommonJS и ESM

CommonJS (исторически по умолчанию):

// math.cjs
const add = (a, b) => a + b;
module.exports = { add };
const { add } = require('./math.cjs');

ES Modules — стандарт JS: import / export. Включение: "type": "module" в package.json или расширение .mjs.

export const add = (a, b) => a + b;

import { add } from './math.js';

CommonJSESM
ЗагрузкаСинхроннаяСтатический анализ
В Node по умолчаниюбез "type": "module"с "type": "module"
Смешиваниеimport() из CJSdefault-обёртка при импорте CJS

Зависимости и node_modulesnpm — команды, зависимости и lock-файлы. Структура проекта — Структура Node-проекта и правила разработки.


Фреймворки поверх http

ExpressFastifyNestJS
СтильГибкий, middlewareСкорость, JSON SchemaМодули, DI, TypeScript
КогдаMVP, обучение, legacyHigh-load APIКрупные команды

Учебный путь начинается с ExpressПервая программа на Node.js, Express — middleware, маршруты и ошибки. Сравнение и production-паттерны — CLI Node.js — запуск, отладка и деплой.


Node.js и база данных

Серверный JS почти всегда связан с хранилищем: HTTP → Express → service → pool (pg) → PostgreSQL. Запросы к БД асинхронные — event loop продолжает принимать соединения.

Практики: один Pool на процесс, секреты в process.env, graceful shutdown (server.close()pool.end()), параметризованные запросы $1, $2.

Интерактив ниже — REST, CRUD, пул соединений и связь с event loop.

Play ITЗагрузка интерактивного демо…

Пошаговый код REST + PostgreSQL в учебнике — блоки в Первая программа на Node.js и раздел "Практикум" в исторической версии материала; слои routes / modelsСтруктура Node-проекта и правила разработки.


Как мыслить о Node в production

Чеклист перед production (подробнее — CLI Node.js — запуск, отладка и деплой):

  • единая версия Node (.nvmrc, engines);
  • npm ci в CI, lock в Git;
  • структурированные логи и единый формат ошибок API;
  • GET /health, graceful shutdown;
  • секреты только в переменных окружения.

Практика и ссылки


Основа по протоколу

Базовый разбор HTTP и HTTPS — HTTP как основа веб-интеграций.