Node.js v20 è finalmente disponibile! Il 18 aprile 2023 è stato reso pubblico e ora può essere usato da chiunque. Con questa versione, Node.js dovrebbe essere molto più sicuro e performante.

È importante sapere che, trattandosi di una versione pari, è destinata a diventare una versione di supporto a lungo termine (LTS) a ottobre 2023 e sarà supportata fino ad aprile 2026. Tuttavia, il team di Node.js sta richiedendo il feedback della comunità per identificare e risolvere eventuali problemi prima che venga promossa a versione LTS.

Questa nuova versione di Node.js porta con sé interessanti aggiornamenti e funzionalità che chi lavora nello sviluppo apprezzerà sicuramente, come il modello di autorizzazione sperimentale, import.meta.resolve sincrono, un test runner stabile, l’aggiornamento del motore JavaScript V8 alla versione 11.3, con miglioramenti delle prestazioni e correzioni di bug, e molto altro ancora.

In questo articolo esploreremo i cambiamenti introdotti in Node.js v20, dando uno sguardo approfondito alle sue nuove caratteristiche e funzionalità.

Come Iniziare a Usare Node.js v20

L’installazione di Node.js v20 è abbastanza simile a quella delle altre versioni di Node.js. Tutto ciò che dovete fare è:

    1. Scaricare il pacchetto di installazione dal sito ufficiale di Node.js.
  1. Una volta scaricato il programma di installazione, eseguitelo e seguite le istruzioni per completare il processo di installazione. Il processo è piuttosto semplice e dovete solo accettare il contratto di licenza e fare clic sul pulsante “Avanti”.
  2. Riavviate il vostro sistema/macchina al termine del processo di installazione per assicurarvi che tutte le modifiche abbiano effetto.
  3. Verificate l’installazione di Node.js con il seguente comando:
node -v
Schermata dell’editor con i comandi di verifica dell’installazione di Node.js v20
Installazione di Node.js v20

Se vedete il numero di versione (v20.0.0), significa che Node.js è stato installato correttamente e che tutto è pronto per iniziare a lavorare con Node.js v20.

Cosa c’è di Nuovo in Node.js v20?

Vediamo i 5 principali aggiornamenti introdotti con questa versione di Node.js. Queste caratteristiche includono:

Modello di Autorizzazione Sperimentale

L’introduzione del Modello di Autorizzazione sperimentale in Node.js v20 è un’aggiunta significativa che offre un maggiore controllo sull’accesso a risorse specifiche durante l’esecuzione.

Questa nuova funzione è utile quando la sicurezza e l’utilizzo delle risorse sono fondamentali, come per esempio in un ambiente di produzione.

Il Modello di Autorizzazione offre diverse possibilità, tra cui la limitazione dell’accesso al file system, ai child_process, ai worker_thread e agli addon nativi.

Potete usare flag come --allow-fs-read, --allow-fs-write e --allow-child-process per specificare quali risorse sono accessibili. Per attivare questi flag, dovete usare il flag --experimental-permission in combinazione con i permessi richiesti.

Ecco un esempio di come usare il Modello di Autorizzazione per consentire l’accesso in lettura e scrittura all’intero file system:

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

Potete anche usare il Modello di Autorizzazione per specificare l’accesso a cartelle e file specifici. Per esempio, il seguente comando consente l’accesso in scrittura alla cartella /tmp/:

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

Un vantaggio significativo del Modello di Autorizzazione è la possibilità di esercitare un controllo più granulare sull’accesso al file system. Per esempio, potete specificare percorsi e modelli di caratteri jolly per consentire l’accesso a cartelle o file specifici.

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

Il comando sopra riportato consente l’accesso in lettura a tutte le cartelle della directory /home/user/.

La proprietà permission dell’oggetto processo può essere utilizzata anche per verificare se uno specifico permesso è stato concesso in fase di esecuzione. Per esempio, se volete verificare se il vostro processo Node.js ha accesso in lettura a una cartella specifica, /home/user/documents, potete usare il seguente codice:

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

Utilizzando il Modello di Autorizzazione, potete avere un controllo più preciso sull’accesso al file system dei vostri processi Node.js, il che può portare a una maggiore sicurezza e a un utilizzo più efficiente delle risorse.

È importante notare che il Modello di Autorizzazione è ancora sperimentale e potrebbe cambiare nelle future versioni di Node.js. È consigliabile rimanere aggiornati sulla documentazione del Modello di Autorizzazione e usare con cautela queste funzioni sperimentali.

Test Runner Stabile

Node.js v20 include una versione stabile del modulo test_runner che vi permette di costruire ed eseguire suite di test JavaScript in modo semplice e veloce senza installare dipendenze aggiuntive.

Il test runner stabile ora include diversi blocchi di costruzione, come describe, it/test, e hooks, per la creazione e la strutturazione dei file di test, oltre a mocking, watch mode e la possibilità di eseguire più file di test in parallelo utilizzando il comando node --test.

Ecco un esempio di utilizzo del 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");
});

Il test runner offre reporter di test configurabili e personalizzati tramite il flag --test-reporter, copertura sperimentale dei test tramite il flag --experimental-test-coverage e funzionalità di mocking.

Pur non essendo destinato a sostituire framework di test completi come Jest o Mocha, il test runner stabile offre un modo semplice e veloce per creare suite di test. È stato migliorato in modo significativo dalla sua introduzione in Node.js v19 e, grazie ai test e ai feedback degli utenti finali, ora è stato contrassegnato come stabile in Node.js v20.

Trovate maggiori informazioni in questa richiesta di pull unificata.

Motore JavaScript V8 Aggiornato a 11.3

Il motore JavaScript V8, che alimenta Node.js, è stato aggiornato alla versione 11.3 in Node.js v20. Questo aggiornamento migliora le prestazioni e introduce nuove funzionalità del linguaggio. Tra le novità di questo aggiornamento ci sono:

  • String.prototype.isWellFormed e toWellFormed: Questi metodi sono particolarmente utili per garantire il corretto formato delle stringhe. Aiutano a garantire che le stringhe inserite dall’utente siano nel formato UTF-16 corretto, riducendo gli errori nell’era delle emoji.
  • Metodi che modificano Array e TypedArray tramite copia: questo può essere utile per creare copie modificate di array senza intaccare i dati originali, il che è particolarmente importante nei casi in cui è necessario conservare i dati originali per un confronto o per altri scopi.
  • Resizable ArrayBuffer e growable SharedArrayBuffer: offre una maggiore flessibilità, consentendo un’allocazione più efficiente della memoria.
  • Flag RegExp v con notazione set e proprietà delle stringhe: aggiunge funzionalità per le espressioni regolari.
  • WebAssembly tail call: fornisce un modo per ottimizzare alcuni tipi di chiamate di funzione.

Questi aggiornamenti dimostrano il costante impegno della comunità di developer di Node.js nel migliorare le prestazioni e le funzionalità.

Import.meta.resolve() Sincrono

In Node.js v20 è stato introdotto import.meta.resolve(), che facilita la scrittura di script non sensibili alla posizione. Questa funzione restituisce risultati in modo sincrono, in modo simile al comportamento del browser, consentendo un’esecuzione più efficiente.

Gli hook di risoluzione del caricatore utente possono ancora essere definiti come funzione asincrona, ma import.meta.resolve() continuerà a restituire in modo sincrono per il codice dell’applicazione anche se vengono caricati hook di risoluzione asincroni.

Il comportamento sincrono di import.meta.resolve() consente un’esecuzione più efficiente del codice, soprattutto quando si tratta di grandi quantità di dati. Come autore, potete definire gli hook di risoluzione come funzioni asincrone o sincrone, a seconda delle vostre preferenze. Il codice dell’applicazione verrà comunque eseguito in modo sincrono indipendentemente dal fatto che siano stati caricati dei resolve hook async.

