È stata presentata la versione Deno 1.28, una piattaforma per l'esecuzione isolata di applicazioni in JavaScript e TypeScript, che può essere utilizzata per creare handler che funzionano sul server. La piattaforma è sviluppata da Ryan Dahl, il creatore di Node.js. Come in Node.js, Deno utilizza il motore JavaScript V8, che è anche applicato nei browser basati su Chromium. Tuttavia, Deno non è un fork di Node.js, ma un nuovo progetto creato da zero. Il codice del progetto è distribuito con licenza MIT. Le versioni sono pronte per Linux, Windows e macOS.
Il progetto Deno è stato creato per fornire agli utenti un ambiente più sicuro e per affrontare gli errori concettuali presenti nell'architettura di Node.js. Per aumentare la sicurezza, il wrapper attorno al motore V8 è scritto in Rust, permettendo di evitare molte vulnerabilità derivanti da operazioni a basso livello sulla memoria. Per l'elaborazione delle richieste in modalità non bloccante si utilizza la piattaforma Tokio, anch'essa scritta in Rust. Tokio consente di creare applicazioni ad alte prestazioni basate su architetture orientate agli eventi (Event-driven), supportando il multithreading e il trattamento delle richieste di rete in modo asincrono.
Il cambiamento principale in questa nuova versione è la stabilizzazione della compatibilità con i pacchetti pubblicati nel repository NPM, che consente l'uso di oltre 1,3 milioni di moduli creati per la piattaforma Node.js in Deno. Ad esempio, nelle applicazioni basate su Deno è possibile ora utilizzare moduli come Prisma, Mongoose e MySQL per l'accesso persistente ai dati, così come framework per il funzionamento dei frontend come React e Vue. Alcuni moduli NPM rimangono ancora incompatibili con Deno, ad esempio a causa di legami con elementi dell'ambiente specifici di Node.js, come il file package.json. Inoltre, al momento non è possibile utilizzare il comando “deno compile” con i moduli NPM. Si prevede di eliminare tali incompatibilità e limitazioni nelle versioni future.
Il supporto per il modello basato sul sistema di moduli ECMAScript e Web API precedentemente utilizzato in Deno è mantenuto allo stesso livello e per l'importazione dei moduli NPM si utilizza il familiare schema di caricamento basato su URL. Per accedere ai moduli NPM è previsto un prefisso URL speciale “npm:”, che può essere utilizzato in analogia con i normali moduli Deno. Ad esempio, per importare un modulo NPM si può specificare ‘import { chalk } from “npm:chalk@5”;’, e per eseguire uno script NPM dalla riga di comando — “deno run —allow-env —allow-read npm:create-vite-extra”.
L'uso dei pacchetti NPM in Deno è significativamente più semplice rispetto a Node.js, poiché non è necessaria l'installazione preliminare dei moduli (i moduli vengono installati al primo avvio dell'applicazione), non si utilizza il file package.json e non viene utilizzato per impostazione predefinita il catalogo node_modules (i moduli vengono memorizzati nella cache in una directory comune, ma è possibile ripristinare il comportamento precedente tramite l'opzione “—node-modules-dir”).
Nelle applicazioni basate su NPM permane la possibilità di utilizzare i meccanismi di accesso, isolamento e attivazione delle funzionalità avanzate che influenzano la sicurezza fornite in Deno. Per contrastare attacchi attraverso dipendenze inaffidabili, Deno bloccano per impostazione predefinita tutti i tentativi di accesso al sistema da dipendenze e genera un avviso su eventuali problemi rilevati. Ad esempio, quando un modulo tenta di accedere in scrittura a /usr/bin/ verrà visualizzata una richiesta di conferma per tale operazione: deno run npm:install-malware ⚠️ ┌ Deno richiede accesso in scrittura a /usr/bin/. ├ Richiesto da `install-malware` ├ Esegui di nuovo con —allow-write per bypassare questo prompt. └ Permettere? [y/n] (y = sì, permettere; n = no, negare) >
Tra i miglioramenti non correlati a NPM nella nuova versione si segnala l'aggiornamento del motore V8 alla release 10.9, la rilevazione automatica dei file di blocco, la stabilizzazione delle API Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() e Deno.uid(), e l'aggiunta di una nuova API instabile Deno.Command() per l'esecuzione dei comandi (una sostituzione universale di Deno.spawn, Deno.spawnSync e Deno.spawnChild).
Caratteristiche principali di Deno:
- Orientamento alla sicurezza nella configurazione predefinita. Le richieste ai file, le capacità di rete e l'accesso alle variabili ambientali per impostazione predefinita sono bloccati e richiedono un'attivazione esplicita. Le applicazioni predefinite vengono eseguite in ambienti sandbox isolati e non possono accedere alle capacità di sistema senza concessione di autorizzazioni esplicite;
- Supporto integrato per il linguaggio TypeScript oltre a JavaScript. Per il controllo dei tipi e la generazione di JavaScript viene utilizzato un compilatore TypeScript incorporato, il che comporta un degrado delle prestazioni rispetto all'analisi di JavaScript in V8;
- Il runtime è fornito nella forma di un singolo file eseguibile autonomo (“deno”). Per eseguire applicazioni con Deno è sufficiente scaricare un file eseguibile per la propria piattaforma, di circa 30 MB, che non ha dipendenze esterne e non richiede alcuna installazione speciale nel sistema. Inoltre, deno non è un'applicazione monolitica, ma rappresenta una collezione di pacchetti crate in Rust (deno_core, rusty_v8), che possono essere utilizzati singolarmente.
- All'avvio del programma e per il caricamento dei moduli è possibile utilizzare l'indirizzamento tramite URL. Ad esempio, per avviare il programma welcome.js, si può utilizzare il comando «deno https://deno.land/std/examples/welcome.js». Il codice da risorse esterne viene scaricato e memorizzato nella cache sul sistema locale, ma non viene mai aggiornato automaticamente (per aggiornare è necessario avviare esplicitamente l'applicazione con il flag «—reload»).
- Gestione efficace delle richieste di rete HTTP nelle applicazioni; la piattaforma è progettata per creare applicazioni di rete ad alte prestazioni.
- Possibilità di creare applicazioni web universali, che possono essere eseguite sia in Deno che in un normale browser web.
- Presenza di un insieme standard di moduli, il cui utilizzo non richiede dipendenze esterne. I moduli della collezione standard hanno superato un audit aggiuntivo e controlli di compatibilità;
- Oltre a essere una piattaforma runtime, Deno funge anche da gestore di pacchetti e consente di accedere ai moduli tramite URL nel codice. Ad esempio, per caricare un modulo, puoi specificare nel codice «import * as log from «https://deno.land/std/log/mod.ts». I file caricati da fonti esterne server tramite URL vengono memorizzati nella cache. L'assegnazione delle versioni ai moduli è determinata specificando i numeri di versione all'interno dell'URL, ad esempio, «https://unpkg.com/liltest@0.0.5/dist/liltest.js»;
- Il sistema integra un ispezionatore delle dipendenze (comando «deno info») e un'utilità per la formattazione del codice (deno fmt);
- Tutti gli script dell'applicazione possono essere uniti in un unico file JavaScript.
Fonte: opennet.ru
