Состоялся релиз Node.js 18.0, платформы для выполнения сетевых приложений на языке JavaScript.
Node.js 18.0 отнесён к веткам с длительным сроком поддержки, но данный статус будет присвоен только в октябре, после проведения стабилизации. Поддержка Node.js 18.x будет осуществляться до апреля 2025 года. Сопровождение прошлой LTS-ветки Node.js 16.x продлится до апреля 2024 года, а позапрошлой LTS-ветки 14.x до апреля 2023 года. Сопровождение LTS-ветки 12.x будет прекращено 30 апреля, а промежуточной ветки Node.js 17.x – 1 июня.
Основные улучшения:
- Движок V8 обновлён до версии 10.1, применяемой в Chromium 101. По сравнению с выпуском Node.js 17.9.0 появилась поддержка таких возможностей, как методы findLast и findLastIndex для поиска элементов относительно конца массива и функции Intl.supportedValuesOf. Улучшен API Intl.Locale. Ускорена инициализация полей классов и приватных методов.
- Включён по умолчанию экспериментальный API fetch(), предназначенный для загрузки ресурсов по сети. Реализация основана на коде из HTTP/1.1 клиента undici и максимально приближена к аналогичному API, предоставляемому в браузерах. В том числе обеспечена поддержка интерфейсов FormData, 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 Web Streams, предоставляющего доступ к потокам данных, полученным по сети. API даёт возможность добавить свои обработчики для работы с данными по мере поступления информации по сети, не дожидаясь загрузки всего файла. В Node.js теперь доступны такие объекты, как ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream и DecompressionStream.
- В число стабильных переведён API Blob, который позволяет инкапсулировать неизменяемые сырые данные для их безопасного использования в разных рабочих потоках.
- В число стабильных переведён API BroadcastChannel, позволяющий организовать обмен сообщениями в асинхронном режиме в формате “один отправитель – много получателей”.
- Добавлен экспериментальный модуль node:test для создания и запуска тестов на языке JavaScript, возвращающих результат в формате TAP (Test Anything Protocol).
- Обеспечено формирование готовых сборок для Red Hat Enterprise Linux (RHEL) 8 и других дистрибутивов на базе Glibc 2.28+, включая Debian 10 и Ubuntu 20.04, а также для macOS 10.15+. Из-за проблем со сборкой движка V8 временно прекращено формирование 32-разрядных сборок для Windows.
- Предоставлена экспериментальная возможность сборки исполняемого файла Node.js с выбранными пользователем компонентами, инициализируемыми при запуске. Для определения стартовых компонентов в сборочный скрипт configure добавлена опция “–node-snapshot-main”, например, “./configure –node-snapshot-main=marked.js; name node”
Платформа 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) {обработка результата});”, при котором управление мгновенно перейдёт к дальнейшему коду, а результат запроса будет обработан по мере поступления данных.