Novità di Node.js v20 (Test Runner, Modello di autorizzazione, SEA, V8 JS Engine 11.3)
Pubblicato: 2023-04-28Node.js v20 è ora disponibile! Il 18 aprile 2023 è stato reso pubblico e ora può essere utilizzato da tutti. Con questa versione, Node.js dovrebbe essere molto più sicuro e avere prestazioni migliori.
È importante sapere: poiché si tratta di una versione con numero pari, è previsto che diventi una versione con supporto a lungo termine (LTS) nell'ottobre 2023 e sarà supportata fino all'aprile 2026. Tuttavia, il team di Node.js è attivamente alla ricerca di community feedback per identificare e risolvere eventuali problemi prima che venga promosso a LTS.
Questa nuova versione di Node.js offre aggiornamenti e funzionalità entusiasmanti che gli sviluppatori apprezzeranno sicuramente come il modello di autorizzazione sperimentale, import.meta.resolve
sincrono, un test runner stabile, aggiorna il motore JavaScript V8 alla versione 11.3, apportando miglioramenti delle prestazioni e bug correzioni e molto altro ancora.
In questo articolo, esplorerai le modifiche introdotte in Node.js v20, fornendo uno sguardo approfondito alle sue nuove caratteristiche e funzionalità.
Introduzione a Node.js v20
L'installazione di Node.js v20 è abbastanza simile ad altre versioni di Node.js. Tutto quello che devi fare è:
- Scarica il pacchetto di installazione dal sito Web ufficiale di Node.js.
- Dopo aver scaricato il programma di installazione, eseguilo e segui le istruzioni per completare il processo di installazione. Questo processo è piuttosto semplice e devi solo accettare il contratto di licenza e fare clic sul pulsante "Avanti".
- Riavvia il tuo sistema/macchina al termine del processo di installazione per assicurarti che tutte le modifiche abbiano effetto.
- Verifica l'installazione di Node.js eseguendo il seguente comando:
node -v
Se vedi il numero di versione (v20.0.0), significa che Node.js è installato correttamente e sei pronto per iniziare a lavorare con Node.js v20.
Cosa c'è di nuovo in Node.js v20?
Esploriamo i 5 principali aggiornamenti introdotti con questa versione di Node.js. Queste funzionalità includono:
Modello di autorizzazione sperimentale
L'introduzione del modello di autorizzazione sperimentale in Node.js v20 è un'aggiunta significativa che offre agli sviluppatori un maggiore controllo sull'accesso a risorse specifiche durante l'esecuzione.
Questa nuova funzionalità è vantaggiosa quando la sicurezza e l'utilizzo delle risorse sono fondamentali, ad esempio in un ambiente di produzione.
Il modello di autorizzazione viene fornito con diverse capacità, inclusa la limitazione dell'accesso al file system, child_process, worker_threads e componenti aggiuntivi nativi.
Gli sviluppatori possono utilizzare flag come --allow-fs-read
, --allow-fs-write
e --allow-child-process
per specificare quali risorse sono accessibili. Per attivare questi flag, gli sviluppatori devono utilizzare il flag --experimental-permission
in combinazione con le autorizzazioni richieste.
Ecco un esempio di come utilizzare 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
Gli sviluppatori possono anche utilizzare il modello di autorizzazione per specificare l'accesso a cartelle e file specifici. Ad 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 capacità di esercitare un controllo più granulare sull'accesso al file system. Ad esempio, gli sviluppatori possono 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 precedente concede l'accesso in lettura a tutte le cartelle all'interno della directory /home/user/ .
La proprietà permission dell'oggetto processo può essere utilizzata anche per verificare se è stata concessa un'autorizzazione specifica in fase di esecuzione. Ad esempio, se desideri verificare se il tuo processo Node.js ha accesso in lettura a una cartella specifica, /home/user/documents , puoi utilizzare 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, hai un controllo più granulare sull'accesso al file system dei tuoi processi Node.js, che può portare a una migliore sicurezza e a un utilizzo più efficiente delle risorse.
È fondamentale notare che il modello di autorizzazione è ancora sperimentale e potrebbe cambiare nelle versioni future di Node.js. È consigliabile rimanere aggiornati con la documentazione del modello di autorizzazione e prestare attenzione quando si utilizzano queste funzionalità sperimentali.
Corridore di prova stabile
Node.js v20 include una versione stabile del modulo test_runner che consente agli sviluppatori di creare ed eseguire suite di test JavaScript in modo rapido e semplice senza installare dipendenze aggiuntive.
Il test runner stabile ora include diversi elementi costitutivi, come describe
, it
/ test
e hook , per la creazione e la strutturazione dei file di test, insieme a mocking, modalità watch e la possibilità di eseguire più file di test in parallelo utilizzando il node --test
comando node --test
.
Ecco un esempio di come utilizzare il 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 del test sperimentale tramite il flag --experimental-test-coverage
e funzionalità di derisione.
Sebbene non sia destinato a sostituire framework di test completi come Jest o Mocha, il test runner stabile offre un modo semplice e rapido per creare suite di test. È stato notevolmente migliorato dalla sua introduzione in Node.js v19 e, grazie ai test e al feedback degli utenti finali, ora è stato contrassegnato come stabile in Node.js v20.
Ulteriori informazioni sono disponibili in questa richiesta pull unita.
Motore JavaScript V8 aggiornato alla 11.3
Il motore JavaScript V8, che alimenta Node.js, è stato aggiornato alla versione 11.3 in Node.js v20. Questo migliora le prestazioni e introduce nuove funzionalità linguistiche. Alcune delle nuove funzionalità di questo aggiornamento includono:
-
String.prototype.isWellFormed
etoWellFormed
: questi metodi sono particolarmente utili per garantire un formato di stringa corretto. Questo aiuta a garantire che l'input della stringa utente sia nel formato UTF-16 corretto, riducendo gli errori nell'era degli emoji. - Metodi che modificano Array e TypedArray per copia: questo può essere utile per creare copie modificate di array senza influire sui dati originali, il che è particolarmente rilevante nei casi in cui è necessario conservare i dati originali per il confronto o per altri scopi.
- Resizable
ArrayBuffer
e GrowableSharedArrayBuffer
: fornisce una maggiore flessibilità, consentendo un'allocazione della memoria più efficiente. - RegExp v flag con notazione set e proprietà delle stringhe: aggiunge funzionalità per le espressioni regolari.
- Chiamata di coda WebAssembly: fornisce un modo per ottimizzare alcuni tipi di chiamate di funzione.
Questi aggiornamenti mostrano l'impegno costante della comunità di sviluppo di Node.js per migliorare prestazioni e funzionalità.
Sincrono import.meta.resolve()
In Node.js v20 è stato introdotto import.meta.resolve()
, che semplifica la scrittura di script non sensibili alla posizione. Questa funzione restituisce in modo sincrono, simile al comportamento del browser, consentendo un'esecuzione più efficiente.
Gli hook di risoluzione del caricatore utente possono ancora essere definiti come una funzione asincrona, ma import.meta.resolve()
restituirà comunque in modo sincrono per il codice dell'applicazione anche se vengono caricati gli hook di risoluzione asincrona.
Il comportamento sincrono di import.meta.resolve()
consente un'esecuzione del codice più efficiente, soprattutto quando si tratta di grandi quantità di dati. In qualità di autore, puoi definire gli hook di risoluzione come funzioni asincrone o di sincronizzazione, a seconda delle tue preferenze. Il codice dell'applicazione verrà comunque eseguito in modo sincrono indipendentemente dal fatto che siano stati caricati hook di risoluzione asincrona.
Applicazioni eseguibili singole sperimentali (SEA)
Experimental Single Executable Applications (SEA) è una nuova funzionalità introdotta in Node.js v20 che consente di raggruppare la tua applicazione con il binario Node.js, consentendo agli utenti finali di distribuirlo ed eseguirlo come un singolo file eseguibile.
Questa è stata una richiesta di lunga data da parte della comunità e il team ha perfezionato l'approccio nell'ultimo anno.
In Node.js v20, la creazione di una singola app eseguibile richiede l'inserimento di un BLOB preparato da Node.js da una configurazione JSON anziché l'inserimento del file JS non elaborato.
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'incorporamento di più risorse coesistenti nella SEA, che apre nuovi casi d'uso.
Ecco un esempio di un file sea-config.jso n:
{ "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ò quindi essere inserito nel file binario.
La funzione SEA consente agli sviluppatori 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, un 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 funzionalità SEA sia ancora sperimentale, rappresenta un nuovo entusiasmante sviluppo per la comunità Node.js.
Prestazione
Node.js v20 viene fornito con miglioramenti significativi al suo tempo di esecuzione, con una rinnovata attenzione alle prestazioni da parte del team di prestazioni di Node.js appena formato. I miglioramenti includono ottimizzazioni alle parti principali del runtime, come URL, fetch()
e EventTarget
.
Uno dei notevoli miglioramenti è la riduzione del costo di inizializzazione EventTarget
, che è stato dimezzato, con conseguente accesso più rapido a tutti i sottosistemi che lo utilizzano. Inoltre, le chiamate API V8 Fast sono state utilizzate per migliorare le prestazioni in API come URL.canParse()
e timer.
Un altro cambiamento specifico è l'inclusione della versione aggiornata 2.0 di Ada, un analizzatore di URL veloce e conforme alle specifiche scritto in C++.
Riepilogo
In questo articolo, hai appreso alcune delle principali funzionalità (sperimentali e stabili) e miglioramenti apportati da Node.js v20, come miglioramenti al motore JavaScript V8, prestazioni, test runner e introduzione del modello di autorizzazione sperimentale e applicazioni a esecuzione singola .
È importante sapere che Node.js v14 andrà a fine vita nell'aprile 2023, quindi è consigliabile iniziare a pianificare l'aggiornamento a Node.js v18 (LTS) o vNode.js 20 (che presto sarà LTS).
Ti piacerebbe provare l'ultima versione di Node.js? Puoi farlo distribuendo la tua applicazione Node.js su Kinsta e ricevi i tuoi primi $ 20 in regalo. Supportiamo già Node.js v20, il che significa che puoi testare le sue nuove funzionalità e funzionalità a partire da oggi.
Ora è il tuo turno! Quali funzionalità o miglioramenti trovi più interessanti in Node.js v20? Ce ne sono di significativi che potremmo aver trascurato? Fateci sapere nei commenti.