È stato rilasciato Node.js 18.0, una piattaforma per eseguire applicazioni di rete in JavaScript. Node.js 18.0 è classificato come una versione a lungo termine, ma questo stato sarà ufficializzato solo a ottobre, dopo un periodo di stabilizzazione. Il supporto per Node.js 18.x sarà disponibile fino ad aprile 2025. Il supporto per la precedente versione LTS Node.js 16.x continuerà fino ad aprile 2024, e per la LTS 14.x fino ad aprile 2023. Il supporto per la versione LTS 12.x verrà interrotto il 30 aprile, mentre per la versione intermedia Node.js 17.x il 1 giugno.
Principali miglioramenti:
- Il motore V8 è stato aggiornato alla versione 10.1, utilizzato in Chromium 101. Rispetto al rilascio di Node.js 17.9.0, è stata introdotta la supportabilità per funzionalità come i metodi findLast e findLastIndex per la ricerca di elementi dal fondo dell'array, insieme alla funzione Intl.supportedValuesOf. L'API Intl.Locale è stata migliorata. È stata accelerata l'inizializzazione dei campi delle classi e dei metodi privati.
- È stato incluso di default l'API sperimentale fetch(), progettato per il caricamento di risorse via rete. L'implementazione si basa su codice dal client HTTP/1.1 undici e si avvicina molto all'API simile offerta nei browser. È fornito supporto per le interfacce FormData, Headers, Request e Response per la manipolazione delle intestazioni HTTP delle richieste e delle risposte. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- È stata aggiunta un'implementazione sperimentale dell'API Web Streams, che fornisce accesso ai flussi di dati ricevuti tramite rete. L'API consente di aggiungere gestori personalizzati per lavorare con i dati man mano che questi arrivano, senza dover attendere il caricamento dell'intero file. Ora sono disponibili in Node.js oggetti come ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream e DecompressionStream.
- L'API Blob è stata convertita in stabile, consentendo l'incapsulamento di dati grezzi immutabili per un utilizzo sicuro attraverso vari flussi di lavoro.
- L'API BroadcastChannel è stata convertita in stabile, consentendo lo scambio di messaggi in modo asincrono nel formato "un mittente - molti destinatari".
- È stato aggiunto un modulo sperimentale node:test per la creazione e l'esecuzione di test in JavaScript, restituendo i risultati nel formato TAP (Test Anything Protocol).
- È stata garantita la creazione di build pronte per Red Hat Enterprise Linux (RHEL) 8 e altre distribuzioni basate su Glibc 2.28+, incluso Debian 10 e Ubuntu 20.04, così come per macOS 10.15+. A causa di problemi nella compilazione del motore V8, è stata temporaneamente sospesa la creazione di build a 32 bit per Windows.
- È stata fornita una funzionalità sperimentale per la creazione di un file eseguibile Node.js con componenti selezionati dall'utente, inizializzati all'avvio. Per definire i componenti di avvio, è stata aggiunta all'opzione dello script di configurazione ‘—node-snapshot-main’, ad esempio, ‘./configure —node-snapshot-main=marked.js; name node’
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
