Dopo due anni di sviluppo prima importante versione , una piattaforma per l'esecuzione isolata di applicazioni in linguaggi JavaScript e TypeScript, che può essere utilizzata per creare gestori funzionanti sul server. La piattaforma è sviluppata da Ryan Dahl (), creatore di Node.js. Come in Node.js, Deno utilizza il motore JavaScript , che è anche utilizzato nei browser basati su Chromium. Tuttavia, Deno non è un ramo di Node.js, ma un progetto completamente nuovo creato da zero. Il codice del progetto è sotto licenza MIT. Le build per Linux, Windows e macOS.
Un numero di versione significativo è associato alla stabilizzazione delle API nello spazio dei nomi Deno, che sono responsabili dell'interazione delle applicazioni con il sistema operativo. Le interfacce software che sono ancora , per impostazione predefinita nascosti e accessibili solo quando si esegue in modalità «—unstable». Con l’evolversi delle nuove versioni, queste API verranno progressivamente aggiornate allo stato stabile. Le API nello spazio dei nomi globale, che includono funzioni comuni come setTimeout() e fetch(), sono progettate per essere il più possibile simili alle API dei normali browser web e si sviluppano in conformità agli standard web per i browser. Le API Rust fornite, che vengono utilizzate direttamente nel codice della piattaforma, così come l’interfaccia per lo sviluppo di plugin per il runtime Deno, non sono ancora stabilizzate e continuano a evolversi.
Le motivazioni chiave per la creazione di una nuova piattaforma JavaScript sono state il desiderio di correggere gli errori concettuali nell'architettura di Node.js e di fornire agli utenti un ambiente più sicuro. Per migliorare la sicurezza, la struttura attorno al motore V8 è scritta in Rust, un linguaggio che consente di evitare molte vulnerabilità derivate da operazioni a basso livello con la memoria, come l’accesso a memoria già liberata, la dereferenziazione di puntatori nulli e i buffer overflow. Per gestire le richieste in modalità non bloccante, viene utilizzata la piattaforma , scritto anche in linguaggio Rust. Tokio consente di creare applicazioni ad alte prestazioni basate su architettura orientata agli eventi, supportando il multithreading e la gestione delle richieste di rete in modo asincrono.
Principali 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 la verifica dei tipi e la generazione di JavaScript è utilizzato il compilatore TypeScript ufficiale, il che porta a una diminuzione delle prestazioni rispetto all'analisi di JavaScript in V8. In futuro è prevista la preparazione di una propria implementazione del sistema di verifica dei tipi di TypeScript, che consentirà di aumentare notevolmente le prestazioni nell'elaborazione di TypeScript;
- Il runtime è fornito come un singolo file eseguibile autonomo («deno»). Per eseguire applicazioni utilizzando Deno è sufficiente per la sua piattaforma un file eseguibile, di dimensioni di circa 20 MB, senza dipendenze esterne e che non richiede alcuna installazione particolare nel sistema. In questo modo, deno non è un'applicazione monolitica, ma rappresenta una collezione di pacchetti crate in Rust (, ), 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.
- Disponibilità , il cui utilizzo non richiede collegamenti a dipendenze esterne. I moduli della collezione standard hanno subito un audit aggiuntivo e un controllo di compatibilità;
- Oltre al runtime, la piattaforma Deno funge anche da gestore di pacchetti e consente di accedere ai moduli tramite URL nel codice. Ad esempio, per caricare un modulo si può specificare nel codice «import * as log from 'https://deno.land/std/log/mod.ts». I file caricati da server esterni tramite URL sono memorizzati nella cache. I vincoli alle versioni dei moduli sono definiti attraverso l'indicazione dei 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.
Differenze rispetto a Node.js:
- Deno non utilizza il gestore di pacchetti npm
e non si collega ai repository; gli indirizzi dei moduli sono gestiti tramite URL o percorsi di file, con i moduli che possono essere ospitati su qualsiasi sito; - In Deno non si utilizza il «package.json» per definire i moduli;
- Differenze nell'API: tutte le operazioni asincrone in Deno restituiscono un promise;
- Deno richiede una dichiarazione esplicita di tutti i permessi necessari per file, rete e variabili d'ambiente;
- Tutti gli errori non gestiti portano alla terminazione dell'applicazione;
- In Deno viene applicato il sistema di moduli ECMAScript e non è supportato require();
- Il server HTTP integrato di Deno è scritto in TypeScript e funziona su socket TCP nativi, mentre il server HTTP di Node.js è scritto in C e fornisce binding per JavaScript. Gli sviluppatori di Deno si sono concentrati sull'ottimizzazione dell'intero strato dei socket TCP e sulla fornitura di un'interfaccia più generale. Il server HTTP di Deno offre una larghezza di banda inferiore, ma garantisce latenze basse e prevedibili. Ad esempio, in un test, una semplice applicazione basata su Deno HTTP server è riuscita a gestire 25.000 richieste al secondo con una latenza massima di 1,3 millisecondi. In Node.js, un'applicazione simile ha gestito 34.000 richieste al secondo, ma le latenze variavano da 2 a 300 millisecondi.
- Deno non è compatibile con i pacchetti per Node.js (NPM), ma si sviluppa separatamente. per la compatibilità con la libreria standard di Node.js, man mano che si evolve, in Deno potranno essere eseguite sempre più applicazioni scritte per Node.js.
Fonte: opennet.ru
