Die Veröffentlichung von Node.js 23.0.0, der Plattform zur Ausführung von Netzwerk-Anwendungen in JavaScript, ist erfolgt. Node.js 23.0 gehört zu den Interimszweigen, deren Unterstützung über einen Zeitraum von 7 Monaten (bis Juni 2025) erfolgt. In den kommenden Tagen wird die Stabilisierung des Zweigs Node.js 22 abgeschlossen, der am 29. Oktober den LTS-Status erhält und bis April 2027 unterstützt wird. Die Unterstützung der früheren LTS-Zweige Node.js 20.x und 18.x wird bis April 2026 bzw. 2025 fortgesetzt.
Hauptverbesserungen:
- Die experimentelle Unterstützung für die Programmiersprache TypeScript wurde hinzugefügt, die die explizite Typendefinition zulässt. Die Unterstützung wird durch die Optionen „—experimental-strip-types“ und „—experimental-transform-types“ aktiviert. Bei der ersten Option wird die Arbeit mit TypeScript auf das Entfernen typenspezifischer Definitionen (die Typprüfung erfolgt nicht, der Code wird einfach in JavaScript ohne Typen umgewandelt) beschränkt. Die zweite Option führt die Umwandlung bestimmter Syntaxelemente von TypeScript, wie z. B. Enumerationen (enum) und Namensräume (namespace), in JavaScript-Code durch.
- Die Verwendung des Aufrufs „require()“ zum Laden von ESM-JavaScript-Modulen (ECMAScript Modules) im synchronen Modus ist standardmäßig aktiviert. ESM-Module werden in Browsern verwendet und ersetzen die spezifischen CommonJS-Module für Node.js. Um über „require()“ in Node.js geladen zu werden, muss ein ESM-Modul im synchronen Modus (ohne await auf oberster Ebene) ausgeführt werden.
- Die automatische Erkennung von ESM-Modulen in Dateien ohne Erweiterung oder mit der Erweiterung „.js“ wurde sichergestellt. Früher wurden solche Dateien als CommonJS-Module betrachtet, es sei denn, der Typ wurde in der sich im selben Verzeichnis befindenden Datei package.json ausdrücklich angegeben („type“: „module“). In der neuen Version wird zunächst versucht, die Dateien, bei denen der Typ in package.json nicht angegeben ist, als CommonJS-Modul zu laden, und wenn dies fehlschlägt, als ESM-Modul.
- Experimentelle Implementierung hinzugefügt browserkompatibel API Web Storage, das für die dauerhafte (Klasse localStorage) oder temporäre (Klasse sessionStorage) Speicherung von Daten im Schlüssel/Wert-Format gedacht ist. Für die Aktivierung der Unterstützung von Web Storage ist der Start mit dem Flag „—experimental-webstorage“ und die Angabe des Pfads zur Datei mit dem Speicher über das Flag „—localstorage-file“ erforderlich.
- Eine experimentelle SQLite-API wurde hinzugefügt, um mit Datenbanken zu arbeiten, die SQL-Abfragesprache und die SQLite-Bibliothek verwenden. Neben der Speicherung der Datenbank in einer Datei auf der Festplatte kann sie auch im Arbeitsspeicher abgelegt werden, indem man anstelle eines Dateinamens «:memory:» angibt. Die oben erwähnte Web Storage API basiert ebenfalls auf SQLite, was zur Aufnahme von SQLite in die Abhängigkeiten für Node.js führte.
- Das stabile Kommando «node —run» wurde angekündigt, das zum Ausführen von Skripten gedacht ist, die in der Datei package.json definiert sind.
- Die optionale Unterstützung für das Caching von kompiliertem Code auf der Festplatte wurde implementiert, um den Start von Modulen erheblich zu beschleunigen. Das Caching kann über die Umgebungsvariable NODE_COMPILE_CACHE aktiviert werden. In seiner Funktion ähnelt diese Möglichkeit dem Paket v8-compile-cache, unterscheidet sich jedoch durch eine höhere Leistung und unterstützt ESM-Module.
- Das Buffer-Objekt wurde optimiert, was die Leistung der Methoden Buffer.copy() und Buffer.write() erheblich verbessert hat.
- Die Leistung des Moduls node:fs wurde verbessert, wobei auch die Anzahl der Aufrufe von C++-Code während der Ausführung reduziert wurde.
- Die V8-Engine wurde auf Version 12.9 aktualisiert, die in Chromium 129 verwendet wird.
- Die Unterstützung für 32-Bit-Systeme unter Windows wurde entfernt.
- Aufgrund der Einführung von Möglichkeiten, die in der C++20-Norm im Node.js und in der V8-Engine definiert sind, wurden die Anforderungen an die GCC-Compiler-Version erhöht. Für den Build von Node.js wird jetzt mindestens GCC 12 benötigt.
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
