Die Veröffentlichung von Node.js 18.0, der Plattform zur Ausführung von Netzwerk-Anwendungen in JavaScript, fand statt. Node.js 18.0 gehört zu den Versionen mit langfristiger Unterstützung, dieser Status wird jedoch erst im Oktober nach Abschluss der Stabilisierung zugewiesen. Die Unterstützung für Node.js 18.x wird bis April 2025 gewährt. Die Wartung des vorherigen LTS-Zweigs Node.js 16.x wird bis April 2024 fortgesetzt, und des vorvorherigen LTS-Zweigs 14.x bis April 2023. Die Unterstützung des LTS-Zweigs 12.x wird am 30. April eingestellt, und die des Übergangs-Zweigs Node.js 17.x am 1. Juni.
Hauptverbesserungen:
- Die V8-Engine wurde auf Version 10.1 aktualisiert, die in Chromium 101 verwendet wird. Im Vergleich zur Version Node.js 17.9.0 wurden Funktionen wie die Methoden findLast und findLastIndex zur Suche von Elementen vom Ende des Arrays sowie die Funktion Intl.supportedValuesOf hinzugefügt. Die API Intl.Locale wurde verbessert. Die Initialisierung von Klassenfeldern und privaten Methoden wurde beschleunigt.
- Die experimentelle API fetch(), die zum Herunterladen von Ressourcen über das Netzwerk dient, wurde standardmäßig aktiviert. Die Implementierung basiert auf dem Code des HTTP/1.1-Clients undici und ist der entsprechenden API, die in Browsern bereitgestellt wird, sehr ähnlich. Darunter fällt auch die Unterstützung der Schnittstellen FormData, Headers, Request und Response zur Manipulation von HTTP-Headern bei Anfragen und Antworten. const res = await fetch(‘https://nodejs.org/api/documentation.json’); if (res.ok) { const data = await res.json(); console.log(data); }
- Eine experimentelle Implementierung der API Web Streams wurde hinzugefügt, die einen Zugang zu über das Netzwerk empfangenen Datenströmen bietet. Die API ermöglicht es, eigene Handler hinzuzufügen, um mit Daten umzugehen, während Informationen über das Netz eingehen, ohne auf den vollständigen Dateidownload zu warten. In Node.js sind nun Objekte wie ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream und DecompressionStream verfügbar.
- Die API Blob, die die Kapselung unveränderlicher Rohdaten zur sicheren Verwendung in verschiedenen Arbeitskontexten ermöglicht, wurde in den stabilen Status überführt.
- Die API BroadcastChannel, die asynchronen Nachrichtenaustausch im Format „ein Sender – viele Empfänger“ ermöglicht, wurde ebenfalls in den stabilen Status überführt.
- Das experimentelle Modul node:test wurde hinzugefügt, um Tests in JavaScript zu erstellen und auszuführen, die Ergebnisse im Format TAP (Test Anything Protocol) zurückgeben.
- Die Fertigung fertiger Builds für Red Hat Enterprise Linux (RHEL) 8 und andere Distributionen auf Basis von Glibc 2.28+, einschließlich Debian 10 und Ubuntu 20.04, sowie für macOS 10.15+, wurde sichergestellt. Aufgrund von Problemen bei der Erstellung der V8-Engine wurde die Erstellung von 32-Bit-Builds für Windows vorübergehend eingestellt.
- Eine experimentelle Möglichkeit zur Erstellung einer ausführbaren Datei von Node.js mit vom Benutzer ausgewählten Komponenten, die beim Start initialisiert werden, wurde bereitgestellt. Um die Startkomponenten zu definieren, wurde im Build-Skript configure die Option „—node-snapshot-main“ hinzugefügt, zum Beispiel „./configure —node-snapshot-main=marked.js; name node“
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
