Node.js v20 ist jetzt verfügbar! Am 18. April 2023 wurde es veröffentlicht und kann nun von allen genutzt werden. Mit dieser Version sollte Node.js viel sicherer und leistungsfähiger sein.

Wichtig zu wissen: Da es sich um eine geradzahlige Version handelt, wird sie im Oktober 2023 zu einer Long-Term-Support-Version (LTS) und wird bis April 2026 unterstützt. Das Node.js-Team sucht jedoch aktiv nach Feedback aus der Community, um eventuelle Probleme zu identifizieren und zu beheben, bevor sie zur LTS-Version erhoben wird.

Diese neue Version von Node.js bringt aufregende Updates und Funktionen, die Entwicklerinnen und Entwickler sicher zu schätzen wissen werden, wie das experimentelle Permission Model, synchrones import.meta.resolve, einen stabilen Testrunner, Updates der V8 JavaScript Engine auf Version 11.3, die Leistungsverbesserungen und Fehlerbehebungen mit sich bringen, und vieles mehr.

In diesem Artikel erfährst du mehr über die Änderungen in Node.js v20 und erhältst einen detaillierten Einblick in die neuen Funktionen und Möglichkeiten.

Erste Schritte mit Node.js v20

Die Installation von Node.js v20 ist ganz ähnlich wie bei anderen Node.js-Versionen. Alles, was du tun musst, ist:

  1. Lade das Installationspaket von der offiziellen Node.js-Website herunter.
  2. Sobald du das Installationsprogramm heruntergeladen hast, führe es aus und folge den Anweisungen, um den Installationsprozess abzuschließen. Dieser Prozess ist ziemlich einfach und du musst nur der Lizenzvereinbarung zustimmen und auf „Weiter“ klicken.
  3. Starte das System/deinen Rechner nach Abschluss der Installation neu, damit alle Änderungen wirksam werden.
  4. Überprüfe deine Node.js-Installation, indem du den folgenden Befehl ausführst:
node -v
Node.js v20 Installation verifizieren
Node.js v20 Installation

Wenn du die Versionsnummer (v20.0.0) siehst, bedeutet das, dass Node.js korrekt installiert ist und du mit Node.js v20 arbeiten kannst.

Was ist neu in Node.js v20?

Sehen wir uns die 5 wichtigsten Neuerungen an, die mit dieser Node.js-Version eingeführt wurden. Zu diesen Funktionen gehören:

Experimentelles Permission Model

Die Einführung des experimentellen Permission Model in Node.js v20 ist eine wichtige Neuerung, die Entwicklern mehr Kontrolle über den Zugriff auf bestimmte Ressourcen während der Ausführung gibt.

Diese neue Funktion ist von Vorteil, wenn Sicherheit und Ressourcennutzung kritisch sind, z. B. in einer Produktionsumgebung.

Das Permission Model bietet mehrere Möglichkeiten, darunter die Beschränkung des Zugriffs auf das Dateisystem, child_process, worker_threads und native Addons.

Entwickler können Flags wie --allow-fs-read, --allow-fs-write und --allow-child-process verwenden, um festzulegen, welche Ressourcen zugänglich sind. Um diese Flags zu aktivieren, müssen die Entwickler das Flag --experimental-permission in Kombination mit den erforderlichen Berechtigungen verwenden.

Hier ein Beispiel für die Verwendung des Berechtigungsmodells, um Lese- und Schreibzugriff auf das gesamte Dateisystem zu ermöglichen:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Entwickler können das Berechtigungsmodell auch verwenden, um den Zugriff auf bestimmte Ordner und Dateien festzulegen. Der folgende Befehl erlaubt zum Beispiel den Schreibzugriff auf den Ordner /tmp/:

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

Ein großer Vorteil des Berechtigungsmodells ist die Möglichkeit, den Zugriff auf das Dateisystem genauer zu steuern. Entwickler können zum Beispiel Pfade und Wildcard-Muster angeben, um den Zugriff auf bestimmte Ordner oder Dateien zu erlauben.

