Node.js v20 er nu tilgængelig! Den 18. april 2023 blev den gjort offentlig og kan nu bruges af alle. Med denne version skulle Node.js være meget mere sikker og yde bedre.

Det er vigtigt at vide – da dette er en udgivelse med et lige nummer, er det planlagt at blive en LTS-version (Long Term Support) i oktober 2023 og vil blive understøttet indtil april 2026. Node.js-holdet søger dog aktivt efter feedback fra fællesskabet for at identificere og rette eventuelle problemer, inden den bliver forfremmet til LTS.

Denne nye version af Node.js indeholder spændende opdateringer og funktioner, som udviklere helt sikkert vil sætte pris på, f.eks. den eksperimentelle Permission Model, synkron import.meta.resolve, en stabil test runner, opdateringer af V8 JavaScript-motoren til version 11.3, hvilket giver forbedringer af ydeevnen og fejlrettelser og meget mere.

I denne artikel vil du udforske de ændringer, der er indført i Node.js v20, og du vil få et dybdegående kig på de nye funktioner og muligheder.

Kom godt i gang med Node.js v20

Installationen af Node.js v20 ligner meget de andre versioner af Node.js. Det eneste, du skal gøre, er at:

  1. Hente installationspakken fra det officielle Node.js-websted.
  2. Når du har hentet installationsprogrammet, skal du køre det og følge instruktionerne for at fuldføre installationsprocessen. Denne proces er ret ligetil, og du skal blot acceptere licensaftalen og klikke på “Next”-knappen.
  3. Genstart dit system/din maskine, når installationsprocessen er afsluttet, for at sikre, at alle ændringer træder i kraft.
  4. Kontroller din Node.js installation ved at køre følgende kommando:
node -v
Node.js v20 Installation
Node.js v20 Installation

Hvis du ser versionsnummeret (v20.0.0.0), betyder det, at Node.js er installeret korrekt, og at du er klar til at begynde at arbejde med Node.js v20.

Hvad er nyt i Node.js v20?

Lad os undersøge de 5 større opdateringer, der er indført med denne Node.js-udgave. Disse funktioner omfatter:

Eksperimentel tilladelsesmodel

Indførelsen af den eksperimentelle tilladelsesmodel i Node.js v20 er en vigtig tilføjelse, der giver udviklere mere kontrol over adgangen til specifikke ressourcer under udførelsen.

Denne nye funktion er fordelagtig, når sikkerhed og ressourceforbrug er kritiske, f.eks. i et produktionsmiljø.

Tilladelsesmodellen kommer med flere muligheder, herunder begrænsning af adgangen til filsystemet, child_process, worker_threads og native addons.

Udviklere kan bruge flag som --allow-fs-read, --allow-fs-write og --allow-child-process til at angive, hvilke ressourcer der er tilgængelige. For at aktivere disse flag skal udviklere bruge flaget --experimental-permission i kombination med de nødvendige tilladelser.

Her er et eksempel på, hvordan man bruger tilladelsesmodellen til at give læse- og skriveadgang til hele filsystemet:

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

Udviklere kan også bruge tilladelsesmodellen til at angive adgang til bestemte mapper og filer. Følgende kommando giver f.eks. skriveadgang til mappen /tmp/:

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

En væsentlig fordel ved tilladelsesmodellen er muligheden for at udøve mere detaljeret kontrol over adgangen til filsystemet. Udviklere kan f.eks. angive stier og wildcard-mønstre for at tillade adgang til bestemte mapper eller filer.

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

Ovenstående kommando giver læseadgang til alle mapper i mappen /home/user/.

Procesobjektets permission-egenskab kan også bruges til at kontrollere, om der er givet en bestemt tilladelse på køretid. Hvis du f.eks. ønsker at kontrollere, om din Node.js-proces har læseadgang til en bestemt mappe, /home/user/documents, kan du bruge følgende kode:

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

Ved at bruge tilladelsesmodellen har du en mere finkornet kontrol over dine Node.js-processers adgang til filsystemet, hvilket kan føre til bedre sikkerhed og mere effektiv ressourceudnyttelse.

Det er vigtigt at bemærke, at Permission Model stadig er eksperimentel og kan ændre sig i fremtidige udgaver af Node.js. Det er tilrådeligt at holde sig opdateret med Permission Model-dokumentationen og udvise forsigtighed, når du bruger disse eksperimentelle funktioner.

Stabil testkører

Node.js v20 indeholder en stabil version af test_runner-modulet, som gør det muligt for udviklere at opbygge og køre JavaScript-testsuiter hurtigt og nemt uden at installere yderligere afhængigheder.

Den stabile test runner indeholder nu flere byggeblokke, såsom describe, it/test, og hooks, til udarbejdelse og strukturering af testfiler, sammen med mocking, watch mode og muligheden for at køre flere testfiler parallelt ved hjælp af kommandoen node --test.

Her er et eksempel på, hvordan man bruger testkøreren:

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

Testkøreren tilbyder konfigurerbare og brugerdefinerede testrapportere via --test-reporter -flaget, eksperimentel testdækning via --experimental-test-coverage -flaget og mocking-muligheder.

Selvom det ikke er meningen at erstatte fuldt udbyggede testframeworks som Jest eller Mocha, tilbyder den stabile test runner en enkel og hurtig måde at oprette testsuiter på. Den er blevet forbedret betydeligt siden introduktionen i Node.js v19, og takket være slutbrugernes test og feedback er den nu blevet markeret som stabil i Node.js v20.

Du kan finde flere oplysninger i denne sammenlagte pull request.

V8 JavaScript Engine opdateret til 11.3

