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 необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться