De release van Node.js 21.0, een platform voor het uitvoeren van netwerkapplicaties in JavaScript, heeft plaatsgevonden. De ondersteuning voor de Node.js 21.0 tak zal 6 maanden duren. De stabilisatie van de Node.js 20 tak, die als LTS zal worden geclassificeerd, wordt binnen enkele dagen afgerond en blijft ondersteund tot april 2026. De ondersteuning van de vorige LTS-tak Node.js 18.0 zal duren tot september 2025, terwijl de voorlaatste LTS-tak 16.0 ondersteuning zal hebben tot april 2024.
Hoofdverbeteringen:
- De stabiele Fetch API is aangekondigd, ontworpen voor het laden van bronnen via het netwerk en het vereenvoudigen van het schrijven van universele JavaScript-code die geschikt is voor zowel server- als klantzijde. De implementatie is gebaseerd op de undici HTTP/1.1 clientcode en is zo dicht mogelijk bij de soortgelijke API die in browsers wordt aangeboden. De API omvat de fetch()-methode en de objecten Headers, Request en Response, die de HTTP-headers, aanvraag en antwoord vertegenwoordigen. const res = await fetch(āhttps://nodejs.org/api/documentation.jsonā); if (res.ok) { const data = await res.json(); console.log(data); }
- De ondersteuning voor de WebStreams API, die toegang biedt tot netwerkdatastreams, is gestabiliseerd. De API maakt het mogelijk om eigen handlers toe te voegen die werken met gegevens naarmate informatie over het netwerk binnenkomt, zonder te wachten op het laden van het volledige bestand. In Node.js zijn objecten beschikbaar zoals ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream en DecompressionStream.
- Er is een experimentele implementatie van de WebSocket-client toegevoegd, die compatibel is met browsers.Om de WebSocket-ondersteuning in te schakelen, is er een vlag āāexperimental-websocketā voorzien.
- Een experimentele modus voor de standaardimplementatie van JavaScript-modules ESM (ECMAScript Modules, gebruikt in modules voor browsers) in plaats van CommonJS (specifiek voor Node.js) is toegevoegd. Deze wijziging heeft geen invloed op modules waarvan het formaat expliciet is gedefinieerd via het ātypeā-veld in package.json, gedefinieerd via de vlag āāinput-typeā of duidelijk is op basis van de bestandsextensie (.mjs voor ESM, .cjs voor CommonJS). Modules die niet expliciet als CommonJS zijn gedefinieerd (bijvoorbeeld met de extensie ā.jsā) zullen in de nieuwe modus worden behandeld als ESM-modules. Om de nieuwe module-instellingen te activeren, is de vlag āāexperimental-default-typeā voorgesteld.
- De V8-engine is bijgewerkt naar versie 11.8, gebruikt in Chromium 118, waarin ondersteuning is toegevoegd voor de ArrayBuffer.prototype.transfer-methode, de mogelijkheid om arrays te groeperen (de groupBy-methode) en WebAssembly-instructies voor het verwerken van constanten (i32.add, i32.sub, i32.mul, i64.add, i64.sub en i64.mul).
- De ondersteuning voor de globalPreload handler is beƫindigd; in plaats daarvan moeten de register- en initialize-aanroepen worden gebruikt voor het configureren van modules.
- De fs.writeFile functie heeft de optie 'flush' toegevoegd voor het geforceerd wegschrijven van gegevens naar de opslag na elke schrijfbewerking.
- De prestaties van de code met betrekking tot het parseren van URL's, API fetch, streams, node:fs en HTTP zijn verbeterd.
- Een globaal navigator-object is toegevoegd. Bijvoorbeeld, om gegevens over het aantal CPU-kernen te verkrijgen, kan de eigenschap navigator.hardwareConcurrency worden gebruikt.
- Aan de parameter '--test' is ondersteuning voor glob-patronen toegevoegd voor het selecteren van uit te voeren tests (bijvoorbeeld, je kunt '--test **/*.test.js.' opgeven).
- De meegeleverde package manager npm versie 10.2.0 en de llhttp parser versie 9.1.2 zijn bijgewerkt.
- De ondersteuning voor Visual Studio 2019 en macOS versies ouder dan 11.0 is beƫindigd.
Het Node.js-platform kan worden gebruikt voor zowel serverondersteuning van webapplicaties als voor het creƫren van reguliere client- en servernetwerkprogramma's. Voor de uitbreiding van de functionaliteit van toepassingen voor Node.js is er een grote collectie modules beschikbaar, waar je modules kunt vinden met implementatie van servers en clients voor HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, modules voor integratie met verschillende webframeworks, WebSocket en Ajax handlers, connectoren naar databases (MySQL, PostgreSQL, SQLite, MongoDB), template-engines, CSS-engines, implementaties van cryptografie en autorisatiesystemen (OAuth), XML-parsers.
Om een groot aantal parallelle verzoeken te verwerken, maakt Node.js gebruik van een asynchroon model voor het uitvoeren van code, gebaseerd op het verwerken van gebeurtenissen in een niet-blokkerende modus en het definiëren van callback-handlers. Methoden zoals epoll, kqueue, /dev/poll en select worden ondersteund voor het multiplexen van verbindingen. De libuv bibliotheek, die een bovenlaag vormt boven libev in Unix-systemen en boven IOCP in Windows, wordt gebruikt voor het multiplexen van verbindingen. Voor het creëren van een thread pool wordt de libeio bibliotheek ingezet en voor het uitvoeren van DNS-verzoeken in niet-blokkerende modus is c-ares geïntegreerd. Alle systeemaanroepen die blokkeren, worden uitgevoerd binnen de thread pool en geven vervolgens, net als signaalhandlers, het resultaat van hun werk terug via een onge benoemde pijp. De uitvoering van JavaScript-code wordt mogelijk gemaakt door het gebruik van de door Google ontwikkelde V8-engine (bovendien ontwikkelt Microsoft een variant van Node.js met de Chakra-Core engine).
Node.js is in essence similar to frameworks like Perl AnyEvent, Ruby Event Machine, Python Twisted, and the event implementation in Tcl, but the event loop in Node.js is hidden from the developer and resembles event handling in a web application running in a browser. When writing applications for Node.js, it's important to consider the specifics of event-driven programming. For instance, instead of executing 'var result = db.query("select.." );' and waiting for it to finish before processing the results, Node.js employs an asynchronous execution principle where the code transforms to 'db.query("select..", function (result) {result processing});', allowing control to pass immediately to the subsequent code, while the result of the query is processed as data comes in.
Bron: opennet.ru
