Излезе 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, потоци, 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 е скрит от разработчика и напомня на обработката на събития в уеб приложение, работещо в браузър. При написването на приложения за node.js е необходимо да се вземе предвид спецификата на събитийно-ориентираното програмиране, например, вместо да се изпълнява 'var result = db.query("select..);",' с очакване на завършване на работата и последваща обработка на резултатите, в Node.js се използва принципът на асинхронно изпълнение, т.е. кодът се трансформира в 'db.query("select..", function (result) {обработка на резултата});', при което управлението веднага преминава към следващия код, а резултатът от запитването ще бъде обработен по мярка за получаване на данни.
Източник: opennet.ru
