Dopo due anni di sviluppo prima significativa release , una piattaforma per l'esecuzione separata di applicazioni in JavaScript e TypeScript, che può essere utilizzata per creare gestori che funzionano sul server. La piattaforma è sviluppata da Ryan Dahl (), il creatore di Node.js. Così come in Node.js, Deno utilizza un motore JavaScript , che viene anche utilizzato nei browser basati su Chromium. Tuttavia, Deno non è un fork 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.
Il numero di versione significativo è collegato alla stabilizzazione delle API nel namespace Deno, che sono responsabili dell'interazione delle applicazioni con il sistema operativo. Le interfacce di programmazione che non sono ancora , per impostazione predefinita sono nascoste e accessibili solo eseguendo in modalità «—unstable». Con l'emergere di nuove versioni, tali API saranno gradualmente spostate nella categoria delle stabili. Le API nel namespace globale, che includono funzioni generali come setTimeout() e fetch(), sono progettate per avvicinarsi alle API dei normali browser web e si sviluppano in conformità con gli standard web per i browser. Le API fornite da Rust, che vengono utilizzate direttamente nel codice della piattaforma, così come l'interfaccia per lo sviluppo di plugin per Deno runtime, non sono ancora stabilizzate e continuano a evolversi.
I motivi chiave per la creazione di una nuova piattaforma JavaScript sono stati il desiderio di eliminare gli errori concettuali nell'architettura di Node.js e fornire agli utenti un ambiente più sicuro. Per migliorare la sicurezza, il wrapper attorno al motore V8 è scritto in Rust, il che consente di evitare molte vulnerabilità che si presentano a causa di operazioni a basso livello con la memoria, come l'accesso alla memoria dopo che è stata liberata, la dereferenziazione di puntatori nulli e l'uscita dai limiti del buffer. Per gestire le richieste in modo non bloccante, viene utilizzata la piattaforma , anch'essa scritta in Rust. Tokio consente di creare applicazioni ad alte prestazioni basate su un'architettura orientata agli eventi (Event-driven), che supportano il multithreading e la gestione delle richieste di rete in modo asincrono.
Principali Deno:
- Orientamento alla sicurezza nella configurazione predefinita. L'accesso a file, funzionalità di rete e variabili d'ambiente è bloccato per impostazione predefinita e richiede attivazione esplicita. Le applicazioni vengono eseguite in ambienti sandbox isolati di default e non possono accedere alle funzionalità di sistema senza esplicite autorizzazioni;
- Supporto integrato per il linguaggio TypeScript oltre a JavaScript. Per il controllo dei tipi e la generazione di JavaScript viene utilizzato il compilatore TypeScript, il che comporta un calo delle prestazioni rispetto all'analisi di JavaScript in V8. In futuro è prevista la realizzazione di un'implementazione propria del sistema di controllo dei tipi TypeScript, che permetterà di migliorare significativamente le prestazioni dell'elaborazione di TypeScript;
- Il runtime è fornito come un singolo file eseguibile autonomo ("deno"). Per eseguire applicazioni utilizzando Deno basta un file eseguibile per la propria piattaforma, di circa 20 MB, privo di dipendenze esterne e che non richiede un'installazione particolare nel sistema. Inoltre, deno non è un'applicazione monolitica, ma rappresenta una collezione di pacchetti crate in Rust (, ), che possono essere utilizzati separatamente;
- Quando avvii un programma, puoi anche utilizzare indirizzamenti tramite URL per caricare moduli. Ad esempio, per eseguire il programma welcome.js puoi 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 eseguire esplicitamente l'applicazione con il flag «—reload»);
- Gestione efficace delle richieste di rete in applicazioni HTTP, 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 nei normali browser web;
- La presenza di , il cui utilizzo non richiede legami con dipendenze esterne. I moduli della collezione standard hanno superato un audit aggiuntivo e un controllo di compatibilità;
- Oltre al runtime, la piattaforma Deno funge anche da gestore di pacchetti e permette di accedere ai moduli all'interno del codice tramite URL. 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 vengono memorizzati nella cache. Il legame alle versioni dei moduli è determinato dalle specifiche dei numeri di versione all'interno dell'URL, ad esempio "https://unpkg.com/liltest@0.0.5/dist/liltest.js";
- Il sistema è integrato con un sistema di ispezione delle dipendenze (comando «deno info») e un'utility 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 lega ai repository, l'indirizzamento dei moduli avviene tramite URL o percorso file, e i moduli stessi possono essere ospitati su qualsiasi sito; - In Deno non viene utilizzato "package.json" per definire i moduli;
- Esiste una differenza nell'API, tutte le azioni asincrone in Deno restituiscono un promise;
- Deno richiede una definizione esplicita di tutte le autorizzazioni necessarie per file, rete e variabili d'ambiente;
- Tutti gli errori non gestiti portano alla chiusura dell'applicazione;
- In Deno viene applicato il sistema dei moduli ECMAScript e non è supportato require();
- Il server HTTP integrato di Deno è scritto in TypeScript e funziona sopra i socket TCP nativi, mentre il server HTTP di Node.js è scritto in C e fornisce binding per JavaScript. Gli sviluppatori di Deno hanno concentrato i loro sforzi nell'ottimizzazione dell'intero strato di socket TCP e nella fornitura di un'interfaccia più generica. Il server HTTP di Deno garantisce una minore capacità di elaborazione, ma assicura latenze basse e prevedibili. Ad esempio, in un test, una semplice applicazione basata sul server HTTP di Deno è riuscita a gestire 25.000 richieste al secondo con una latenza massima di 1,3 millisecondi. In Node.js, un'applicazione analoga ha elaborato 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 garantire la compatibilità con la libreria standard di Node.js, man mano che la quale in Deno saranno in grado di funzionare sempre più applicazioni scritte per Node.js.
Fonte: opennet.ru
