Serverseitige JavaScript-Plattform Node.js 20.0 verfügbar

Die Veröffentlichung von Node.js 20.0, einer Plattform zum Ausführen von Netzwerkanwendungen in JavaScript, ist erfolgt. Node.js 20.0 wurde dem Long-Support-Zweig zugeordnet, dieser Status wird jedoch erst im Oktober nach der Stabilisierung zugewiesen. Node.js 20.x wird bis zum 30. April 2026 unterstützt. Die Wartung des vorherigen Node.js 18.x LTS-Zweigs dauert bis April 2025 und des vorherigen 16.x LTS-Zweigs bis September 2023. Der LTS-Zweig 14.x wird am 30. April und der Interimszweig Node.js 19.x am 1. Juni außer Betrieb genommen.

Wichtigste Verbesserungen:

  • Die V8-Engine wurde auf Version 11.3 aktualisiert, die in Chromium 113 verwendet wird. Zu den Änderungen im Vergleich zum Node.js 19-Zweig, der die Chromium 107-Engine verwendete, gehören die Funktionen String.prototype.isWellFormed und toWellFormed sowie Array.prototype und TypedArray.prototype-Methoden zum Arbeiten mit Kopien bei Änderungen von Array- und TypedArray-Objekten, „v“-Flag in RegExp, Unterstützung für die Größenänderung von ArrayBuffer und die Vergrößerung von SharedArrayBuffer, Tail-Call in WebAssembly.
  • Es wird ein experimenteller Berechtigungsmodellmechanismus vorgeschlagen, der es Ihnen ermöglicht, den Zugriff auf bestimmte Ressourcen während der Ausführung einzuschränken. Die Unterstützung des Berechtigungsmodells wird durch Angabe des Flags „--experimental-permission“ beim Ausführen aktiviert. In der ersten Implementierung wurden Optionen vorgeschlagen, um den Schreibzugriff (--allow-fs-write) und den Lesezugriff (--allow-fs-read) auf bestimmte Teile des FS und untergeordnete Prozesse (--allow-child-process) einzuschränken. , Add-ons (--no-addons) und Threads (--allow-worker). Um beispielsweise das Schreiben in das Verzeichnis /tmp und das Lesen der Datei /home/index.js zuzulassen, können Sie Folgendes angeben: node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read =/home/index.js index .js

    Um den Zugriff zu überprüfen, wird empfohlen, die Methode „process.permission.has()“ zu verwenden, zum Beispiel „process.permission.has(‘fs.write‘,“/tmp/test“).

  • Handler für externe ECMAScript-Module (ESMs), die über die Option „--experimental-loader“ geladen werden, werden jetzt in einem separaten Thread ausgeführt, der vom Hauptthread isoliert ist, wodurch die Überschneidung von Anwendungscode und geladenen ESM-Modulen vermieden wird. Ähnlich wie bei Browsern wird die Methode import.meta.resolve() jetzt synchron ausgeführt, wenn sie aus einer Anwendung heraus aufgerufen wird. In einem der nächsten Zweige von Node.js ist geplant, die ESM-Ladeunterstützung in die Kategorie der stabilen Funktionen zu verschieben.
  • Das Modul node:test (test_runner), das zum Erstellen und Ausführen von JavaScript-Tests entwickelt wurde, die Ergebnisse im TAP-Format (Test Anything Protocol) zurückgeben, wurde nach Stable verschoben.
  • Es wurde ein separates Performance-Team gebildet, das in Vorbereitung auf den neuen Zweig daran gearbeitet hat, verschiedene Laufzeitkomponenten zu beschleunigen, darunter URL-Parsing, fetch() und EventTarget. Beispielsweise wurde der Aufwand für die Initialisierung des EventTarget halbiert, die Leistung der URL.canParse()-Methode wurde erheblich verbessert und die Effizienz der Timer wurde verbessert. Darüber hinaus ist die Veröffentlichung eines leistungsstarken URL-Parsers – Ada 2.0, geschrieben in C++ – in der Komposition enthalten.
  • Die Entwicklung einer experimentellen Funktion zur Bereitstellung von Anwendungen in Form einer einzelnen ausführbaren Datei (SEA, Single Executable Applications) wurde fortgesetzt. Das Erstellen einer ausführbaren Datei erfordert jetzt das Ersetzen eines aus einer JSON-Konfigurationsdatei generierten Blobs (anstelle des Ersetzens einer JavaScript-Datei).
  • Verbesserte Kompatibilität der Web Crypto API mit Implementierungen aus anderen Projekten.
  • Offizielle Unterstützung für Windows auf ARM64-Systemen hinzugefügt.
  • Fortgesetzte Unterstützung für WASI-Erweiterungen (WebAssembly System Interface) zum Erstellen eigenständiger WebAssembly-Anwendungen. Die Notwendigkeit, ein spezielles Befehlszeilen-Flag anzugeben, um die WASI-Unterstützung zu aktivieren, wurde entfernt.

