Die Version Node.js 21.0 wurde veröffentlicht, die Plattform zur Ausführung von Netzwerk-Anwendungen in JavaScript. Die Unterstützung für die Node.js 21.0-Linie wird für 6 Monate aufrechterhalten. In den nächsten Tagen wird die Stabilisierung der Node.js 20-Linie abgeschlossen, die den LTS-Status erhalten wird und bis April 2026 unterstützt wird. Die Unterstützung der vorherigen LTS-Version Node.js 18.0 wird bis September 2025 fortgesetzt, und die vorvorherige LTS-Version 16.0 bis April 2024.
Hauptverbesserungen:
- Die stabile API Fetch wurde angekündigt, die zum Herunterladen von Ressourcen über das Netz dient und das Schreiben von universellem JavaScript-Code erleichtert, der sowohl auf der Server- als auch auf der Client-Seite funktioniert. Die Implementierung basiert auf dem Code des HTTP/1.1-Clients undici und ist weitgehend identisch mit der ähnlichen API, die in Browsern bereitgestellt wird. Die API umfasst die Methode fetch() sowie die Objekte Headers, Request und Response, die die HTTP-Header, die Anfrage und die Antwort darstellen. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- Die Unterstützung der API WebStreams wurde stabilisiert, die den Zugriff auf Datenströme ermöglicht, die über das Netz empfangen werden. Die API erlaubt es, eigene Handler hinzuzufügen, die während des Datenempfangs im Netzwerk arbeiten, ohne auf den vollständigen Dateidownload warten zu müssen. In Node.js sind Objekte wie ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream und DecompressionStream verfügbar.
- Eine experimentelle Implementierung des WebSocket-Clients wurde hinzugefügt, die mit Browsern kompatibel ist. Um die Unterstützung für WebSocket zu aktivieren, ist das Flag «—experimental-websocket» vorgesehen.
- Ein experimenteller Standardmodus für die Verwendung von ESM (ECMAScript Modules, die in Browsermodulen verwendet werden) anstelle von CommonJS (spezifisch für Node.js) wurde hinzugefügt. Diese Änderung betrifft nicht Module, deren Format eindeutig über das Feld «type» in package.json definiert ist, das über das Flag «—input-type» angegeben wird oder durch die Dateiendung offensichtlich ist (.mjs für ESM, .cjs für CommonJS). Module, die nicht ausdrücklich als CommonJS definiert sind (z. B. die Endung «.js» haben), werden im neuen Modus als ESM-Module betrachtet. Zum Aktivieren der neuen Modulkonfigurationen wird das Flag «—experimental-default-type» vorgeschlagen.
- Die V8-Engine wurde auf Version 11.8 aktualisiert, die in Chromium 118 verwendet wird, das die Unterstützung für die Methode ArrayBuffer.prototype.transfer, die Möglichkeit zur Gruppierung von Arrays (Methode groupBy) und WebAssembly-Befehle zur Verarbeitung von Konstanten (i32.add, i32.sub, i32.mul, i64.add, i64.sub und i64.mul) eingeführt hat.
- Die Unterstützung des Handlers globalPreload wurde eingestellt, stattdessen sollten für die Konfiguration von Modulen die Aufrufe register und initialize verwendet werden.
- Die Funktion fs.writeFile wurde um die Option „flush“ erweitert, um Daten nach jeder Schreiboperation zwingend auf das Speichermedium zu schreiben.
- Die Leistung des Codes, der mit der URL-Analyse, der fetch-API, Streams, node:fs und HTTP zusammenhängt, wurde verbessert.
- Ein globales Objekt navigator wurde hinzugefügt. Zum Beispiel kann das Attribut navigator.hardwareConcurrency verwendet werden, um Informationen über die Anzahl der CPU-Kerne abzurufen.
- Im Parameter „—test“ wurde die Unterstützung für Glob-Muster zur Auswahl der auszuführenden Tests hinzugefügt (z.B. kann „—test **/*.test.js“ angegeben werden).
- Die im Paket enthaltenen Versionen des Paketmanagers npm 10.2.0 und des Parsers llhttp 9.1.2 wurden aktualisiert.
- Die Unterstützung von Visual Studio 2019 und älteren Versionen von macOS unter 11.0 wurde eingestellt.
Die Node.js-Plattform kann sowohl für die serverseitige Unterstützung von Webanwendungen als auch für die Erstellung von regulären Client- und Server-Netzwerkprogrammen genutzt werden. Um die Funktionalität von Node.js-Anwendungen zu erweitern, wurde eine umfangreiche Sammlung von Modulen erstellt, in der man Module mit Implementierungen finden kann. Server und HTTP-, SMTP-, XMPP-, DNS-, FTP-, IMAP-, POP3-Clients, Module zur Integration mit verschiedenen Web-Frameworks, WebSocket- und Ajax-Handler, Datenbank-Connectoren (MySQL, PostgreSQL, SQLite, MongoDB), Template-Engines, CSS-Engines, Implementierungen von Krypto-Algorithmen und Autorisierungssystemen (OAuth), XML-Parser.
Um eine große Anzahl paralleler Anfragen zu verarbeiten, nutzt Node.js ein asynchrones Codeausführungsmodell, das auf der Verarbeitung von Ereignissen im nicht-blockierenden Modus und der Definition von Callback-Handlern basiert. Unterstützt werden Methoden wie epoll, kqueue, /dev/poll und select für das Multiplexen von Verbindungen. Für das Multiplexen von Verbindungen wird die Bibliothek libuv verwendet, die eine Erweiterung von libev in Unix-Systemen und von IOCP in Windows ist. Zur Erstellung eines Thread-Pools wird die Bibliothek libeio verwendet, für die Durchführung von DNS-Anfragen im nicht-blockierenden Modus ist c-ares integriert. Alle systemeigenen Aufrufe, die eine Blockierung verursachen, werden innerhalb des Thread-Pools ausgeführt und über eine unbenannte Pipe das Ergebnis ihrer Arbeit zurückgegeben, ebenso wie Signal-Handler. Die Ausführung von JavaScript-Code erfolgt durch den Einsatz der von Google entwickelten V8-Engine (zuzüglich Microsoft entwickelt eine Variante von Node.js mit der Chakra-Core-Engine).
Im Grunde ähnelt Node.js den Frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted und der Ereignisimplementation in Tcl, jedoch ist die Ereignisschleife (event loop) in Node.js für den Entwickler verborgen und erinnert an die Ereignisverarbeitung in einer Webanwendung, die im Browser läuft. Beim Erstellen von Anwendungen für Node.js muss man die Besonderheiten der ereignisgesteuerten Programmierung berücksichtigen, zum Beispiel anstelle von „var result = db.query(„select..“);“ mit der Erwartung, dass die Ausführung abgeschlossen ist und die Ergebnisse anschließend verarbeitet werden, wird in Node.js das Prinzip der asynchronen Ausführung verwendet, d.h. der Code wird zu „db.query(„select..“, function (result) { Verarbeitung des Ergebnisses });“ umgewandelt, wobei die Kontrolle sofort an den nachfolgenden Code übergeben wird und das Ergebnis der Abfrage bei Erhalt der Daten verarbeitet wird.
Quelle: opennet.ru