Experimental Single Executable Applications (SEA)

Experimental Single Executable Applications (SEA) è una nuova funzionalità introdotta in Node.js v20 che permette di unire la vostra applicazione al binario di Node.js, consentendo agli utenti finali di distribuirla ed eseguirla come un unico file eseguibile.

Si tratta di una richiesta avanzata da tempo dalla comunità e il team ha perfezionato l’approccio nel corso dell’ultimo anno.

In Node.js v20, la creazione di un’unica applicazione eseguibile richiede l’iniezione di un blob preparato da Node.js a partire da una configurazione JSON piuttosto che l’iniezione del file JS grezzo.

Un blob è un file che contiene dati binari, in questo caso preparati da Node.js, e viene iniettato nel binario. Questa modifica è stata apportata per consentire l’incorporazione di più risorse coesistenti nella SEA, il che apre nuovi casi d’uso.

Ecco un esempio di file sea-config.json:

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

Quando viene eseguito con il comando node --experimental-sea-config sea-config.json, il blob viene scritto nel file sea-prep.blob, che può essere iniettato nel binario.

La funzione SEA vi consente di distribuire applicazioni Node.js senza richiedere agli utenti di installare Node.js. La funzionalità è stata creata da Darshan Sen, che ha vinto il premio Outstanding Contribution from a New Arrival nell’ambito dei JavaScriptLandia Awards all’OpenJS World.

Microsoft, membro della OpenJS Foundation, sta studiando questa funzionalità come un modo per ridurre gli attacchi vettoriali e potenziare l’architettura Node.js per una migliore esperienza. Sebbene la funzione SEA sia ancora sperimentale, rappresenta un nuovo ed entusiasmante sviluppo per la comunità Node.js.

Prestazioni

Node.js v20 è dotato di miglioramenti significativi al suo runtime, con una rinnovata attenzione alle prestazioni da parte del nuovo team Node.js performance. I miglioramenti includono ottimizzazioni delle parti fondamentali del runtime, come URL, fetch() e EventTarget.

Uno dei miglioramenti più significativi è la riduzione del costo di inizializzazione di EventTarget, che è stato dimezzato, con un conseguente accesso più rapido a tutti i sottosistemi che lo usano. Inoltre, le chiamate API V8 Fast sono state utilizzate per migliorare le prestazioni di API come URL.canParse() e i timer.

Un altro cambiamento specifico è l’inclusione della versione 2.0 aggiornata di Ada, un parser di URL veloce e conforme alle specifiche scritto in C++.

Riepilogo

In questo articolo abbiamo presentato alcune delle principali caratteristiche (sperimentali e stabili) e dei miglioramenti apportati da Node.js v20, come i miglioramenti al motore JavaScript V8, le prestazioni, il test runner e l’introduzione di un modello di autorizzazione sperimentale e di applicazioni a esecuzione singola.

È importante sapere che Node.js v14 terminerà il suo ciclo di vita ad aprile 2023, quindi è consigliabile iniziare a pianificare l’aggiornamento a Node.js v18 (LTS) o a vNode.js 20 (che diventerà presto una versione LTS).

Volete provare l’ultima versione di Node.js? Potete farlo distribuendo la vostra applicazione Node.js su Kinsta, i primi 20 dollari saranno a carico nostro. Supportiamo già Node.js v20, il che significa che potrete testare le sue nuove caratteristiche e funzionalità a partire da oggi.

Ora tocca a voi! Quali sono le caratteristiche o i miglioramenti più interessanti di Node.js v20? Ce ne sono di significative che ci sono sfuggite? Fatecelo sapere nei commenti.

Joel Olawanle Kinsta

Joel è uno Frontend developer che lavora in Kinsta come redattore tecnico. È un insegnante appassionato che ama l'open source e ha scritto oltre 200 articoli tecnici principalmente su JavaScript e i suoi framework.