Node.js 22.0 wurde veröffentlicht, eine Plattform zur Ausführung von Netzwerkapplikationen in JavaScript. Node.js 22.0 gehört zu den Versionen mit langfristiger Unterstützung, dieser Status wird jedoch erst im Oktober verliehen, nach einer Stabilisierung. Die Unterstützung für Node.js 22.x wird bis zum 30. April 2027 bereitgestellt. Die Unterstützung der vorherigen LTS-Version Node.js 20.x endet im April 2026, während die vorvorherige LTS-Version 18.x bis April 2025 betreut wird. Die Unterstützung der Zwischenversion Node.js 21.x wird am 1. Juni 2024 eingestellt.
Wesentliche Verbesserungen:
- Die V8-Engine wurde auf Version 12.4 aktualisiert, die in Chromium 124 verwendet wird. Die Änderungen im Vergleich zur Version Node.js 21, die die V8-Engine 11.8 verwendete, umfassen:
- Die Unterstützung der Erweiterung WasmGC, die das Portieren von Programmen, die mit speicherbereinigenden Programmiersprachen (Kotlin, PHP, Java usw.) geschrieben wurden, in WebAssembly vereinfacht. WasmGC fügt neue Typen von Strukturen und Arrays hinzu, für die nicht-lineare Speicherzuweisung angewendet werden kann.
- Die Unterstützung der Methode Array.fromAsync(), die im asynchronen Modus eine neue Instanz eines Array-Objekts zurückgibt, kopiert aus arrayähnlichen Objekten, die iterierbar (iterable) oder asynchron iterierbar (async iterable) sind.
- Unterstützung von Methoden für die 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 zur Implementierung typischer Mengenoperationen wie Schnitte, Vereinigungen, Differenzen und Ergänzungen anbietet.
- Der optimierende JIT-Compiler Maglev ist standardmäßig aktiviert und zielt darauf ab, schnell leistungsstarken Maschinencode für aktiv genutzten JavaScript-Code zu generieren. Die Aktivierung von Maglev ermöglicht eine signifikante Beschleunigung von kurzlebigen CLI-Anwendungen, die keine langen Operationen ausführen. Zum Beispiel wird die Testzeit von Jetstream um 7,5 % verkürzt, während der Speedometer-Test um 5 % schneller ist.
- Die Verarbeitung von Streams wurde beschleunigt, indem der Wert der Option highWaterMark von 16 KB auf 65 KB erhöht wurde (definiert das Limit, bis zu dem das Schreiben gepuffert wird). Diese Änderung führt zu einem Anstieg des Speicherverbrauchs, sodass Anwendungen, die für den Einsatz mit begrenztem RAM ausgelegt sind, möglicherweise den alten Wert über den Aufruf von setDefaultHighWaterMark() zurücksetzen müssen.
- Die Leistung der API fetch() und des Testläufers wurde durch verbesserte Effizienz bei der Erstellung von Instanzen von AbortSignal gesteigert. Auch die Leistung der APIs, die mit synchroner Arbeit mit Dateisystemen verbunden sind, wurde erhöht.
- Eine experimentelle Möglichkeit zur Verwendung des Aufrufs „require()“ zur synchronen Lade von JavaScript-Modulen ESM (ECMAScript-Module) wurde bereitgestellt. ESM-Module werden in Browsern eingesetzt und ersetzen die spezifischen CommonJS-Module für Node.js. Um ein ESM-Modul über „require()“ zu laden, muss es synchron ausgeführt werden (ohne await auf der obersten Ebene). Die Unterstützung wird durch das Flag „—experimental-require-module“ aktiviert.
- Eine experimentelle Möglichkeit zum Ausführen von Skripten, die in der Datei package.json definiert sind, wurde hinzugefügt, indem der Befehl „—run “ verwendet wird.
- Der Befehl „node —watch“ wurde in die stabile Kategorie aufgenommen, wobei der Überwachungsmodus implementiert wurde, der einen Neustart des Prozesses bei Änderungen der importierten Datei ermöglicht (zum Beispiel wird der Prozess automatisch neu gestartet, wenn „node —watch index.js“ ausgeführt wird und index.js geändert wird).
- Die integrierte WebSocket-API-Implementierung wurde stabilisiert, wodurch WebSocket im Client-Modus ohne zusätzliche Abhängigkeiten verwendet werden kann.
- Teilweise Unterstützung für die Navigator-API hinzugefügt.
- Die Webstreams-API unterstützt jetzt das deflate-raw Komprimierungsformat.
- Im Modul node:fsmodule wurden die Funktionen glob und globSync zur Mustererkennung von Dateipfaden hinzugefügt.
- Die Verarbeitung fehlerhaft konfigurierter IPv6-Stacks wurde verbessert. Ein Happy Eyeballs-Algorithmus wurde implementiert, um im Falle von Problemen mit IPv6 schnell zurückzukehren.
- Die util-API wurde als veraltet erklärt.
- Die 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 6.6.0.
Die Node.js-Plattform kann sowohl für die serverseitige Unterstützung von Webanwendungen als auch für die Entwicklung herkömmlicher Client- und Server-Netzwerkprogramme genutzt werden. Für die Erweiterung der Funktionalität von Node.js-Anwendungen steht eine umfangreiche Sammlung von Modulen zur Verfügung, die Module mit Implementierungen bereitstellt, 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 Kryptografie-Algorithmen und Authentifizierungssystemen (OAuth), XML-Parser.
Um eine große Anzahl paralleler Anfragen zu verarbeiten, nutzt Node.js ein asynchrones Code-Ausführungsmodell, das auf ereignisgesteuerter, nicht-blockierender Verarbeitung und der Definition von Callback-Handlern basiert. Unterstützte Methoden für das Multiplexing von Verbindungen sind unter anderem epoll, kqueue, /dev/poll und select. Für das Multiplexing von Verbindungen kommt die Bibliothek libuv zum Einsatz, die eine Abstraktion über libev in Unix-Systemen und über IOCP in Windows darstellt. Zur Erstellung eines Thread-Pools (Thread-Pool) wird die Bibliothek libeio verwendet, und für nicht-blockierende DNS-Anfragen ist c-ares integriert. Alle systemeigenen Funktionen, die eine Blockierung hervorrufen, werden innerhalb des Thread-Pools ausgeführt und geben das Ergebnis ihrer Arbeit über ein anonymes Pipe zurück, ebenso wie die Signal-Handler.
Die Ausführung von JavaScript-Code erfolgt über die Nutzung der von Google entwickelten V8-Engine (darüber hinaus entwickelt Microsoft eine Variante von Node.js mit der Chakra-Core-Engine). Node.js ähnelt in seiner Funktionsweise den Frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted und der Ereignisimplementierung in Tcl, jedoch ist die Ereignisverarbeitungsschleife in Node.js vor dem Entwickler verborgen und ähnelt der Ereignisverarbeitung in Webanwendungen, die im Browser laufen.
Quelle: opennet.ru
