È stato rilasciato Node.js 21.0, la piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Il supporto per la versione Node.js 21.0 sarà attivo per 6 mesi. Nei prossimi giorni sarà completata la stabilizzazione della versione Node.js 20, che otterrà lo status LTS e sarà supportata fino ad aprile 2026. Il supporto per la precedente versione LTS Node.js 18.0 durerà fino a settembre 2025, mentre per la versione LTS 16.0 fino ad aprile 2024.
Principali miglioramenti:
- È stato annunciato l'API Fetch stabile, progettato per il caricamento di risorse tramite rete e per semplificare la scrittura di codice JavaScript universale, adatto a funzionare sia sul server che sul client. L'implementazione si basa sul codice del client HTTP/1.1 undici e si avvicina il più possibile a un API simile fornita nei browser. L'API include il metodo fetch() e gli oggetti Headers, Request e Response, che rappresentano le intestazioni 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); }
- È stato stabilizzato il supporto per l'API WebStreams, che fornisce accesso a flussi di dati ricevuti tramite rete. L'API consente di aggiungere i propri handler, che lavorano con i dati man mano che arrivano dalla rete, senza attendere il caricamento dell'intero file. In Node.js sono disponibili oggetti come ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream e DecompressionStream.
- È stata aggiunta un'implementazione sperimentale del client WebSocket, compatibile con i browser.. Per attivare il supporto WebSocket, è previsto un flag "—experimental-websocket".
- È stata aggiunta una modalità sperimentale per utilizzare per impostazione predefinita l'implementazione dei moduli JavaScript ESM (ECMAScript Modules, usati nei moduli per i browser) invece di CommonJS (specifico per Node.js). La modifica non influisce sui moduli il cui formato è esplicitamente definito attraverso il campo "type" in package.json, impostato tramite il flag "—input-type" o evidente per estensione del file (.mjs per ESM, .cjs per CommonJS). I moduli che non sono esplicitamente definiti come CommonJS (ad esempio, hanno l'estensione " .js ") saranno considerati come moduli ESM con l'attivazione della nuova modalità. Per attivare le nuove impostazioni dei moduli è proposto il flag "—experimental-default-type".
- Il motore V8 è stato aggiornato alla versione 11.8, utilizzata in Chromium 118, che ha aggiunto il supporto per il metodo ArrayBuffer.prototype.transfer, la possibilità di raggruppare array (metodo groupBy) e le istruzioni di WebAssembly per la gestione delle costanti (i32.add, i32.sub, i32.mul, i64.add, i64.sub e i64.mul).
- È stata interrotta la supporto per il gestore globalPreload, al suo posto per la configurazione dei moduli occorre utilizzare 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 prestazione del codice relativo all'analisi degli URL, all'API fetch, agli stream, a node:fs e all'HTTP.
- È stato aggiunto l'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 le maschere glob per selezionare i test da eseguire (ad esempio, è possibile specificare «—test **/*.test.js»).
- Sono stati aggiornati il gestore pacchetti npm 10.2.0 e il parser llhttp 9.1.2.
- È stata interrotta la supporto per Visual Studio 2019 e per le versioni di macOS precedenti a 11.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 l'elaborazione di un gran numero di richieste parallele, Node.js utilizza un modello di esecuzione del codice 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 metodi come epoll, kqueue, \/dev\/poll e select. Per il multiplexing delle connessioni viene utilizzata la libreria libuv, che è un'astrazione sopra libev nei sistemi Unix e sopra IOCP in Windows. Per creare un pool di thread viene utilizzata la libreria libeio, mentre per eseguire richieste DNS in modalità non bloccante è integrato c-ares. Tutti le chiamate di sistema che causano bloccaggi vengono eseguite all'interno del pool di thread e quindi, come i gestori di segnali, trasmettono il risultato del loro lavoro indietro attraverso un canale non nominato (pipe). L'esecuzione del codice JavaScript è garantita dall'utilizzo del motore V8 sviluppato da Google (in aggiunta Microsoft sviluppa una variante 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 gestione degli eventi (event loop) in Node.js è nascosto agli sviluppatori e ricorda la gestione degli eventi in un'applicazione web che opera nel browser. Quando si scrivono applicazioni per Node.js, è necessario considerare le specificità della programmazione orientata agli eventi; ad esempio, invece di eseguire "var result = db.query('select...');" attendendo il completamento e la successiva elaborazione dei risultati, Node.js utilizza il principio dell'esecuzione asincrona, ossia il codice si trasforma in "db.query('select...', function (result) {elaborazione del risultato});", dove il controllo passa immediatamente al codice successivo e il risultato della query viene elaborato man mano che i dati diventano disponibili.
Fonte: opennet.ru
