È stato rilasciato Node.js 22.0, una piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Node.js 22.0 è considerato parte dei rami a lungo termine, ma questo status sarà confermato solo in ottobre, dopo il processo di stabilizzazione. Il supporto per Node.js 22.x sarà fornito fino al 30 aprile 2027. Il supporto per il precedente ramo LTS Node.js 20.x continuerà fino ad aprile 2026, mentre quello del ramo LTS 18.x terminerà ad aprile 2025. Il supporto per il ramo intermedio Node.js 21.x cesserà il 1° giugno 2024.
Miglioramenti principali:
- Il motore V8 è stato aggiornato alla versione 12.4, utilizzata in Chromium 124. Tra le modifiche rispetto al ramo Node.js 21 (che utilizzava il motore V8 11.8), si evidenzia:
- Supporto per l'estensione WasmGC, che semplifica il porting in WebAssembly di programmi scritti in linguaggi di programmazione che utilizzano un garbage collector (Kotlin, PHP, Java, etc.). WasmGC aggiunge nuovi tipi di strutture e array per cui può essere applicata un'allocazione di memoria non lineare.
- Supporto per il metodo Array.fromAsync(), che in modalità asincrona restituisce una nuova istanza dell'oggetto Array, copiata da oggetti simili a array che possono essere iterati (iterable) o iterabili in modo asincrono (async iterable).
- Supporto per metodi per lavorare con iteratori, come .map, .filter, .find, .take, .drop, .forEach e .reduce.
- Supporto per l'oggetto Set, che definisce una collezione di valori e offre metodi per implementare operazioni tipiche sui set, come intersezioni, unioni, differenze e complementi.
- Incorpora per default il compilatore JIT ottimizzante Maglev, progettato per una rapida generazione di codice macchina ad alte prestazioni per il codice JavaScript utilizzato attivamente. L'attivazione di Maglev consente di accelerare notevolmente l'esecuzione di applicazioni CLI a breve termine, che non effettuano operazioni prolungate, ad esempio il tempo per completare il test Jetstream è ridotto del 7,5%, e per il test Speedometer del 5%.
- La gestione dei flussi è stata accelerata aumentando il valore dell'opzione highWaterMark da 16 KB a 65 KB (definisce il limite fino a cui viene effettuato il buffering della scrittura). Questa modifica comporta un aumento del consumo di memoria, pertanto le applicazioni progettate per funzionare con una quantità limitata di RAM potrebbero necessitare di ripristinare il valore precedente tramite la chiamata setDefaultHighWaterMark().
- È stata migliorata la performance dell'API fetch() e del test runner grazie a una maggiore efficienza nella creazione delle istanze di AbortSignal. Miglioramenti delle prestazioni anche per le API legate all'accesso sincrono ai filesystem.
- È stata fornita un'opzione sperimentale per utilizzare la chiamata 'require()' per caricare moduli JavaScript ESM (ECMAScript Modules) in modalità sincrona. I moduli ESM vengono utilizzati nei browser e sostituiscono i moduli CommonJS specifici per Node.js. Per caricare attraverso 'require()', un modulo ESM deve essere eseguito in modalità sincrona (senza await in cima). Il supporto è attivato tramite il flag '--experimental-require-module'.
- Aggiunta possibilità sperimentale di eseguire script definiti nel file package.json utilizzando il comando '--run '.
- La comando 'node --watch' è stata promossa a stabile con l'implementazione di una modalità di osservazione, che riavvia il processo al cambiamento del file importato (per esempio, eseguendo 'node --watch index.js', il processo verrà riavviato automaticamente al cambiamento di index.js).
- È stata stabilizzata l'implementazione interna dell'API WebSocket, che consente di utilizzare WebSocket in modalità client senza necessità di installare dipendenze aggiuntive.
- Aggiunto supporto parziale per l'API Navigator.
- Nell'API Webstreams è stato aggiunto il supporto per il formato di compressione deflate-raw.
- Nel modulo node:fsmodule sono state aggiunte le funzioni glob e globSync per il matching di percorsi file basati su pattern.
- Migliorata la gestione delle stack IPv6 configurati in modo errato. Introdotto l'algoritmo Happy Eyeballs per un rapido fallback in caso di problemi con IPv6.
- Dichiarato obsoleto l'API util.
- Aggiornate le versioni delle dipendenze: npm 10.5.1, libuv 1.48.0, simdutf 5.2.3, c-ares 1.28.1, zlib 1.3.0.1-motley-24c07df, simdjson 3.8.0, ada 2.7.7 e undici 6.6.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 grande numero di richieste parallelle, Node.js utilizza un modello di esecuzione asincrono basato sulla gestione degli eventi in modalità non bloccante e sulla definizione di gestori di callback. Come metodi di multiplexing delle connessioni sono supportati epoll, kqueue, /dev/poll e select. Per il multiplexing delle connessioni si utilizza la libreria libuv, che è un'astrazione sopra libev nei sistemi Unix e sopra IOCP in Windows. Per creare un pool di thread è utilizzata la libreria libeio, mentre per eseguire richieste DNS in modalità non bloccante è integrata c-ares. Tutti i system call che comportano blocco vengono eseguiti all'interno del pool di thread e quindi, come i gestori di segnali, restituiscono il risultato del loro lavoro tramite una pipe non denominata.
L'esecuzione del codice JavaScript è garantita attraverso l'uso del motore V8 sviluppato da Google (inoltre Microsoft sta sviluppando una versione di Node.js con il motore Chakra-Core). Fondamentalmente, Node.js è simile ai framework Perl AnyEvent, Ruby Event Machine, Python Twisted e all'implementazione degli eventi in Tcl, ma il ciclo di elaborazione degli eventi in Node.js è nascosto agli sviluppatori e ricorda l'elaborazione degli eventi in un'app web che funziona nel browser.
Fonte: opennet.ru
