Die serverseitige JavaScript-Plattform Node.js 20.0 ist verfügbar.

Die Veröffentlichung von Node.js 20.0, einer Plattform zur Ausführung von Netzwerk-Anwendungen in JavaScript, fand statt. Node.js 20.0 gehört zu den Versionen mit langfristiger Unterstützung, jedoch wird dieser Status erst im Oktober nach der Stabilisierung vergeben. Die Unterstützung von Node.js 20.x wird bis zum 30. April 2026 gewährleistet. Die Unterstützung der vorherigen LTS-Version Node.js 18.x wird bis April 2025 fortgesetzt, während die vorvorherige LTS-Version 16.x bis September 2023 unterstützt wird. Die Unterstützung der LTS-Version 14.x wird am 30. April eingestellt, die der internen Version Node.js 19.x am 1. Juni.

Hauptverbesserungen:

  • Die V8-Engine wurde auf Version 11.3 aktualisiert, die in Chromium 113 verwendet wird. Im Vergleich zur Version Node.js 19, die die Chromium 107-Engine verwendete, wurden die Funktionen String.prototype.isWellFormed und toWellFormed, Methoden für Array.prototype und TypedArray.prototype zur Arbeit mit Kopien bei Änderungen an Array- und TypedArray-Objekten, das Flag «v» in RegExp, die Unterstützung für die Größenänderung von ArrayBuffer und die Erhöhung der Größe von SharedArrayBuffer sowie die tail-call Rekursion in WebAssembly hinzugefügt.
  • Предложен экспериментальный механизм Permission Model, позволяющий ограничить доступ к определённым ресурсам в процессе исполнения. Поддержка Permission Model включается через указание при запуске флага «—experimental-permission». В начальной реализации предложены опции для ограничения доступа на запись (—allow-fs-write) и чтение (—allow-fs-read) к определённым частям ФС, дочерним процессам (—allow-child-process), дополнениям (—no-addons) и потокам (—allow-worker). Например, чтобы разрешить запись в каталог /tmp и чтение файла /home/index.js можно указать: node —experimental-permission —allow-fs-write=/tmp/ —allow-fs-read=/home/index.js index.js

    Zur Überprüfung des Zugriffs wird geraten, die Methode process.permission.has() zu verwenden, zum Beispiel «process.permission.has(‘fs.write’,»/tmp/test»).

  • Externe ECMAScript-Module (ESM), die über die Option «—experimental-loader» geladen werden, werden jetzt in einem separaten, vom Haupt-Thread isolierten Thread ausgeführt, wodurch eine Überlappung des Anwendungs- und des geladenen ESM-Codes ausgeschlossen wird. Ähnlich wie in Browsern wird die Methode import.meta.resolve() bei einem Aufruf aus der Anwendung jetzt synchron ausgeführt. In einem der nächsten Node.js-Branches planen sie, die Unterstützung für das Laden von ESM zu stabilisieren.
  • Das Modul node:test (test_runner), das zur Erstellung und Ausführung von Tests in JavaScript dient und Ergebnisse im TAP-Format (Test Anything Protocol) zurückgibt, wurde in den stabilen Bereich transferiert.
  • Ein separates Entwicklerteam wurde gebildet, das für die Leistungsoptimierung verantwortlich ist. Bei der Vorbereitung eines neuen Branches wurde die Leistung verschiedener Runtime-Komponenten optimiert, einschließlich URL-Parsing, fetch() und EventTarget. Zum Beispiel wurden die Kosten für die Initialisierung von EventTarget halbiert, die Leistung der Methode URL.canParse() erheblich gesteigert und die Effizienz von Timern verbessert. Zudem wurde ein hochleistungsfähiger URL-Parser — Ada 2.0, geschrieben in C++, hinzugefügt.
  • Die Entwicklung der experimentellen Möglichkeit zur Bereitstellung von Anwendungen in Form einer einzelnen ausführbaren Datei (SEA, Single Executable Applications) wurde fortgesetzt. Die Erstellung der ausführbaren Datei erfordert jetzt die Einfügung eines Blobs, der auf der Konfigurationsdatei im JSON-Format basiert (anstatt der Einfügung einer JavaScript-Datei).
  • Die API-Web-Kryptokompatibilität wurde mit Implementierungen anderer Projekte verbessert.
  • Offizielle Unterstützung für Windows auf ARM64-Systemen wurde hinzugefügt.
  • Die Implementierung der Unterstützung für WASI-Erweiterungen (WebAssembly System Interface) zur Erstellung isolierter WebAssembly-Anwendungen wurde fortgesetzt. Die Notwendigkeit, ein spezielles Kommandozeilen-Flag zur Aktivierung der WASI-Unterstützung anzugeben, wurde aufgehoben.

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 verarbeiten, nutzt Node.js ein asynchrones Codeausführungsmodell, das auf der Verarbeitung von Ereignissen im nicht-blockierenden Modus und der Definition von Callback-Handlern basiert. Unterstützt werden Methoden wie epoll, kqueue, /dev/poll und select für das Multiplexen von Verbindungen. Für das Multiplexen von Verbindungen wird die Bibliothek libuv verwendet, die eine Erweiterung von libev in Unix-Systemen und von IOCP in Windows ist. Zur Erstellung eines Thread-Pools wird die Bibliothek libeio verwendet, für die Durchführung von DNS-Anfragen im nicht-blockierenden Modus ist c-ares integriert. Alle systemeigenen Aufrufe, die eine Blockierung verursachen, werden innerhalb des Thread-Pools ausgeführt und über eine unbenannte Pipe das Ergebnis ihrer Arbeit zurückgegeben, ebenso wie Signal-Handler. Die Ausführung von JavaScript-Code erfolgt durch den Einsatz der von Google entwickelten V8-Engine (zuzüglich Microsoft entwickelt 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 Ereignisimplementation in Tcl, jedoch ist die Ereignisschleife (event loop) in Node.js für den Entwickler verborgen und erinnert an die Ereignisverarbeitung in einer Webanwendung, die im Browser läuft. Beim Erstellen von Anwendungen für Node.js muss man die Besonderheiten der ereignisgesteuerten Programmierung berücksichtigen, zum Beispiel anstelle von „var result = db.query(„select..“);“ mit der Erwartung, dass die Ausführung abgeschlossen ist und die Ergebnisse anschließend verarbeitet werden, wird in Node.js das Prinzip der asynchronen Ausführung verwendet, d.h. der Code wird zu „db.query(„select..“, function (result) { Verarbeitung des Ergebnisses });“ umgewandelt, wobei die Kontrolle sofort an den nachfolgenden Code übergeben wird und das Ergebnis der Abfrage bei Erhalt der Daten verarbeitet wird.

Quelle: opennet.ru

60GB SSD 8Gb DDR4