È stata rilasciata Node.js 23.0.0, una piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Node.js 23.0 è classificato come ramo intermedio, che sarà supportato per 7 mesi (fino a giugno 2025). Nei prossimi giorni verrà completata la stabilizzazione del branch Node.js 22, che riceverà lo status LTS il 29 ottobre e sarà supportato fino ad aprile 2027. Il supporto per i rami LTS precedenti di Node.js 20.x e 18.x continuerà rispettivamente fino ad aprile 2026 e 2025.
Principali miglioramenti:
- Aggiunto supporto sperimentale per TypeScript, che consente definizioni di tipo esplicite. Il supporto viene abilitato utilizzando le opzioni "--experimental-strip-types" e "--experimental-transform-types". Nel caso della prima opzione, il lavoro con TypeScript si riduce alla cancellazione delle definizioni di tipo specifiche della lingua (il controllo del tipo non viene eseguito, il codice viene semplicemente convertito in JavaScript senza tipo). La seconda opzione converte alcuni elementi della sintassi TypeScript, come enumerazioni e spazi dei nomi, in codice JavaScript.
- Abilitata per impostazione predefinita è la possibilità di utilizzare la chiamata “require()” per caricare i moduli JavaScript ESM (moduli ECMAScript) in modalità sincrona. I moduli ESM vengono utilizzati nei browser e sostituiscono i moduli CommonJS specifici di Node.js. Per caricare tramite "require()" in Node.js, il modulo ESM deve essere eseguito in modo sincrono (senza wait al livello superiore).
- Viene fornito il rilevamento automatico dei moduli ESM nei file senza o con l'estensione ".js". In precedenza, tali file venivano trattati come moduli CommonJS a meno che il loro tipo non fosse esplicitamente specificato nel file package.json situato nella stessa directory (“tipo”: “modulo”). Nella nuova versione, per i file il cui tipo non è specificato in package.json, tenta prima di caricarsi come modulo CommonJS e, se fallisce, come modulo ESM.
- Aggiunta implementazione sperimentale compatibile con i browser L'API Web Storage è progettata per l'archiviazione persistente (classe localStorage) o temporanea (classe sessionStorage) di dati chiave/valore. Per abilitare il supporto Web Storage, è necessario eseguire l'API con il flag "--experimental-webstorage" e specificare il percorso del file di archiviazione utilizzando il flag "--localstorage-file".
- Aggiunta API SQLite sperimentale per lavorare con database utilizzando il linguaggio di query SQL e archiviazione basata sulla libreria SQLite. Oltre a memorizzare il database in un file su disco, è anche possibile posizionarlo in memoria specificando “:memory:” invece del nome del file. La suddetta API Web Storage è implementata anche su SQLite, con la conseguente aggiunta di SQLite come dipendenza per Node.js.
- È stato dichiarato stabile il comando “node —run”, progettato per eseguire gli script definiti nel file package.json.
- Implementato il supporto opzionale per la memorizzazione nella cache del codice compilato su disco per accelerare significativamente l'avvio dei moduli. La memorizzazione nella cache è abilitata tramite la variabile di ambiente NODE_COMPILE_CACHE. In termini di scopo, la funzionalità assomiglia al pacchetto v8-compile-cache, ma differisce per prestazioni più elevate e supporto per i moduli ESM.
- L'oggetto Buffer è stato ottimizzato per aumentare significativamente le prestazioni dei metodi Buffer.copy() e Buffer.write().
- Sono state migliorate le prestazioni del modulo node:fs, riducendo così anche il numero di chiamate al codice C++ durante il funzionamento.
- Il motore V8 è stato aggiornato alla versione 12.9, utilizzata in Chromium 129.
- Il supporto per i sistemi Windows a 32 bit è stato rimosso.
- Con l'introduzione delle funzionalità definite nello standard C++8 in Node.js e nel motore V20, i requisiti per la versione del compilatore GCC sono stati aumentati. La creazione di Node.js ora richiede almeno GCC 12.
La piattaforma Node.js può essere utilizzata sia per il supporto lato server di applicazioni web, sia per la creazione di programmi di rete standard lato client e lato server. Per espandere le funzionalità delle applicazioni Node.js, è stata predisposta un'ampia raccolta di moduli, inclusi quelli che implementano server e client HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduli per l'integrazione con vari framework web, gestori WebSocket e Ajax, connettori per DBMS (MySQL, PostgreSQL, SQLite, MongoDB), motori di template, motori CSS, implementazioni di algoritmi crittografici e sistemi di autorizzazione (OAuth), parser XML.
Per gestire un gran numero di richieste parallele, Node.js utilizza un modello di esecuzione del codice asincrono basato sull'elaborazione di eventi non bloccanti e sulla definizione di gestori di callback. I metodi supportati per le connessioni multiplex includono epoll, kqueue, /dev/poll e select. Per il multiplexing delle connessioni viene utilizzata la libreria libuv, che è un componente aggiuntivo di libev sui sistemi Unix e di IOCP su Windows. La libreria libeio viene utilizzata per creare un pool di thread e c-ares è integrato per eseguire query DNS in modalità non bloccante. Tutte le chiamate di sistema che causano il blocco vengono eseguite all'interno del pool di thread e quindi, come i gestori di segnali, restituiscono il risultato del loro lavoro attraverso una pipe senza nome.
L'esecuzione del codice JavaScript è assicurata attraverso l'utilizzo 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 di eventi in Tcl, ma il loop degli eventi in Node.js è nascosto allo sviluppatore e assomiglia all'elaborazione degli eventi in un'applicazione web in esecuzione nel browser.
Fonte: opennet.ru
