Piattaforma JavaScript lato server Node.js 20.0 disponibile

È avvenuto il rilascio di Node.js 20.0, una piattaforma per l'esecuzione di applicazioni di rete in JavaScript. Node.js 20.0 è stato assegnato al ramo di supporto lungo, ma questo stato verrà assegnato solo a ottobre, dopo la stabilizzazione. Node.js 20.x sarà supportato fino al 30 aprile 2026. La manutenzione del precedente ramo Node.js 18.x LTS durerà fino ad aprile 2025 e del precedente ramo 16.x LTS fino a settembre 2023. Il ramo 14.x LTS verrà mantenuto il 30 aprile e il ramo provvisorio Node.js 19.x il 1 giugno.

Principali miglioramenti:

  • Il motore V8 è stato aggiornato alla versione 11.3, utilizzata in Chromium 113. Tra le modifiche rispetto al ramo Node.js 19, che utilizzava il motore Chromium 107, le funzioni String.prototype.isWellFormed e toWellFormed, le funzioni Array.prototype e metodi TypedArray.prototype per lavorare con la copia al cambio di oggetti Array e TypedArray, flag "v" in RegExp, supporto per ridimensionare ArrayBuffer e aumentare la dimensione di SharedArrayBuffer, tail-call in WebAssembly.
  • Viene proposto un meccanismo sperimentale del modello di autorizzazione che consente di limitare l'accesso a determinate risorse durante l'esecuzione. Il supporto per il modello di autorizzazione viene abilitato specificando il flag "--experimental-permission" durante l'esecuzione. Nell'implementazione iniziale, sono state proposte opzioni per limitare l'accesso in scrittura (--allow-fs-write) e in lettura (--allow-fs-read) a determinate parti dell'FS, processi secondari (--allow-child-process) , componenti aggiuntivi (--no-addons ) e thread (--allow-worker). Ad esempio, per consentire la scrittura nella directory /tmp e la lettura del file /home/index.js, è possibile specificare: node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read =/home/index.js indice .js

    Per verificare l'accesso, si consiglia di utilizzare il metodo process.permission.has(), ad esempio "process.permission.has('fs.write',"/tmp/test").

  • I gestori per i moduli esterni ECMAScript (ESM) caricati tramite l'opzione "--experimental-loader" vengono ora eseguiti in un thread separato, isolato dal thread principale, che elimina l'intersezione tra il codice dell'applicazione e i moduli ESM caricati. Similmente ai browser, il metodo import.meta.resolve() ora viene eseguito in modo sincrono quando viene chiamato dall'interno di un'applicazione. In uno dei prossimi rami di Node.js, è previsto che il supporto al caricamento ESM venga spostato nella categoria delle funzionalità stabili.
  • Il modulo node:test (test_runner), progettato per creare ed eseguire test JavaScript che restituiscono risultati in formato TAP (Test Anything Protocol), è stato spostato in stable.
  • È stato formato un team di performance separato che, in preparazione per il nuovo ramo, ha lavorato per accelerare vari componenti di runtime, tra cui l'analisi degli URL, fetch() ed EventTarget. Ad esempio, il sovraccarico dell'inizializzazione di EventTarget è stato dimezzato, le prestazioni del metodo URL.canParse() sono state notevolmente migliorate e l'efficienza dei timer è stata migliorata. Inoltre, nella composizione è inclusa la versione di un parser URL ad alte prestazioni - Ada 2.0, scritto in C ++.
  • È proseguito lo sviluppo di una funzionalità sperimentale per la distribuzione delle applicazioni sotto forma di un unico file eseguibile (SEA, Single Executable Applications). La creazione di un eseguibile ora richiede la sostituzione di un BLOB generato da un file di configurazione JSON (invece di sostituire un file JavaScript).
  • Migliorata la compatibilità dell'API Web Crypto con implementazioni di altri progetti.
  • Aggiunto il supporto ufficiale per Windows su sistemi ARM64.
  • Supporto continuo per le estensioni WASI (WebAssembly System Interface) per la creazione di applicazioni WebAssembly autonome. Rimossa la necessità di specificare uno speciale flag della riga di comando per abilitare il supporto WASI.

La piattaforma Node.js può essere utilizzata sia per la manutenzione del server di applicazioni Web sia per la creazione di normali programmi di rete client e server. Per espandere la funzionalità delle applicazioni per Node.js, è stata preparata un'ampia raccolta di moduli, in cui è possibile trovare moduli con l'implementazione di server e client HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduli per l'integrazione con vari framework web, gestori WebSocket e Ajax, connettori DBMS (MySQL, PostgreSQL, SQLite, MongoDB), motori di template, 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 non bloccanti e sulla definizione di gestori di callback. I metodi supportati per le connessioni multiplex sono epoll, kqueue, /dev/poll e select. Per il multiplexing della connessione viene utilizzata la libreria libuv, che è un componente aggiuntivo per libev su sistemi Unix e 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, trasferiscono il risultato del loro lavoro attraverso una pipe (pipe) senza nome. L'esecuzione del codice JavaScript avviene tramite 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 a Perl AnyEvent, Ruby Event Machine, Python Twisted framework e all'implementazione di eventi Tcl, ma il loop degli eventi in Node.js è nascosto allo sviluppatore e assomiglia alla gestione degli eventi in un'applicazione web in esecuzione nel browser. Quando si scrivono applicazioni per node.js, è necessario considerare le specifiche della programmazione basata sugli eventi, ad esempio, invece di fare "var result = db.query("select..");" con l'attesa del completamento del lavoro e la successiva elaborazione dei risultati, Node.js utilizza il principio dell'esecuzione asincrona, ovvero il codice viene trasformato in "db.query("seleziona..", funzione (risultato) {elaborazione risultato});", in cui il controllo passerà immediatamente a ulteriore codice e il risultato della query verrà elaborato all'arrivo dei dati.

Fonte: opennet.ru

Aggiungi un commento