Node.js v20 is nu beschikbaar! Op 18 april 2023 werd de versie openbaar gemaakt en kan nu door iedereen gebruikt worden. Met deze release zou Node.js veel veiliger moeten zijn en beter moeten presteren.

Het is belangrijk om te weten – omdat dit een even genummerde release is, wordt het een LTS versie (long-term support) in oktober 2023 en wordt hij ondersteund tot april 2026. Het Node.js team is echter actief op zoek naar feedback van de gemeenschap om eventuele problemen te identificeren en op te lossen voordat het gepromoveerd wordt tot LTS.

Deze nieuwe release van Node.js brengt spannende updates en mogelijkheden die developers zeker zullen waarderen, zoals het experimentele Permission Model, synchroon import.meta.resolve, een stabiele Test Runner, updates van de V8 JavaScript engine naar versie 11.3, die prestatieverbeteringen en bugfixes met zich meebrengt, en nog veel meer.

In dit artikel verken je de veranderingen in Node.js v20, met een uitgebreide bespreking van de nieuwe features en mogelijkheden.

Aan de slag met Node.js v20

Het installeren van Node.js v20 is vergelijkbaar met andere versies van Node.js. Alles wat je moet doen is:

  1. Download het installatiepakket van de officiële Node.js website.
  2. Als je het installatieprogramma hebt gedownload, voer het dan uit en volg de instructies om het installatieproces te voltooien. Dit proces is vrij eenvoudig, en je hoeft alleen maar akkoord te gaan met de licentieovereenkomst en op de “Next” knop te klikken.
  3. Herstart je systeem/machine nadat het installatieproces is voltooid om ervoor te zorgen dat alle veranderingen van kracht worden.
  4. Check je Node.js installatie door het volgende commando uit te voeren:
node -v
Node.js v20 installatie verifiëren
Node.js v20 installatie

Als je het versienummer ziet (v20.0.0), betekent dit dat Node.js correct is geïnstalleerd, en dat je klaar bent om met Node.js v20 te gaan werken.

Wat is er nieuw in Node.js v20?

Laten we de 5 belangrijkste updates verkennen die met deze Node.js release zijn geïntroduceerd. Deze features zijn:

Experimenteel Permission Model

De introductie van het experimentele Permission Model in Node.js v20 is een belangrijke toevoeging die developers meer controle geeft over de toegang tot specifieke resources tijdens de uitvoering.

Deze nieuwe eigenschap is gunstig wanneer beveiliging en gebruik van resources belangrijk zijn, zoals in een productieomgeving.

Het Permission Model maakt nieuwe mogelijkheden mogelijk, waaronder het beperken van de toegang tot het bestandssysteem, child_process, worker_threads en native addons.

Developers kunnen flags als --allow-fs-read, --allow-fs-write, en --allow-child-process gebruiken om aan te geven welke resources toegankelijk zijn. Om deze flags te activeren moeten developers de flag --experimental-permission gebruiken in combinatie met de vereiste toestemmingen.

Hier volgt een voorbeeld van het gebruik van het Permission Model om lees- en schrijftoegang tot het hele bestandssysteem toe te staan:

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

Developers kunnen het Permission Model ook gebruiken om toegang tot specifieke mappen en bestanden te specificeren. Het volgende commando geeft bijvoorbeeld schrijftoegang tot de map /tmp/:

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

Een belangrijk voordeel van het Permission Model is de mogelijkheid om uitgebreidere controle uit te oefenen over de toegang tot het bestandssysteem. Developers kunnen bijvoorbeeld paden en wildcard patterns opgeven om toegang te verlenen tot specifieke mappen of bestanden.

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

Het bovenstaande commando verleent leestoegang tot alle mappen in de map /home/user/.

De permissie-eigenschap van het proces object kan ook worden gebruikt om tijdens runtime te controleren of een specifieke permissie is verleend. Als je bijvoorbeeld wilt controleren of je Node.js proces leestoegang heeft tot een specifieke map, /home/user/documents, kun je de volgende code gebruiken:

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');
}

