È stato rilasciato Node.js 21.0, una piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Il supporto per la versione Node.js 21.0 sarà fornito per sei mesi. Nei prossimi giorni si completerà la stabilizzazione della versione Node.js 20, che otterrà lo status di LTS e sarà supportata fino ad aprile 2026. Il supporto per la precedente versione LTS Node.js 18.0 continuerà fino a settembre 2025, mentre per la versione LTS ancora precedente 16.0 fino ad aprile 2024.
Miglioramenti principali:
- È stato annunciato un API Fetch stabile, progettato per il caricamento di risorse tramite rete e per semplificare la scrittura di codice JavaScript universale, adatto ad essere eseguito sia sul lato server che sul lato client. L'implementazione è basata sul codice del client HTTP/1.1 undici e si avvicina il più possibile a un API simile fornito nei browser. L'API include il metodo fetch() e gli oggetti Headers, Request e Response, che rappresentano gli header HTTP, la richiesta e la risposta. const res = await fetch(‘https://nodejs.org/api/documentation.json’); if (res.ok) { const data = await res.json(); console.log(data); }
- È stata stabilizzata la compatibilità con l'API WebStreams, che fornisce accesso ai flussi di dati provenienti dalla rete. L'API consente di aggiungere gestori personalizzati che lavorano con i dati man mano che vengono ricevuti, senza attendere il caricamento di tutto il file. In Node.js sono disponibili oggetti come ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream e DecompressionStream.
- È stata aggiunta un'implementazione sperimentale di un client WebSocket, compatibile con i browser. Per abilitare il supporto per WebSocket è previsto un flag «—experimental-websocket».
- È stata introdotta una modalità sperimentale che usa per default l'implementazione dei moduli JavaScript ESM (ECMAScript Modules, utilizzata nei moduli per i browser) al posto di CommonJS (specifico per Node.js). Questa modifica non influisce sui moduli il cui formato è esplicitamente definito tramite il campo «type» in package.json, impostato tramite il flag «—input-type» o evidente in base all'estensione del file (.mjs per ESM, .cjs per CommonJS). Tuttavia, i moduli che non sono esplicitamente definiti come CommonJS (ad esempio, che hanno estensione «.js»), quando viene attivata la nuova modalità, saranno considerati come moduli ESM. Per attivare le nuove impostazioni dei moduli è stato introdotto il flag «—experimental-default-type».
- Il motore V8 è stato aggiornato alla versione 11.8, utilizzata in Chromium 118, che ora comprende il supporto per il metodo ArrayBuffer.prototype.transfer, la possibilità di raggruppare gli array (metodo groupBy) e le istruzioni di WebAssembly per il trattamento delle costanti (i32.add, i32.sub, i32.mul, i64.add, i64.sub e i64.mul).
- È stata interrotta la supporto per il gestore globalPreload; da ora in poi è possibile configurare i moduli utilizzando le chiamate register e initialize.
- Nella funzione fs.writeFile è stata aggiunta l'opzione "flush" per forzare il salvataggio dei dati su disco dopo ogni operazione di scrittura.
- È stata migliorata la performance del codice relativo all'analisi degli URL, all'API fetch, ai flussi, node:fs e all'HTTP.
- È stato aggiunto un oggetto globale navigator. Ad esempio, per ottenere dati sul numero di core della CPU, si può utilizzare la proprietà navigator.hardwareConcurrency.
- Nel parametro "—test" è stato aggiunto il supporto per i glob pattern per selezionare i test da eseguire (ad esempio, è possibile specificare "—test **/*.test.js.").
- Aggiornati il gestore di pacchetti incluso npm 10.2.0 e il parser llhttp 9.1.2.
- È stata interrotta la supporto per Visual Studio 2019 e le versioni di macOS precedenti alla 11.0.
La piattaforma Node.js può essere utilizzata sia per il supporto server delle applicazioni web, sia per creare normali programmi di rete client e server. Per espandere le funzionalità delle applicazioni Node.js, è disponibile un'ampia collezione di moduli, in cui è possibile trovare moduli con implementazioni server e client HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduli per l'integrazione con vari framework web, gestori WebSocket e Ajax, connettori per database (MySQL, PostgreSQL, SQLite, MongoDB), motori di templating, motori CSS, implementazioni di algoritmi crittografici e sistemi di autorizzazione (OAuth), parser XML.
Per gestire un elevato numero di richieste parallele, Node.js utilizza un modello asincrono di esecuzione del codice, basato su un'architettura ad eventi in modalità non bloccante e sulla definizione di callback. Per il multiplexing delle connessioni, vengono supportati metodi come epoll, kqueue, /dev/poll e select. La libreria libuv, che funge da interfaccia sopra libev nei sistemi Unix e IOCP in Windows, viene utilizzata per il multiplexing delle connessioni. La libreria libeio è impiegata per creare un pool di thread, mentre c-ares è integrato per eseguire richieste DNS in modalità non bloccante. Tutti i syscalls bloccanti sono eseguiti all'interno del pool di thread e, come gli handler dei segnali, restituiscono i risultati delle loro operazioni tramite una pipe non nominata. L'esecuzione del codice JavaScript è garantita dall'utilizzo del motore V8 sviluppato da Google (in aggiunta, Microsoft sviluppa una versione di Node.js con il motore Chakra-Core).
In sostanza, Node.js è simile ai framework Perl AnyEvent, Ruby Event Machine, Python Twisted e all'implementazione degli eventi in Tcl, ma il ciclo di gestione degli eventi in Node.js è nascosto allo sviluppatore e ricorda la gestione degli eventi in un'applicazione web che opera nel browser. Quando si scrivono applicazioni per Node.js, è importante considerare le peculiarità della programmazione orientata agli eventi; per esempio, invece di eseguire "var result = db.query('select..');" aspettando il completamento e poi elaborando i risultati, in Node.js si utilizza il principio dell'esecuzione asincrona, ovvero il codice viene trasformato in "db.query('select..', function (result) {elaborazione del risultato});", permettendo così il passaggio immediato al codice successivo, mentre i risultati della query vengono elaborati man mano che i dati arrivano.
Fonte: opennet.ru
