È stato rilasciato Node.js 22.0, una piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Node.js 22.0 è stato assegnato ai rami con supporto a lungo termine, ma questo status sarà confermato solo a ottobre, dopo la fase di stabilizzazione. Il supporto per Node.js 22.x continuerà fino al 30 aprile 2027. Il supporto per l'ultimo ramo LTS Node.js 20.x durerà fino ad aprile 2026, mentre per il ramo LTS precedente 18.x fino ad aprile 2025. Il supporto per il ramo intermedio Node.js 21.x sarà interrotto il 1° giugno 2024.
Principali miglioramenti:
- 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 segnala:
- Supporto per l'estensione WasmGC, che semplifica il porting in WebAssembly delle applicazioni scritte in linguaggi di programmazione che utilizzano un garbage collector (Kotlin, PHP, Java, ecc.). WasmGC introduce nuovi tipi di strutture e array per i quali può essere applicato un'allocazione di memoria non lineare.
- Supporto per il metodo Array.fromAsync(), che restituisce in modalità asincrona una nuova istanza dell'oggetto Array, copiata da oggetti simili a un array, enumerabili (iterable) o enumerabili in modo asincrono (async iterable).
- Supporto per metodi di lavoro 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 con l'implementazione delle operazioni tipiche sui set, come intersezioni, unioni, differenze e complemento.
- Includo di default il compilatore JIT ottimizzante Maglev, mirato a generare rapidamente codice macchina ad alte prestazioni per il codice JavaScript utilizzato attivamente. L'attivazione di Maglev consente di accelerare notevolmente le applicazioni CLI a vita breve che non eseguono operazioni prolungate, ad esempio, il tempo necessario per il test Jetstream è ridotto del 7,5%, mentre 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 entro il quale viene eseguita la memorizzazione nella scrittura). Questa modifica comporta un aumento del consumo di memoria, quindi per le applicazioni progettate per operare con una memoria RAM limitata potrebbe essere necessario ripristinare il valore precedente tramite la chiamata setDefaultHighWaterMark().
- Le prestazioni dell'API fetch() e del test runner sono state potenziate grazie all'efficienza migliorata nella creazione di istanze di AbortSignal. Migliorate anche le performance delle API relative all'interazione sincrona con i file di sistema.
- Introdotta la funzionalità sperimentale per utilizzare la chiamata «require()» per caricare moduli JavaScript ESM (ECMAScript Modules) in modo sincrono. I moduli ESM sono utilizzati nei browser e sostituiscono i moduli CommonJS specifici di Node.js. Per caricare un modulo ESM tramite «require()», questo deve essere eseguito in modalità sincrona (senza await a livello superiore). Il supporto è attivabile tramite il flag «—experimental-require-module».
- Aggiunta la funzionalità sperimentale per eseguire script definiti nel file package.json utilizzando il comando «—run ».
- La comando «node —watch» è stato stabilizzato con l'implementazione della modalità di osservazione, che consente il riavvio del processo in caso di modifica del file importato (ad esempio, eseguendo «node —watch index.js», il processo verrà automaticamente riavviato quando index.js viene modificato).
- Stabilizzata l'implementazione interna dell'API WebSocket, che consente di utilizzare WebSocket in modalità client senza 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 dei percorsi dei file in base a pattern.
- Migliorato il trattamento di stack IPv6 configurati in modo non corretto. Implementato l'algoritmo Happy Eyeballs per un rapido fallback in caso di problemi con l'implementazione di IPv6.
- L'API util è stata dichiarata obsoleta.
- 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 a 3.8.0, ada 2.7.7 e undici 6.6.0.
La piattaforma Node.js può essere utilizzata sia per il supporto server lato Web di applicazioni che per creare normali programmi client e server di rete. Per espandere la funzionalità delle applicazioni Node.js è stata preparata una vasta collezione di moduli, in cui si possono trovare moduli con implementazione server e client HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduli per integrazioni con diversi framework web, gestori WebSocket e Ajax, connettori a DBMS (MySQL, PostgreSQL, SQLite, MongoDB), motori di templating, motori CSS, implementazioni di algoritmi crittografici e sistemi di autorizzazione (OAuth), parser XML.
Per garantire la gestione di un gran numero di richieste parallele, Node.js utilizza un modello asincrono per l'esecuzione del codice, basato sul trattamento degli eventi in modalità non bloccante e sulla definizione di gestori di callback. Tra i metodi di multiplexing delle connessioni sono supportati metodi come epoll, kqueue, /dev/poll e select. Per il multiplexing delle connessioni viene utilizzata la libreria libuv, che è un'astrazione sulla libev nei sistemi Unix e su IOCP in Windows. Per la creazione di un pool di thread viene utilizzata la libreria libeio; per l'esecuzione di richieste DNS in modalità non bloccante viene integrata c-ares. Tutte le chiamate di sistema che comportano blocchi vengono eseguite all'interno del pool di thread e poi, come i gestori di segnali, restituiscono il risultato del loro lavoro tramite un canale non nominato (pipe).
L'esecuzione del codice JavaScript è garantita attraverso l'uso del motore V8 sviluppato da Google (inoltre, Microsoft sviluppa una variante di Node.js con il motore Chakra-Core). Fondamentalmente, Node.js è simile a framework come Perl AnyEvent, Ruby Event Machine, Python Twisted e all'implementazione degli eventi in Tcl, ma il ciclo di elaborazione degli eventi (event loop) in Node.js è nascosto agli sviluppatori e ricorda la gestione degli eventi in un'app web che funziona nel browser.
Fonte: opennet.ru