Door het Permission Model te gebruiken, heb je betere controle over de toegang tot het bestandssysteem van je Node.js processen, wat kan leiden tot betere beveiliging en efficiënter gebruik van resources.

Het is belangrijk op te merken dat het Permission Model nog experimenteel is en in toekomstige versies van Node.js kan veranderen. Het is raadzaam om op de hoogte te blijven van de documentatie van het Permission Model en voorzichtig te zijn met het gebruik van deze experimentele mogelijkheden.

Stabiele Test Runner

Node.js v20 bevat een stabiele versie van de test_runner module waarmee developers snel en eenvoudig JavaScript testsuites kunnen bouwen en uitvoeren zonder extra dependencies te installeren.

De stabiele Test Runner bevat nu verschillende bouwstenen, zoals describe, it/test, en hooks, voor het schrijven en structureren van testbestanden, samen met mocking, watch mode, en de mogelijkheid om meerdere testbestanden parallel uit te voeren met het commando node --test.

Hier volgt een voorbeeld van het gebruik van de Test Runner:

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");
});

De Test Runner biedt configureerbare en aangepaste test reporters via de --test-reporter flag, experimentele test-coverage via de --experimental-test-coverage flag en mockingmogelijkheden.

Hoewel het niet de bedoeling is om volledige testframeworks zoals Jest of Mocha te vervangen, biedt de stabiele Test Runner een eenvoudige en snelle manier om testsuites te maken. Hij is aanzienlijk verbeterd sinds zijn introductie in Node.js v19, en dankzij testen en feedback van eindgebruikers is hij nu als stabiel gemarkeerd in Node.js v20.

Meer informatie is te vinden in dit samengevoegde pull request.

V8 JavaScript engine bijgewerkt naar 11.3

De V8 JavaScript engine, die Node.js aandrijft, is bijgewerkt naar versie 11.3 in Node.js v20. Dit brengt verbeterde prestaties en introduceert nieuwe taalfeatures. Enkele van de nieuwe mogelijkheden van deze update zijn:

  • String.prototype.isWellFormed en toWellFormed: Deze methoden zijn vooral nuttig voor het waarborgen van een juiste stringopmaak. Dit helpt ervoor te zorgen dat de string-invoer van gebruikers in de juiste UTF-16 indeling is, waardoor fouten in het tijdperk van emoji’s worden verminderd.
  • Methoden die Array en TypedArray per kopie wijzigen: Dit kan handig zijn voor het maken van gewijzigde kopieën van arrays zonder de oorspronkelijke gegevens aan te tasten, wat vooral relevant is in gevallen waarin je de oorspronkelijke gegevens moet bewaren voor vergelijking of andere doeleinden.
  • Resizable ArrayBuffer en growable SharedArrayBuffer: biedt meer flexibiliteit, waardoor efficiënter geheugen kan worden toegewezen.
  • RegExp v flag met set-notatie en property’s van strings: voegt functionaliteit toe voor reguliere expressies.
  • WebAssembly tail call: biedt een manier om bepaalde typen functie calls te optimaliseren.

Deze updates tonen de voortdurende drive van de Node.js ontwikkelingsgemeenschap voor het verbeteren van prestaties en functionaliteit.

Synchrone import.meta.resolve()

In Node.js v20 is import.meta.resolve() geïntroduceerd, wat het gemakkelijker maakt om scripts te schrijven die niet locatiegevoelig zijn. Deze functie retourneert synchroon, vergelijkbaar met het gedrag van de browser, waardoor een efficiëntere uitvoering mogelijk is.

User loader resolve hooks kunnen nog steeds worden gedefinieerd als een async functie, maar import.meta.resolve() zal nog steeds synchroon geretourneerd worden voor de applicatiecode, zelfs als async resolve hooks worden geladen.

Het synchrone gedrag van import.meta.resolve() maakt een efficiëntere uitvoering van code mogelijk, vooral bij grote hoeveelheden gegevens. Als auteur kun je resolve hooks definiëren als async of sync functies, afhankelijk van je voorkeur. De applicatiecode zal nog steeds synchroon worden uitgevoerd, ongeacht of er async resolve hooks zijn geladen.