Die Node.js-Plattform kann sowohl für die Serverwartung von Webanwendungen als auch für die Erstellung regulärer Client- und Server-Netzwerkprogramme verwendet werden. Um die Funktionalität von Anwendungen für Node.js zu erweitern, wurde eine große Modulsammlung vorbereitet, in der Sie Module mit der Implementierung von HTTP-, SMTP-, XMPP-, DNS-, FTP-, IMAP-, POP3-Servern und -Clients sowie Module zur Integration finden mit verschiedenen Web-Frameworks, WebSocket- und Ajax-Handlern, DBMS-Konnektoren (MySQL, PostgreSQL, SQLite, MongoDB), Templating-Engines, CSS-Engines, Implementierungen von Kryptoalgorithmen und Autorisierungssystemen (OAuth), XML-Parsern.

Um die Verarbeitung einer großen Anzahl paralleler Anfragen sicherzustellen, verwendet Node.js ein asynchrones Codeausführungsmodell, das auf nicht blockierender Ereignisbehandlung und der Definition von Callback-Handlern basiert. Unterstützte Methoden zum Multiplexen von Verbindungen sind epoll, kqueue, /dev/poll und select. Für das Verbindungsmultiplexing wird die libuv-Bibliothek verwendet, die ein Add-on für libev auf Unix-Systemen und IOCP auf Windows ist. Die libeio-Bibliothek wird zum Erstellen eines Thread-Pools verwendet und c-ares ist integriert, um DNS-Abfragen im nicht blockierenden Modus durchzuführen. Alle Systemaufrufe, die eine Blockierung verursachen, werden innerhalb des Thread-Pools ausgeführt und übertragen dann wie Signalhandler das Ergebnis ihrer Arbeit über eine unbenannte Pipe (Pipe) zurück. Die Ausführung von JavaScript-Code erfolgt durch die Verwendung der von Google entwickelten V8-Engine (zusätzlich entwickelt Microsoft eine Version von Node.js mit der Chakra-Core-Engine).

Im Kern ähnelt Node.js den Perl AnyEvent-, Ruby Event Machine-, Python Twisted-Frameworks und der Tcl-Ereignisimplementierung, aber die Ereignisschleife in Node.js bleibt dem Entwickler verborgen und ähnelt der Ereignisbehandlung in einer laufenden Webanwendung im Browser. Beim Schreiben von Anwendungen für node.js müssen Sie beispielsweise die Besonderheiten der ereignisgesteuerten Programmierung berücksichtigen, anstatt „var result = db.query(“select..“);“ auszuführen. Beim Warten auf den Abschluss der Arbeit und der anschließenden Verarbeitung der Ergebnisse verwendet Node.js das Prinzip der asynchronen Ausführung, d. h. Der Code wird in „db.query(“select..“, function (result) {result processing});“ umgewandelt, wobei die Kontrolle sofort an weiteren Code übergeben wird und das Abfrageergebnis verarbeitet wird, sobald Daten eintreffen.

Source: opennet.ru

Kommentar hinzufügen