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
