Die Veröffentlichung von Node.js 23.0.0, einer Plattform zur Ausführung von Netzwerkanwendungen in JavaScript, ist erfolgt. Node.js 23.0 gehört zu den stabilen Versionen, deren Support über einen Zeitraum von 7 Monaten (bis Juni 2025) gewährleistet wird. In den kommenden Tagen wird die Stabilisierung der Node.js 22-Version abgeschlossen, die am 29. Oktober den LTS-Status (Long Term Support) erhalten wird und bis April 2027 unterstützt wird. Der Support der vorherigen LTS-Versionen Node.js 20.x und 18.x wird bis April 2026 und 2025 gewährt.
Wesentliche Verbesserungen:
- Experimentelle Unterstützung für die Programmiersprache TypeScript wurde hinzugefügt, die eine explizite Typdefinition ermöglicht. Die Unterstützung wird durch die Optionen „—experimental-strip-types“ und „—experimental-transform-types“ aktiviert. Bei der ersten Option beschränkt sich die Verwendung von TypeScript auf die Bereinigung von typespezifischen Definitionen (eine Typüberprüfung erfolgt nicht, der Code wird einfach in JavaScript ohne Typen umgewandelt). Die zweite Option wandelt bestimmte Elemente der TypeScript-Syntax, wie z.B. Enumerationen (enum) und Namensräume (namespace), in JavaScript-Code um.
- Standardmäßig ist die Möglichkeit aktiviert, die Funktion „require()“ zum Laden von JavaScript-ESM-Modulen (ECMAScript Modules) im synchronen Modus zu verwenden. ESM-Module werden in Browsern eingesetzt und ersetzen die spezifischen CommonJS-Module von Node.js. Um über „require()“ in Node.js geladen zu werden, muss das ESM-Modul synchron ausgeführt werden (ohne await auf der obersten Ebene).
- Die automatische Erkennung von ESM-Modulen in Dateien ohne Erweiterung oder mit der Erweiterung „.js“ wurde implementiert. Zuvor wurden solche Dateien als CommonJS-Module behandelt, es sei denn, ihr Typ („type“: „module“) wurde ausdrücklich in der im selben Verzeichnis befindlichen package.json-Datei angegeben. In der neuen Version wird für Dateien, deren Typ nicht in package.json angegeben ist, zunächst versucht, sie als CommonJS-Modul zu laden, und wenn dies fehlschlägt, als ESM-Modul.
- Eine experimentelle Implementierung wurde hinzugefügt browserkompatible API Web Storage, die für die dauerhafte (Klasse localStorage) oder temporäre (Klasse sessionStorage) Speicherung von Daten im Schlüssel/Wert-Format vorgesehen ist. Um die Unterstützung für Web Storage zu aktivieren, ist ein Start mit dem Flag „—experimental-webstorage“ und die Angabe des Pfades zur Datenspeicherdatei über das Flag „—localstorage-file“ erforderlich.
- Eine experimentelle SQLite-API wurde hinzugefügt, die es ermöglicht, mit Datenbanken unter Verwendung der SQL-Abfragesprache und der SQLite-Bibliothek zu arbeiten. Neben der Speicherung der Datenbank in einer Datei auf der Festplatte kann sie auch im Arbeitsspeicher platziert werden, indem anstelle des Dateinamens «:memory:» angegeben wird. Die oben erwähnte Web Storage-API wurde ebenfalls über SQLite implementiert, was zu SQLite als einer der Abhängigkeiten für Node.js führte.
- Das Kommando «node —run» wurde stabilisiert, um Skripte auszuführen, die in der Datei package.json definiert sind.
- Optionale Unterstützung für das Caching von kompilierter Code auf der Festplatte wurde implementiert, um die Ausführung von Modulen erheblich zu beschleunigen. Das Caching wird über die Umgebungsvariable NODE_COMPILE_CACHE aktiviert. Diese Funktion erinnert in ihrem Zweck an das Paket v8-compile-cache, bietet jedoch eine höhere Leistung und unterstützt ESM-Module.
- Die Buffer-Objekte wurden optimiert, was zu einer signifikanten Leistungssteigerung der Methoden Buffer.copy() und Buffer.write() führte.
- Die Leistung des Moduls node:fs wurde erhöht, wobei auch die Anzahl der C++-Funktionsaufrufe während des Betriebs verringert wurde.
- Die V8-Engine wurde auf Version 12.9 aktualisiert, die in Chromium 129 verwendet wird.
- Die Unterstützung für 32-Bit-Systeme mit Windows wurde eingestellt.
- Aufgrund der Implementierung von Funktionen, die im C++20-Standard definiert sind, in Node.js und der V8-Engine wurden die Anforderungen an die Version des GCC-Compilers erhöht. Für den Bau von Node.js ist jetzt mindestens GCC Version 12 erforderlich.
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
