Node.js v20 är nu tillgänglig! Den 18 april 2023 blev den offentlig och kan nu användas av alla. Med den här versionen bör Node.js vara mycket säkrare och prestera ännu bättre.

Detta är viktigt att veta – eftersom det är en jämn-numrerad version kommer den att bli en LTS-version (Long Term Support) i oktober 2023. Den kommer sedan att stödjas fram till april 2026. Node.js-teamet söker dock aktivt efter feedback från sitt community för att identifiera och åtgärda eventuella problem innan den befordras till LTS.

Den nya versionen av Node.js inkluderar spännande uppdateringar och funktioner som utvecklare säkert kommer att uppskatta. Vi kan exempelvis nämna den experimentella permissions-modellen, synkrona import.meta.resolve, en stabil testkörare, uppdateringar av V8 JavaScript-motorn till version 11.3. Som ett resultat av allt detta blir det prestandaförbättringar, buggfixar, och mycket mer.

I den här artikeln kommer vi att utforska de förändringar som införs i Node.js v20 och ge dig en djupgående titt på dess nya funktioner och möjligheter.

Komma igång med Node.js v20

Att installera Node.js v20 är ganska likt andra versioner av Node.js. Allt som du behöver göra är:

  1. Hämta installationspaketet från den officiella webbplatsen för Node.js.
  2. När du har laddat ner installationsprogrammet kör du det och följer instruktionerna för att slutföra installationen. Processen är ganska okomplicerad och du behöver sedan bara godkänna licensavtalet och klicka på knappen ”Next”.
  3. Starta om systemet/maskinen efter att installationsprocessen är klar för att säkerställa att alla ändringar träder i kraft.
  4. Verifiera därefter din Node.js-installation genom att köra följande kommando:
node -v
Node.js v20-installation
Node.js v20-installation

Om du ser versionsnumret (v20.0.0) betyder detta att Node.js är korrekt installerat och att du är redo att börja arbeta med Node.js v20.

Vad är nytt i Node.js v20?

Låt oss utforska de 5 större uppdateringarna som infördes med den här Node.js-utgåvan. Dessa funktioner inkluderar exempelvis:

Experimentell tillståndsmodell

Införandet av den experimentella tillståndsmodellen i Node.js v20 är ett viktigt tillägg som ger utvecklare mer kontroll över åtkomsten till specifika resurser under exekvering.

Den här nya funktionen är fördelaktig när säkerhet och resursanvändning är kritiska, exempelvis i en produktionsmiljö.

Behörighetsmodellen har flera möjligheter, bland annat att begränsa åtkomsten till filsystemet, child_process, worker_threads och inhemska tillägg.

Utvecklare kan använda flaggor som --allow-fs-read, --allow-fs-write och --allow-child-process för att ange vilka resurser som är tillgängliga. För att aktivera dessa flaggor måste utvecklare använda flaggan --experimental-permission i kombination med de nödvändiga behörigheterna.

Här är ett exempel på hur man använder behörighetsmodellen för att tillåta läs- och skrivåtkomst till hela filsystemet:

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

Utvecklare kan dessutom använda behörighetsmodellen för att ange åtkomst till specifika mappar och filer. Följande kommando tillåter exempelvis skrivåtkomst till mappen /tmp/:

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

En viktig fördel med behörighetsmodellen är möjligheten att utöva en mer detaljerad kontroll över filsystemets åtkomst. Utvecklare kan exempelvis ange sökvägar och wildcard-mönster för att tillåta åtkomst till specifika mappar eller filer.

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

Ovanstående kommando ger läsbehörighet till alla mappar i katalogen /home/user/.

Processobjektets behörighetsegenskap kan dessutom användas för att kontrollera om en viss behörighet har beviljats vid körning. Om du exempelvis vill kontrollera om din Node.js-process har läsbehörighet till en viss mapp, /home/user/documents, kan du använda följande kod:

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

Genom att använda Behörighetsmodellen har du en mer detaljerad kontroll över dina Node.js-processers åtkomst till filsystemet. Som ett resultat så får du en bättre säkerhet och en effektivare resursanvändning.

Det är viktigt att notera att Behörighetsmodellen fortfarande är experimentell och kan komma att ändras i framtida versioner av Node.js. Det är tillrådligt att hålla sig uppdaterad med dokumentationen om Behörighetsmodellen och att vara försiktig när du använder dessa experimentella funktioner.

Stabil testkörare

Node.js v20 innehåller en stabil version av modulen test_runner som gör det möjligt för utvecklare att snabbt och enkelt bygga och köra JavaScript-testsatser utan att installera ytterligare beroenden.

Den stabila testköraren innehåller nu flera byggblock, som describe, it/test, och krokar, för att skapa och strukturera testfiler. Det inkluderas dessutom mocking, visningsläge och möjligheten att köra flera testfiler parallellt med hjälp av kommandot node --test.

Här är ett exempel på hur testköraren kan användas:

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öraren erbjuder konfigurerbara och anpassade testrapportörer via flaggan --test-reporter, experimentell testtäckning via flaggan --experimental-test-coverage och mocking-funktioner.

Den stabila testköraren är visserligen inte avsedd att ersätta fullfjädrade testramverk som Jest eller Mocha. Den erbjuder dock ett enkelt och snabbt sätt att skapa testsviter. Det har dessutom skett många förbättringar sedan den introducerades i Node.js v19. Tack vare testning och feedback från slutanvändare har den nu markerats som stabil i Node.js v20.

Mer information finns i den här sammanslagna pull request.

V8 JavaScript Motor uppdaterad till 11.3