$ node --experimental-permission --allow-fs-read=/home/user/* index.js

Der obige Befehl gewährt Lesezugriff auf alle Ordner im Verzeichnis /home/user/.

Die Berechtigungseigenschaft des Prozessobjekts kann auch verwendet werden, um zu prüfen, ob eine bestimmte Berechtigung zur Laufzeit erteilt wurde. Wenn du zum Beispiel überprüfen willst, ob dein Node.js-Prozess Lesezugriff auf einen bestimmten Ordner, /home/user/documents, hat, kannst du den folgenden Code verwenden:

if (process.permission.has('fs.read', '/home/user/documents')) {
  console.log('Read access granted to /home/user/documents');
} else {
  console.log('Read access not granted to /home/user/documents');
}

Mit dem Permission Model kannst du den Zugriff deiner Node.js-Prozesse auf das Dateisystem genauer steuern, was zu einer besseren Sicherheit und einer effizienteren Ressourcennutzung führen kann.

Es ist wichtig zu beachten, dass das Permission Model noch experimentell ist und sich in zukünftigen Versionen von Node.js ändern kann. Es ist ratsam, sich über die Dokumentation des Permission Model auf dem Laufenden zu halten und bei der Nutzung dieser experimentellen Funktionen Vorsicht walten zu lassen.

Stabiler Test Runner

Node.js v20 enthält eine stabile Version des test_runner-Moduls, mit dem Entwickler schnell und einfach JavaScriptTestsuitenerstellen und ausführen können, ohne zusätzliche Abhängigkeiten zu installieren.

Der Stable Test Runner enthält jetzt mehrere Bausteine wie describe, it/test und Hooks für die Erstellung und Strukturierung von Testdateien sowie Mocking, Watch Mode und die Möglichkeit, mehrere Testdateien mit dem Befehl node --test parallel auszuführen.

Hier ist ein Beispiel für die Verwendung des Testrunners:

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';

mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

Der Test Runner bietet konfigurierbare und benutzerdefinierte Testreporter über das --test-reporter Flag, experimentelle Testabdeckung über das --experimental-test-coverage Flag und Mocking-Funktionen.

Der Stable Test Runner soll zwar keine vollwertigen Test-Frameworks wie Jest oder Mocha ersetzen, bietet aber eine einfache und schnelle Möglichkeit, Testsuiten zu erstellen. Er wurde seit seiner Einführung in Node.js v19 erheblich verbessert und dank der Tests und des Feedbacks der Endnutzer wurde er in Node.js v20 als stabil eingestuft.

Weitere Informationen findest du in diesem zusammengefassten Pull Request.

V8 JavaScript Engine auf 11.3 aktualisiert

Die V8 JavaScript Engine, die Node.js antreibt, wurde in Node.js v20 auf die Version 11.3 aktualisiert. Damit wurden die Leistung verbessert und neue Sprachfunktionen eingeführt. Einige der neuen Funktionen dieses Updates sind:

  • String.prototype.isWellFormed und toWellFormed: Diese Methoden sind besonders nützlich, um das richtige String-Format sicherzustellen. Sie stellen sicher, dass die String-Eingabe des Benutzers im korrekten UTF-16-Format erfolgt, wodurch Fehler im Zeitalter der Emojis reduziert werden.
  • Methoden, die Array und TypedArray durch Kopieren verändern: Dies kann nützlich sein, um geänderte Kopien von Arrays zu erstellen, ohne die Originaldaten zu verändern, was vor allem dann wichtig ist, wenn du die Originaldaten für Vergleiche oder andere Zwecke aufbewahren musst.
  • Resizable ArrayBuffer und growable SharedArrayBuffer: bietet mehr Flexibilität und ermöglicht eine effizientere Speicherzuweisung.
  • RegExp v Flag mit gesetzter Notation und Eigenschaften von Strings: erweitert die Funktionalität für reguläre Ausdrücke.
  • WebAssembly Tail Call: bietet eine Möglichkeit, bestimmte Arten von Funktionsaufrufen zu optimieren.

Diese Aktualisierungen zeigen das kontinuierliche Engagement der Node.js-Entwicklergemeinschaft zur Verbesserung von Leistung und Funktionalität.

Synchrones import.meta.resolve()

In Node.js v20 wurde import.meta.resolve() eingeführt, was es einfacher macht, Skripte zu schreiben, die nicht ortsabhängig sind. Diese Funktion kehrt synchron zurück, ähnlich dem Verhalten des Browsers, was eine effizientere Ausführung ermöglicht.

User Loader Resolve Hooks können weiterhin als asynchrone Funktion definiert werden, aber import.meta.resolve() kehrt auch dann synchron für den Anwendungscode zurück, wenn asynchrone Resolve Hooks geladen werden.

Das synchrone Verhalten von import.meta.resolve() ermöglicht eine effizientere Codeausführung, insbesondere beim Umgang mit großen Datenmengen. Als Autor kannst du Resolve Hooks entweder als asynchrone oder synchrone Funktionen definieren, je nachdem, was du bevorzugst. Der Anwendungscode wird unabhängig davon, ob asynchrone Auflösungshaken geladen sind, weiterhin synchron ausgeführt.

Experimental Single Executable Applications (SEA)

Experimental Single Executable Applications (SEA) ist eine neue Funktion in Node.js v20, die es ermöglicht, deine Anwendung mit der Node.js-Binärdatei zu bündeln, so dass Endnutzer sie als eine einzige ausführbare Datei verteilen und ausführen können.

Dies ist ein langjähriger Wunsch der Community, und das Team hat den Ansatz im letzten Jahr verfeinert.

In Node.js v20 muss für die Erstellung einer einzelnen ausführbaren App ein Blob injiziert werden, der von Node.js aus einer JSON-Konfiguration vorbereitet wird, anstatt die rohe JS-Datei zu injizieren.

Ein Blob ist eine Datei, die Binärdaten enthält, in diesem Fall von Node.js aufbereitet, und die in die Binärdatei injiziert wird. Diese Änderung wurde vorgenommen, um die Einbettung mehrerer nebeneinander bestehender Ressourcen in die SEA zu ermöglichen, was neue Anwendungsfälle eröffnet.

Hier ist ein Beispiel für eine sea-config.json-Datei:

{ 
      "main": "myscript.js", 
      "output": "sea-prep.blob" 
}

Wenn sie mit dem Befehl node --experimental-sea-config sea-config.json ausgeführt wird, wird der Blob in die Datei sea-prep.blob geschrieben, die dann in die Binärdatei injiziert werden kann.

Die SEA-Funktion ermöglicht es Entwicklern, Node.js-Anwendungen zu verteilen, ohne dass die Nutzer Node.js installieren müssen. Die Funktion wurde von Darshan Sen entwickelt, der im Rahmen der JavaScriptLandia Awards auf der OpenJS World den Preis für den herausragenden Beitrag eines Neuankömmlings erhielt.

Microsoft, ein Mitglied der OpenJS Foundation, untersucht diese Funktion als eine Möglichkeit, Vektorangriffe zu reduzieren und die Node.js-Architektur für ein besseres Erlebnis zu stärken. Obwohl das SEA-Feature noch experimentell ist, stellt es eine spannende neue Entwicklung für die Node.js-Community dar.

Leistung

Node.js v20 bringt erhebliche Verbesserungen der Runtime mit sich. Das neu gegründete Node.js Performance Team hat sich dabei besonders auf die Leistung konzentriert. Zu den Verbesserungen gehören Optimierungen in den Kernbereichen der Runtime, wie URL, fetch() und EventTarget.

Eine der bemerkenswerten Verbesserungen ist die Verringerung der Kosten für die Initialisierung von EventTarget, die um die Hälfte reduziert wurde, was zu einem schnelleren Zugriff auf alle Subsysteme führt, die sie nutzen. Außerdem wurden die V8 Fast API-Aufrufe genutzt, um die Leistung von APIs wie URL.canParse() und Timer zu verbessern.

Eine weitere spezifische Änderung ist die Einbeziehung der aktualisierten Version 2.0 von Ada, einem schnellen und spezifizierungskonformen URL-Parser, der in C++ geschrieben wurde.

Zusammenfassung

In diesem Artikel hast du einige der wichtigsten Funktionen (experimentell und stabil) und Verbesserungen kennengelernt, die Node.js v20 mit sich bringt, z. B. Verbesserungen an der V8-JavaScript-Engine, der Leistung, dem Test-Runner und der Einführung des experimentellen Berechtigungsmodells sowie der Einzelausführungsanwendungen.

Es ist wichtig zu wissen, dass Node.js v14 im April 2023 ausläuft. Daher ist es ratsam, ein Upgrade auf Node.js v18 (LTS) oder vNode.js 20 (bald LTS) zu planen.

Willst du die neueste Version von Node.js ausprobieren? Das kannst du tun, indem du deine Node.js-Anwendung auf Kinsta bereitstellst und deine ersten 20 Dollar bei uns bekommst. Wir unterstützen Node.js v20 bereits, d.h. du kannst die neuen Funktionen und Möglichkeiten ab heute testen.

Jetzt bist du dran! Welche Funktionen oder Verbesserungen findest du in Node.js v20 am interessantesten? Gibt es wichtige Neuerungen, die wir vielleicht übersehen haben? Lass es uns in den Kommentaren wissen.

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.