Experimentele Single Executable Applications (SEA)

Experimental Single Executable Applications (SEA) is een nieuwe feature die in Node.js v20 is geïntroduceerd en waarmee je je applicatie kunt bundelen met de Node.js binary, zodat eindgebruikers deze kunnen distribueren en uitvoeren als een enkel uitvoerbaar bestand.

Dit is al lange tijd een verzoek van de gemeenschap, en het team heeft de aanpak het afgelopen jaar verfijnd.

In Node.js v20 vereist het bouwen van een enkele uitvoerbare app het injecteren van een blob die door Node.js is voorbereid vanuit een JSON configuratie, in plaats van het injecteren van het raw JS bestand.

Een blob is een bestand dat binaire gegevens bevat, in dit geval voorbereid door Node.js, en het wordt geïnjecteerd in de binary. Deze verandering werd aangebracht om het mogelijk te maken meerdere naast elkaar bestaande resources in de SEA in te sluiten, wat nieuwe gebruiksmogelijkheden biedt.

Hier is een voorbeeld van een sea-config.json bestand:

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

Bij uitvoering met het commando node --experimental-sea-config sea-config.json wordt de blob weggeschreven naar het sea-prep.blob bestand, dat dan in de binary kan worden geïnjecteerd.

Met de SEA functie kunnen developers Node.js applicaties  distribueren zonder dat gebruikers Node.js hoeven te installeren. De functionaliteit is gemaakt door Darshan Sen, die de Outstanding Contribution from a New Arrival prijs won als onderdeel van de JavaScriptLandia Awards tijdens OpenJS World.

Microsoft, een lid van de OpenJS Foundation, onderzoekt deze functie als een manier om vectoraanvallen te verminderen en de Node.js architectuur te versterken voor een betere ervaring. Hoewel de SEA-functie nog experimenteel is, betekent het een opwindende nieuwe ontwikkeling voor de Node.js gemeenschap.

Prestaties

Node.js v20 komt met aanzienlijke verbeteringen aan de runtime, met een hernieuwde focus op prestaties door het nieuw gevormde Node.js performance team. De verbeteringen omvatten optimalisaties van de kernonderdelen van de runtime, zoals URL, fetch(), en EventTarget.

Een van de opmerkelijke verbeteringen is de vermindering van de kosten voor het initialiseren van EventTarget, die met de helft is teruggebracht, wat resulteert in snellere toegang tot alle subsystemen die er gebruik van maken. Bovendien zijn V8 Fast API calls gebruikt om de prestaties te verbeteren in API’s als URL.canParse() en timers.

Een andere specifieke verandering is de opname van de bijgewerkte versie 2.0 van Ada, een snelle en spec-compliant URL parser geschreven in C++.

Samenvatting

In dit artikel heb je enkele van de belangrijkste features (experimenteel en stabiel) en verbeteringen geleerd die Node.js v20 brengt, zoals verbeteringen aan de V8 JavaScript engine, prestaties, Test Runner en introductie van een experimenteel Permission Model, en Single Executable Applications.

Het is belangrijk om te weten dat Node.js v14 in april 2023 End-of-Life gaat, dus het is raadzaam om te beginnen met het plannen van een upgrade naar Node.js v18 (LTS) of vNode.js 20 (binnenkort LTS).

Wil je de nieuwste versie van Node.js eens proberen? Dat kun je doen door je Node.js applicatie op Kinsta te deployen  – en wij betalen de eerste $20 uit onze eigen zak. We ondersteunen Node.js v20 al, wat betekent dat je de nieuwe features en mogelijkheden ervan vanaf vandaag kunt testen.

Nu is het jouw beurt! Welke features of verbeteringen vind jij het meest interessant in Node.js v20? Zijn er belangrijke die we misschien over het hoofd hebben gezien? Laat het ons weten in de comments.

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.