È stata rilasciata Node.js 18.0, la piattaforma per l'esecuzione di applicazioni web in JavaScript. Node.js 18.0 è classificata come una versione con supporto a lungo termine, ma questo status sarà confermato solo a ottobre, dopo la stabilizzazione. Il supporto per Node.js 18.x continuerà fino ad aprile 2025. Il supporto per la precedente versione LTS Node.js 16.x durerà fino ad aprile 2024, e per la versione LTS 14.x fino ad aprile 2023. Il supporto per la versione LTS 12.x terminerà il 30 aprile, mentre la versione intermedia Node.js 17.x il 1° giugno.
Miglioramenti principali:
- Il motore V8 è stato aggiornato alla versione 10.1, utilizzata in Chromium 101. Rispetto alla versione Node.js 17.9.0, sono state aggiunte nuove funzionalità, come i metodi findLast e findLastIndex per la ricerca di elementi dalla fine dell'array e la funzione Intl.supportedValuesOf. È stato migliorato l'API Intl.Locale. È stata accelerata l'inizializzazione di campi di classi e metodi privati.
- L'API fetch() sperimentale, destinato a caricare risorse dalla rete, è abilitato per impostazione predefinita. L'implementazione è basata sul codice del client HTTP/1.1 undici e si avvicina il più possibile a un API simile fornita nei browser. Include anche il supporto per le interfacce FormData, Headers, Request e Response per la manipolazione degli header 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 i propri gestori per lavorare con i dati man mano che arrivano dalla rete, senza dover aspettare il caricamento dell'intero file. In Node.js, ora sono disponibili oggetti come ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream e DecompressionStream.
- È stato stabilito l'API Blob, che consente di incapsulare dati grezzi immutabili per un uso sicuro in diversi thread di lavoro.
- È stato introdotto l'API BroadcastChannel, che consente di organizzare la comunicazione in modo asincrono nel formato 'un mittente - molti destinatari'.
- Aggiunto il modulo sperimentale node:test per creare e eseguire test in JavaScript che restituiscono 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+, comprese Debian 10 e Ubuntu 20.04, oltre a macOS 10.15+. A causa di problemi con la 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 specificare i componenti di avvio, è stata aggiunta l'opzione '--node-snapshot-main' allo script di configurazione, ad esempio './configure --node-snapshot-main=marked.js; name node'
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 elevato numero di richieste parallele, Node.js utilizza un modello asincrono di esecuzione del codice, basato su un'architettura ad eventi in modalità non bloccante e sulla definizione di callback. Per il multiplexing delle connessioni, vengono supportati metodi come epoll, kqueue, /dev/poll e select. La libreria libuv, che funge da interfaccia sopra libev nei sistemi Unix e IOCP in Windows, viene utilizzata per il multiplexing delle connessioni. La libreria libeio è impiegata per creare un pool di thread, mentre c-ares è integrato per eseguire richieste DNS in modalità non bloccante. Tutti i syscalls bloccanti sono eseguiti all'interno del pool di thread e, come gli handler dei segnali, restituiscono i risultati delle loro operazioni tramite una pipe non nominata. L'esecuzione del codice JavaScript è garantita dall'utilizzo del motore V8 sviluppato da Google (in aggiunta, Microsoft sviluppa una versione di Node.js con il motore Chakra-Core).
In sostanza, 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 in Node.js è nascosto allo sviluppatore e ricorda la gestione degli eventi in un'applicazione web che opera nel browser. Quando si scrivono applicazioni per Node.js, è importante considerare le peculiarità della programmazione orientata agli eventi; per esempio, invece di eseguire "var result = db.query('select..');" aspettando il completamento e poi elaborando i risultati, in Node.js si utilizza il principio dell'esecuzione asincrona, ovvero il codice viene trasformato in "db.query('select..', function (result) {elaborazione del risultato});", permettendo così il passaggio immediato al codice successivo, mentre i risultati della query vengono elaborati man mano che i dati arrivano.
Fonte: opennet.ru
