Состоялся релиз Node.js 23.0.0, платформы для выполнения сетевых приложений на языке JavaScript. Node.js 23.0 отнесён к промежуточным веткам, сопровождение которых осуществляется в течение 7 месяцев (до июня 2025 года). В ближайшие дни будет завершена стабилизация ветки Node.js 22, которая 29 октября получит статус LTS и будет поддерживаться до апреля 2027 года. Поддержка прошлых LTS-веток Node.js 20.x и 18.x продлится до апреля 2026 и 2025 годов соответственно.
- Добавлена экспериментальная поддержка языка TypeScript, допускающего явное определение типов. Поддержка включается при помощи опций “–experimental-strip-types” и “–experimental-transform-types”. В случае первой опции работа с TypeScript сводится к очистке специфичных для данного языка определений типов (проверка типов не выполняется, код просто приводится к виду JavaScript без типов). Вторая опция осуществляет преобразование в код на JavaScript некоторых элементов синтаксиса TypeScript, например, перечислений (enum) и пространств имён (namespace).
- Включена по умолчанию возможность использования вызова “require()” для загрузки JavaScript-модулей ESM (ECMAScript Modules) в синхронном режиме. ESM-модули применяются в браузерах и идут на смену модулям CommonJS, специфичным для Node.js. Для загрузки через “require()” в Node.js ESM-модуль должен выполняться в синхронном режиме (без await на верхнем уровне).
- Обеспечено автоматическое выявление ESM-модулей в файлах без расширения или с расширением “.js”. Ранее подобные файлы трактовались как модули CommonJS, если в размещённом в том же каталоге файле package.json явно не указывался их тип (“type”: “module”). В новой версии для файлов, тип которых не обозначен в package.json, вначале осуществляется попытка загрузки как модуля CommonJS, а если это не удалось, то как модуля ESM.
- Добавлена экспериментальная реализация совместимого с браузерами API Web Storage, предназначенного для постоянного (класс localStorage) или временного (класс sessionStorage) хранения данных в формате ключ/значение. Для включения поддержки Web Storage требуется запуск с флагом “–experimental-webstorage” и указание пути к файлу с хранилищем через флаг “–localstorage-file”.
- Добавлен экспериментальный API SQLite для работы с базами данных, используя язык запросов SQL и хранилище на базе библиотеки SQLite. Помимо хранения базы данных в файле на диске, её также можно размещать в памяти, указав вместо имени файла “:memory:”. Вышеотмеченной API Web Storage также реализован поверх SQLite, что привело к добавлению SQLite в число зависимостей для Node.js.
- Объявлена стабильной команда “node –run”, предназначенная для запуска скриптов, определённых в файле package.json.
- Реализована опциональная поддержка кэширования скомпилированного кода на диске для существенного ускорения запуска модулей. Включение кэширования осуществляется через переменную окружения NODE_COMPILE_CACHE. По своему назначению возможность напоминает пакет v8-compile-cache, но отличается более высокой производительностью и поддержкой модулей ESM.
- Проведена оптимизация объекта Buffer, позволившая значительно увеличить производительность методов Buffer.copy() и Buffer.write().
- Повышена производительность модуля node:fs, в котором также сокращено число вызовов кода на C++ в процессе работы.
- Движок V8 обновлён до версии 12.9, применяемой в Chromium 129.
- Удалена поддержка 32-разрядных систем с ОС Windows.
- Из-за внедрения в Node.js и движке V8 возможностей, определённых в стандарте C++20, повышены требования к версии компилятора GCC. Для сборки Node.js теперь требуется как минимум версия GCC 12.
Платформа 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-приложении, работающем в браузере.