Die Veröffentlichung von Node.js 22.0, einer Plattform zum Ausführen von Netzwerk-Anwendungen in JavaScript, fand statt. Node.js 22.0 gehört zu den Versionen mit langfristigem Support, dieser Status wird jedoch erst im Oktober vergeben, nachdem eine Stabilisierung stattgefunden hat. Der Support für Node.js 22.x wird bis zum 30. April 2027 fortgesetzt. Die Unterstützung für die vorherige LTS-Version Node.js 20.x dauert bis April 2026, während die vor-vorherige LTS-Version 18.x bis April 2025 betreut wird. Der Support für die Zwischenversion Node.js 21.x wird am 1. Juni 2024 eingestellt.
Hauptverbesserungen:
- Die V8-Engine wurde auf Version 12.4 aktualisiert, die in Chromium 124 verwendet wird. Im Vergleich zur Version Node.js 21, die die V8-Engine 11.8 verwendete, sind die folgenden Änderungen zu vermerken:
- Unterstützung der WasmGC-Erweiterung, die das Portieren von in Programmiersprachen, die einen Garbage Collector verwenden (wie Kotlin, PHP, Java usw.), geschriebenen Programmen in WebAssembly vereinfacht. WasmGC fügt neue Typen von Strukturen und Arrays hinzu, für die nichtlineale Speicherzuweisungen verwendet werden können.
- Unterstützung der Methode Array.fromAsync(), die im asynchronen Modus eine neue Instanz eines Array-Objekts zurückgibt, das aus array-ähnlichen, iterierbaren (iterable) oder asynchron iterierbaren (async iterable) Objekten kopiert wurde.
- Unterstützung von Methoden zur Arbeit mit Iteratoren, wie .map, .filter, .find, .take, .drop, .forEach und .reduce.
- Unterstützung des Set-Objekts, das eine Sammlung von Werten definiert und Methoden zum Implementieren typischer Mengenoperationen wie Schnittmengen, Vereinigungen, Differenzen und Ergänzungen anbietet.
- Standardmäßig ist der optimierende JIT-Compiler Maglev aktiviert, der auf die schnelle Erstellung von leistungsstarkem Maschinencode für häufig verwendeten JavaScript-Code abzielt. Die Aktivierung von Maglev ermöglicht eine spürbare Beschleunigung der Ausführung von kurzlebigen CLI-Anwendungen, die keine langanhaltenden Operationen durchführen; beispielsweise wird die Zeit für den Jetstream-Test um 7,5 % verkürzt und für den Speedometer-Test um 5 %.
- Die Verarbeitung von Streams wurde durch Erhöhung des Werts von highWaterMark von 16 KB auf 65 KB beschleunigt (dies definiert das Limit, bis zu dem das Schreiben gepuffert wird). Diese Änderung führt zu einem erhöhten Speicherverbrauch, sodass Anwendungen, die für die Arbeit mit begrenztem RAM ausgelegt sind, möglicherweise den alten Wert durch den Aufruf von setDefaultHighWaterMark() zurückgeben müssen.
- Die Leistung der API fetch() und des Testlaufers wurde durch die Effizienzsteigerung bei der Instanziierung von AbortSignal verbessert. Auch die Leistung der APIs, die mit der synchronen Arbeit mit Dateisystemen zusammenhängen, wurde erhöht.
- Eine experimentelle Funktion zur Verwendung des Aufrufs „require()“ zum Laden von JavaScript-Modulen ESM (ECMAScript-Module) im synchronen Modus wurde bereitgestellt. ESM-Module werden in Browsern verwendet und ersetzen die für Node.js spezifischen CommonJS-Module. Um ein ESM-Modul über „require()“ zu laden, muss es im synchronen Modus ausgeführt werden (ohne await auf oberster Ebene). Die Unterstützung wird durch das Flag „—experimental-require-module“ aktiviert.
- Eine experimentelle Möglichkeit wurde hinzugefügt, Skripte, die in der Datei package.json definiert sind, mit dem Befehl „—run “ auszuführen.
- Der Befehl „node —watch“ wurde in die stabile Kategorie überführt und implementiert einen Überwachungsmodus, der den Prozess beim Ändern der importierten Datei neu startet (zum Beispiel wird der Prozess automatisch neu gestartet, wenn sich index.js ändert, wenn „node —watch index.js“ ausgeführt wird).
- Die eingebaute Implementation der WebSocket-API wurde stabilisiert, sodass WebSocket im Client-Modus ohne zusätzliche Abhängigkeiten verwendet werden kann.
- Teilweise Unterstützung der Navigator-API wurde hinzugefügt.
- Im Webstreams-API wurde Unterstützung für das deflate-raw-Komprimierungsformat hinzugefügt.
- Im Modul node:fsmodule wurden die Funktionen glob und globSync zum Abgleichen von Dateipfaden nach Muster hinzugefügt.
- Die Verarbeitung von fehlerhaft konfigurierte IPv6-Stacks wurde verbessert. Ein Happy Eyeballs-Algorithmus wurde implementiert, um bei Problemen mit IPv6 schnell zurückzukehren.
- Die util-API wurde als veraltet erklärt.
- Die Versionen der Abhängigkeiten wurden aktualisiert: npm 10.5.1, libuv 1.48.0, simdutf 5.2.3, c-ares 1.28.1, zlib 1.3.0.1-motley-24c07df, simdjson auf 3.8.0, ada 2.7.7 und undici auf 6.6.0.
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 bearbeiten, verwendet Node.js ein asynchrones Codeausführungsmodell, das auf der Verarbeitung von Ereignissen im nicht-blockierenden Modus und der Definition von Callback-Handlern basiert. Zur Multiplexierung von Verbindungen werden Methoden wie epoll, kqueue, /dev/poll und select unterstützt. Für die Multiplexierung von Verbindungen wird die libuv-Bibliothek verwendet, die eine Erweiterung von libev in Unix-Systemen und von IOCP in Windows darstellt. Für die Erstellung eines Thread-Pools wird die libeio-Bibliothek verwendet, und für die Ausführung von DNS-Anfragen im nicht-blockierenden Modus ist c-ares integriert. Alle Systemaufrufe, die Blockierungen verursachen, werden innerhalb des Thread-Pools ausgeführt und, wie auch die Signalhandler, geben das Ergebnis ihrer Arbeit über eine nicht benannte Pipe zurück.
Die Ausführung von JavaScript-Code erfolgt durch den Einsatz der von Google entwickelten V8-Engine (zusätzlich entwickelt Microsoft 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 ereignisgesteuerten Implementierung in Tcl, aber die Ereignisverarbeitungsschleife (Event Loop) in Node.js ist für den Entwickler verborgen und ähnelt der Ereignisverarbeitung in einer Webanwendung, die im Browser ausgeführt wird.
Quelle: opennet.ru