V8 JavaScript-motoren, som driver Node.js, er blevet opdateret til version 11.3 i Node.js v20. Dette giver forbedret ydeevne og introducerer nye sprogfunktioner. Nogle af de nye funktioner i denne opdatering omfatter:

  • String.prototype.isWellFormed og toWellFormed: Disse metoder er særligt nyttige til at sikre korrekt strengformat. Dette er med til at sikre, at brugerens strengindtastning er i det korrekte UTF-16-format, hvilket reducerer fejl i emojis-alderen.
  • Metoder, der ændrer Array og TypedArray ved kopiering: Dette kan være nyttigt til at oprette ændrede kopier af arrays uden at påvirke de oprindelige data, hvilket især er relevant i tilfælde, hvor du har brug for at bevare de oprindelige data til sammenligning eller andre formål.
  • Resizable ArrayBuffer og growable SharedArrayBuffer: giver større fleksibilitet, hvilket giver mulighed for mere effektiv hukommelsesallokering.
  • RegExp v-flag med sætnotation og egenskaber for strenge: tilføjer funktionalitet for regulære udtryk.
  • WebAssembly tail call: giver mulighed for at optimere visse typer af funktionskald.

Disse opdateringer viser Node.js-udviklingsfællesskabets løbende engagement i at forbedre ydeevne og funktionalitet.

Synkron import.meta.resolve()

I Node.js v20 er import.meta.resolve() blevet indført, hvilket gør det lettere at skrive scripts, der ikke er stedfølsomme. Denne funktion returnerer synkront, svarende til browserens adfærd, hvilket giver mulighed for mere effektiv udførelse.

User loader resolve hooks kan stadig defineres som en asynkron funktion, men import.meta.resolve() vil stadig returnere synkront for applikationskoden, selv om asynkrone resolve hooks er indlæst.

Den synkrone adfærd i import.meta.resolve() giver mulighed for en mere effektiv udførelse af kode, især når der er tale om store datamængder. Som forfatter kan du definere resolve hooks som enten asynkrone eller synkrone funktioner, alt efter hvad du foretrækker. Programkoden vil stadig blive udført synkront, uanset om der er indlæst asynkrone resolve hooks.

Eksperimentelle enkelt eksekverbare applikationer (SEA)

Eksperimentelle enkelt eksekverbare applikationer (SEA) er en ny funktion, der blev indført i Node.js v20, som gør det muligt at bundle din applikation med Node.js-binærfilen, så slutbrugerne kan distribuere og køre den som en enkelt eksekverbar fil.

Dette har længe været et ønske fra fællesskabet, og teamet har finpudset tilgangen i løbet af det seneste år.

I Node.js v20 kræver opbygning af en enkelt eksekverbar app, at der injiceres en blob, som Node.js har forberedt fra en JSON-konfiguration, i stedet for at injicere den rå JS-fil.

En blob er en fil, der indeholder binære data, i dette tilfælde forberedt af Node.js, og den injiceres i den binære fil. Denne ændring blev foretaget for at muliggøre indlejring af flere sameksisterende ressourcer i SEA, hvilket åbner op for nye anvendelsesmuligheder.

Her er et eksempel på en sea-config.json-fil:

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

Når den udføres med kommandoen node --experimental-sea-config sea-config.json, skrives blob’en til filen sea-prep.blob, som derefter kan injiceres i den binære fil.

SEA-funktionen gør det muligt for udviklere at distribuere Node.js-applikationer uden at brugerne behøver at installere Node.js. Funktionen blev skabt af Darshan Sen, som vandt prisen Outstanding Contribution from a New Arrival Award som en del af JavaScriptLandia Awards ved OpenJS World.

Microsoft, der er medlem af OpenJS Foundation, undersøger denne funktion som en måde at reducere vektorangreb på og styrke Node.js-arkitekturen for at give en bedre oplevelse. Selv om SEA-funktionen stadig er eksperimentel, er den en spændende ny udvikling for Node.js-fællesskabet.

Ydeevne

Node.js v20 kommer med betydelige forbedringer af kørselstiden med fornyet fokus på ydeevne fra det nyoprettede Node.js performance team. Forbedringerne omfatter optimeringer af de centrale dele af køretiden, f.eks. URL, fetch() og EventTarget.

En af de bemærkelsesværdige forbedringer er reduktionen af omkostningerne ved initialisering af EventTarget, som er blevet halveret, hvilket har resulteret i hurtigere adgang til alle undersystemer, der bruger det. Desuden er V8 Fast API-kald blevet anvendt til at forbedre ydeevnen i API’er som URL.canParse() og timere.

En anden specifik ændring er medtagelsen af den opdaterede version 2.0 af Ada, en hurtig og specifikationskompatibel URL-parser skrevet i C++.

Opsummering

I denne artikel har du lært nogle af de vigtigste funktioner (eksperimentelle og stabile) og forbedringer, som Node.js v20 bringer, såsom forbedringer af V8 JavaScript-motoren, ydeevne, testløber og introduktion af eksperimentel tilladelsesmodel og enkeltudførelsesapplikationer.

Det er vigtigt at vide, at Node.js v14 går End-of-Life i april 2023, så det anbefales at begynde at planlægge en opgradering til Node.js v18 (LTS) eller vNode.js 20 (snart LTS).

Har du lyst til at give den nyeste version af Node.js en tur? Det kan du gøre ved at implementere din Node.js applikation på Kinsta og få dine første 20 dollars hos os. Vi understøtter allerede Node.js v20, hvilket betyder, at du kan teste de nye funktioner og muligheder fra i dag.

Nu er det din tur! Hvilke funktioner eller forbedringer finder du mest interessante i Node.js v20? Er der nogle væsentlige, som vi måske har overset? Lad os vide det i kommentarerne.

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.