Доступна серверная JavaScript-платформа Node.js 21.0

Состоялся релиз Node.js 21.0, платформы для выполнения сетевых приложений на языке JavaScript. Поддержка ветки Node.js 21.0 будет осуществляться в течение 6 месяцев. В ближайшие дни будет завершена стабилизация ветки Node.js 20, которая получит статус LTS и будет поддерживаться до апреля 2026 года. Сопровождение прошлой LTS-ветки Node.js 18.0 продлится до сентября 2025 года, а позапрошлой LTS-ветки 16.0 до апреля 2024 года.

Основные улучшения:

  • Объявлен стабильным API Fetch, предназначенный для загрузки ресурсов по сети и упрощающий написание универсального JavaScript-кода, пригодного для работы на стороне сервера и клиента. Реализация основана на коде из HTTP/1.1 клиента undici и максимально приближена к аналогичному API, предоставляемому в браузерах. API включает в себя метод fetch() и объекты Headers.Request и Response, представляющие HTTP-заголовки, запрос и ответ. const res = await fetch(‘https://nodejs.org/api/documentation.json’); if (res.ok) { const data = await res.json(); console.log(data); }
  • Стабилизирована поддержка API WebStreams, предоставляющего доступ к потокам данных, полученным по сети. API даёт возможность добавить свои обработчики, работающие с данными по мере поступления информации по сети, не дожидаясь загрузки всего файла. В Node.js доступны такие объекты, как ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream и DecompressionStream.
  • Добавлена экспериментальная реализация клиента WebSocket, совместимая с браузерами. Для включения поддержки WebSocket предусмотрен флаг “–experimental-websocket”.
  • Добавлен экспериментальный режим использования по умолчанию реализации JavaScript-модулей ESM (ECMAScript Modules, применяется в модулях для браузеров) вместо CommonJS (специфичен для Node.js). Изменение не затрагивает модули, формат которых явно определён через поле “type” в package.json, задан через флаг “–input-type” или очевиден в силу расширения файла (.mjs для ESM, .cjs для CommonJS). При этом модули, которые явно не определены как CommonJS (например, имеют расширение “.js”), при включении нового режима будут восприниматься как модули ESM. Для активации новых настроек модулей предложен флаг “–experimental-default-type”.
  • Движок V8 обновлён до версии 11.8, применяемой в Chromium 118, в котором появилась поддержка метода ArrayBuffer.prototype.transfer, возможности группировки массивов (метод groupBy) и WebAssembly-инструкций обработки констант (i32.add, i32.sub, i32.mul, i64.add, i64.sub и i64.mul).
  • Прекращена поддержка обработчика globalPreload, вместо которого для настройки модулей следует использовать вызовы register и initialize.
  • В функцию fs.writeFile добавлена опция “flush” для принудительного сброса данных на накопитель после каждой операции записи.
  • Повышена производительность кода, связанного с разбором URL, API fetch, streams, node:fs и HTTP.
  • Добавлен глобальный объект navigator. Например, для получения данных о числе ядер CPU можно использовать свойство navigator.hardwareConcurrency.
  • В параметре “–test” добавлена поддержка glob-масок для выбора запускаемых тестов (например, можно указать “–test **/*.test.js.”).
  • Обновлены входящие в комплект пакетный менеджер npm 10.2.0 и парсер llhttp 9.1.2.
  • Прекращена поддержка Visual Studio 2019 и версий macOS старее 11.0.

Платформа Node.js может быть использована как для серверного сопровождения работы Web-приложений, так и для создания обычных клиентских и серверных сетевых программ. Для расширения функциональности приложений для Node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией серверов и клиентов HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модули для интеграции с различными web-фреймворками, обработчики WebSocket и Ajax, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (OAuth), XML-парсеры.

Для обеспечения обработки большого числа параллельных запросов Node.js задействует асинхронную модель запуска кода, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. В качестве способов мультиплексирования соединений поддерживаются такие методы, как epoll, kqueue, /dev/poll и select. Для мультиплексирования соединений используется библиотека libuv, которая является надстройкой над libev в системах Unix и над IOCP в Windows. Для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe). Выполнение JavaScript-кода обеспечивается через задействование разработанного компанией Google движка V8 (дополнительно Microsoft развивает вариант Node.js с движком Chakra-Core).

По своей сути Node.js похож на фреймворки Perl AnyEvent, Ruby Event Machine, Python Twisted и реализацию событий в Tcl, но цикл обработки событий (event loop) в Node.js скрыт от разработчика и напоминает обработку событий в web-приложении, работающем в браузере. При написании приложений для node.js необходимо учитывать специфику событийно-ориентированного программирования, например, вместо выполнения “var result = db.query(“select..”);” с ожиданием завершения работы и последующей обработкой результатов, в Node.js использует принцип асинхронного выполнения, т.е. код трансформируется в “db.query(“select..”, function (result) {обработка результата});”, при котором управление мгновенно перейдёт к дальнейшему коду, а результат запроса будет обработан по мере поступления данных.

Release. Ссылка here.