nodejs
Node.js — кросс-платформенная среда выполнения JavaScript на стороне сервера, построенная на движке V8 от Google. Выпущенный Райаном Далем в 2009 году, Node.js позволяет запускать JavaScript вне браузера — на сервере, в командной строке, в облачных функциях. Его архитектура основана на неблокирующем вводе-выводе и событийной модели, что делает Node.js особенно эффективным для приложений с высоким параллелизмом.
Архитектура Node.js: event loop и libuv
В основе Node.js лежит однопоточная событийная модель. Когда приложение выполняет операцию ввода-вывода (чтение файла, запрос к базе данных, HTTP-запрос), Node.js не ждёт её завершения — он регистрирует callback и продолжает обрабатывать другие запросы. Когда операция завершается, callback помещается в очередь событий и выполняется в следующем цикле.
Библиотека libuv обеспечивает кросс-платформенный асинхронный I/O: на Linux используется epoll, на macOS — kqueue, на Windows — IOCP. Для CPU-интенсивных операций (шифрование, сжатие) libuv использует пул потоков, не блокируя event loop. Движок V8 JIT-компилирует JavaScript в машинный код, обеспечивая производительность, сопоставимую с компилируемыми языками для I/O-задач.
npm и экосистема модулей
Node.js поставляется с npm — крупнейшим в мире реестром пакетов программного обеспечения. По состоянию на 2024 год в npm более 2,5 миллиона пакетов. Файл package.json описывает зависимости, скрипты и метаданные проекта. Менеджер pnpm значительно ускоряет установку через жёсткие ссылки и строгую изоляцию; Yarn добавляет детерминированные lockfile-ы и рабочие пространства (workspaces) для монорепозиториев.
Ключевые встроенные модули
- http / https — создание HTTP/HTTPS-серверов и выполнение запросов.
- fs — работа с файловой системой: чтение, запись, создание директорий, наблюдение за изменениями.
- path — кросс-платформенная работа с путями файловой системы.
- stream — абстракция для работы с потоками данных (Readable, Writable, Transform).
- crypto — криптографические примитивы: хэши, HMAC, шифрование, генерация ключей.
- child_process — запуск дочерних процессов и shell-команд.
- worker_threads — настоящая многопоточность для CPU-интенсивных задач.
- cluster — создание нескольких процессов для использования многоядерных процессоров.
Web-фреймворки на Node.js
Для создания HTTP API и веб-приложений используются фреймворки:
- Express.js — минималистичный, самый популярный фреймворк. Middleware-архитектура позволяет гибко добавлять функциональность.
- Fastify — высокопроизводительный фреймворк с JSON-схемой для валидации и сериализации. В 2–4 раза быстрее Express на типичных задачах.
- NestJS — опinionated фреймворк на TypeScript, вдохновлённый Angular. Использует декораторы, dependency injection и модульную архитектуру. Популярен для корпоративных приложений.
- Hono — ультралёгкий фреймворк, работающий на Node.js, Deno, Bun и Cloudflare Workers.
- tRPC — не фреймворк, а протокол для типобезопасных API между TypeScript-клиентом и сервером без кодогенерации.
Node.js для реального времени
Событийная архитектура делает Node.js идеальным для приложений реального времени: чатов, уведомлений, совместного редактирования, потоковой передачи данных. Библиотека Socket.IO строит двунаправленные каналы связи поверх WebSocket с автоматическим fallback на long polling. Node.js широко используется в инструментах разработчика: webpack, ESLint, Prettier, Jest — всё это Node.js-приложения.
Версионирование и LTS
Node.js следует чёткому Release Schedule: чётные версии получают статус LTS (Long Term Support) — 30 месяцев активной поддержки. Нечётные версии — Current — получают новые возможности, но без гарантий долгосрочной поддержки. Для переключения между версиями используются nvm (Node Version Manager) или fnm (Fast Node Manager).
Конкуренты: Deno и Bun
Deno — рантайм от создателя Node.js Райана Даля, переосмысливший многие решения: нативная поддержка TypeScript, безопасность по умолчанию (файловый доступ только с явного разрешения), встроенный линтер и форматтер, ESM-first. Bun — рантайм на JavaScriptCore (движок Safari), ориентированный на максимальную скорость: устанавливает зависимости в 5–20 раз быстрее npm, запускает скрипты в разы быстрее Node.js. Оба совместимы с большинством Node.js API и npm-пакетов.
Частые вопросы
Node.js — это фреймворк или язык программирования?
Node.js — это ни то, ни другое. Это среда выполнения (runtime), позволяющая запускать JavaScript вне браузера. Языком является JavaScript. Поверх Node.js строятся фреймворки (Express, Fastify, NestJS), а сам Node.js предоставляет API для работы с файловой системой, сетью и операционной системой.
Почему Node.js однопоточный, но при этом справляется с тысячами одновременных запросов?
Node.js использует неблокирующий I/O: вместо того чтобы ждать завершения операций (чтение файла, запрос к БД), он регистрирует callback и переходит к следующей задаче. Event loop обрабатывает callbacks по мере их готовности. Это позволяет одному потоку обслуживать тысячи соединений без накладных расходов на создание потоков ОС.
Когда лучше не использовать Node.js?
Node.js плохо подходит для CPU-интенсивных задач (видеокодирование, сложные вычисления), которые блокируют event loop. Для таких задач лучше подходят Go, Rust, Java или Python. Worker Threads в Node.js решают проблему частично, но для задач с интенсивными вычислениями другие языки будут производительнее.
Другие термины в теме «Веб-разработка»
Не хватает деталей?
Напишите, что уточнить по теме «nodejs» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).