V8 JavaScript-motorn, som driver Node.js, har uppdaterats till version 11.3 i Node.js v20. Som ett resultat så blir det en förbättrad prestanda och introducering av nya språkfunktioner. Några av de nya funktionerna i denna uppdatering är följande:

  • String.prototype.isWellFormed och toWellFormed: Dessa metoder är särskilt användbara för att säkerställa korrekt strängformat. Detta hjälper exempelvis till att säkerställa att användarens stränginmatning är i rätt UTF-16-format, vilket minskar fel i emojis-åldern.
  • Metoder som ändrar Array och TypedArray genom kopiering: Detta kan vara användbart för att skapa modifierade kopior av matriser utan att påverka originaldata, vilket är särskilt relevant i fall där du behöver bevara originaldata för jämförelser eller andra ändamål.
  • ArrayBuffer som kan ändra storlek ochSharedArrayBuffer som kan växa: ger större flexibilitet och möjliggör effektivare minnes-allokering.
  • RegExp v-flagga med uppsättnings-notation och egenskaper hos strängar: lägger till funktionalitet för reguljära uttryck.
  • WebAssembly tail call: ger ett sätt att optimera vissa typer av funktionsanrop.

Dessa uppdateringar visar på Node.js utvecklings-community´s ständiga engagemang för att förbättra prestanda och funktionalitet.

Synkron import.meta.resolve()

I Node.js v20 har import.meta.resolve() införts. Som ett resultat blir det lättare att skriva skript som inte är platskänsliga. Den här funktionen returnerar synkront, i likhet med webbläsarens beteende, vilket möjliggör effektivare utförande.

User loader resolve hooks kan fortfarande definieras som en asynkron funktion, men import.meta.resolve() återkommer fortfarande synkront för programkoden även om asynkrona resolve hooks laddas.

Det synkrona beteendet hos import.meta.resolve() gör det exempelvis möjligt att utföra koden mer effektivt. Detta gäller särskilt för stora mängder data. Som författare kan du definiera resolve hooks som antingen asynkrona eller synkrona funktioner, beroende på vad du föredrar. Applikations.koden kommer fortfarande att exekveras synkront oavsett om det finns asynkrona resolve hooks inlästa eller inte.

Experimentella tillämpningar med en enda exekverbar applikation (SEA)

Experimental Single Executable Applications (SEA) är en ny funktion som infördes i Node.js v20 och som gör det möjligt att paketera ditt applikation med Node.js binärfil. Som ett resultat kan slutanvändarna distribuera och köra det som en enda körbar fil.

Detta har länge varit en önskan från dess community, och teamet har förfinat tillvägagångssättet under det senaste året.

I Node.js v20 kräver byggandet av en enda körbar app att man injicerar en blob som förbereds av Node.js från en JSON-konfiguration i stället för att injicera den råa JS-filen.

En blob är en fil som innehåller binära data, i det här fallet förberedd av Node.js. Den injiceras sedan i den binära filen. Den här ändringen gjordes för att göra det möjligt att bädda in flera samexisterande resurser i SEA. Som ett resultat öppnas det upp nya användningsområden.

Här är ett exempel på en sea-config.json-fil:

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

När den exekveras med kommandot node --experimental-sea-config sea-config.json skrivs blob-filen till filen sea-prep.blob, som sedan kan injiceras i den binära filen.

SEA-funktionen gör det sedan möjligt för utvecklare att distribuera Node.js-applikationer utan att användarna behöver installera Node.js. Funktionen skapades av Darshan Sen, som vann utmärkelsen Outstanding Contribution from a New Arrival award som en del av JavaScriptLandia Awards vid OpenJS World.

Microsoft, som är medlem i OpenJS Foundation, undersöker den här funktionen som ett sätt att minska vektorattacker och stärka Node.js-arkitekturen för en bättre upplevelse. SEA-funktionen är fortfarande experimentell, men den utgör en spännande ny utveckling för Node.js-communityt.

Prestanda

Node.js v20 inkluderar betydande förbättringar av sin körtid, med förnyat fokus på prestanda av det nybildade prestandateamet hos Node.js. Förbättringarna omfattar optimeringar av de centrala delarna av körtiden, t.ex. webbadress, fetch() och EventTarget.

En av de anmärkningsvärda förbättringarna är minskningen av kostnaden för att initiera EventTarget, som har halverats. Detta har lett till snabbare åtkomst till alla delsystem som använder den. Dessutom har V8 Fast API-anrop använts för att förbättra prestandan i API: er som URL.canParse() och timers.

En annan specifik förändring är införandet av den uppdaterade versionen 2.0 av Ada, en snabb och spec-kompatibel webbadress-tolkare som är skriven i C++.

Sammanfattning

I den här artikeln har du lärt dig några av de viktigaste funktionerna (experimentella och stabila) och förbättringarna som Node.js v20 medför. Det handlar exempelvis om förbättringar av V8 JavaScript-motorn, prestanda, testkörare och införandet av experimentell tillståndsmodell och applikationer för enstaka exekvering.

Det är viktigt att veta att Node.js v14 kommer att utgå i april år 2023. Det rekommenderas därför att man börjar planera för att uppgradera till Node.js v18 (LTS) eller vNode.js 20 (snart LTS).

Vill du prova den senaste versionen av Node.js? Du kan göra detta genom att distribuera din Node.js-applikation på Kinsta, vi står för dina första 20 dollar. Vi har redan stöd för Node.js v20, vilket innebär att du kan testa dess nya funktioner och möjligheter från och med idag.

Nu är det din tur! Vilka funktioner eller förbättringar tycker du är mest intressanta i Node.js v20? Finns det några viktiga nyheter som vi kanske har förbisett? Låt oss veta detta i kommentarerna.

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.