Deno és un sistema en temps d'execució per a Javascript i TypeScript, on està basat en el motor de JavaScript V8 i en el llenguatge de programació Rust. Creat per Ryan Dahl, creador original de NODE.JS, i està centrat en la seguretat i productivitat.[1] Va ser anunciat per Dahl en 2018 durant la seva xerrada "Coses de les quals em penedeixo sobre NODE.JS".[2] Deno ExplÃcitament pren la funció de tots dos runtime i el sistema de paquets dins d'un mateix executable, en comptes de requerir un programa per a l'administració de paquets per separat.[3][4]
Història
Deno va ser anunciat en JSConf UE 2018 per Ryan Dahl en la seva xerrada "10 coses que m'alteren sobre NODE.JS".[2] En la seva xerrada, Ryan va esmentar els seus remordiments sobre les decisions de disseny inicials amb NODE.JS, centrant la seva elecció per no utilitzar promeses en el disseny de l'API, ús de sistema de construcció antiquat GYP, node_modules i package.json
Finalment va presentar el prototip de Deno, buscant fer les crides al sistema a través de pas de missatges amb eines de serialització com ara Protocol Buffers, i proporcionar banderes de lÃnia d'ordres per a control d'accés.
Deno va ser inicialment escrit en Go i utilitzat Protocol_Buffers per serialització entre els costats privilegiats (Go, amb accés de trucada de sistema) i no-privilegiat (V8).[5] Aixà i tot, Go va ser aviat reemplaçat per Rust a causa de preocupacions per double runtime i la memòria brossa.[6] Tokio és introduït en lloc de libuv com la plataforma conduïda per esdeveniments (event drive) asÃncrona, i s'adopta FlatBuffers per a una serialització i des-serialització més rà pida "Zero Copy" però més tard a l'agost 2019, FlatBuffers era finalment tret després publicats els benchmarks que intervenen una significativa sobrecà rrega de la serialització a l'abril el 2019.[7][8][9][10]
Una l'estil de la biblioteca està ndard de Go, va ser creada al novembre 2018 per proporcionar una extensa quantitat d'utilitats i eines, parcialment solucionant el problema de NODE.JS de l'explosió de l'arbre de dependències.[11]
El Deno 1.0 oficial va ser alliberat el 13 de maig de 2020.[12]
Visió general
Deno busca ser un entorn de scripting productiu i segur per al programador modern. Similar a NODE.JS, Deno emfatitza en arquitectura manejada per esdeveniments, proveint un conjunt d'utilitats d'entrada sortida IO no bloquejant més de les seves versions bloquejant. Deno pot ser usat per crear servidors web, dur a terme computació cientÃfica, etc.
Comparació amb NODE.JS
Deno I NODE.JS és tots dos un runtime, basat en el motor de JavaScript v8 de Google, el mateix motor utilitzat en Google Chrome. Tots dos tenen bucles d'esdeveniments i ofereixan una interfÃcie de linia de comandament per córrer scripts i més una à mplia gamma d'utilitats de sistema.
Les diferències de Deno amb Node.js als següents aspectes:[3]
- Fa servir el mòdul ES com el sistema de mòdul per omissió, en comptes de CommonJS.
- Utilitza URLs per carregar dependències locals o remotes, similar als navegadors.
- Inclou un gestor de paquets intern per a la baixada de recursos, sense necessitat de NPM.
- Suporta TypeScript nativament usant un compilador TypeScript capturat (snapshotted TypeScript Compiler).
- Té una millor compatibilitat amb navegadors amb una à mplia gamma d'API Web.
- Permet controlar el sistema de fitxers i l'accés de xarxa per córrer codi en entorn de proves (Sandbox).
- Redefinició de l'API per utilitzar promeses, ES6 i caracterÃstiques TypeScript.
- Minimitza la mida de l'API bà sica, mentre proporciona una biblioteca està ndard gran sense dependències externes.
- Utilitza canals per al pas de missatges per invocar APIs de sistema amb privilegi i utilitzar lligadures.
Exemple
La següent executa un script bà sic de Deno sense cap permÃs de lectura/escriptura/xarxa (mode sandbox):
Banderes explÃcites són requerides per exposar permÃs corresponent:
deno run --allow-read --allow-net main.ts
Per inspeccionar l'arbre de dependència de l'script, utilitzeu la subcomanda info
:
Un programari Hola món bà sic a Deno s'assembla, és una cosa aixÃ:
console.log("Hola món");
Deno proporciona un espai de nom global per a la majoria de les APIs de deno que no estan disponibles en el navegador. Un programa Cat de Unix podria ser implementat com segueix:
/* cat.ts */
/* Deno APIs are exposed through the `Deno` namespace. */
const { stdout, open, copy, args } = Deno;
// Top-level await is supported
for (let i = 0; i < args.length; i++) {
const filename = args[i]; // Obtains command-line arguments.
const file = await open(filename); // Opens the corresponding file for reading.
await copy(stdout, file); // Performs a zero-copy asynchronous copy from `file` to `stdout`.
}
La funció Deno.copy
de dalt treballa de manera similar com les IO de.Copy
, on stdout
(sortida està ndard) és el Writer
i file és el Reader
.
Per córrer aquest programa, necessitem proporcionar el permÃs de lectura del sistema de fitxers:
deno run --allow-read cat.ts myfile
El següent script Deno implementa un servidor HTTP bà sic:
// Imports `serve` from the remote Deno standard library, using URL.
import { serve } from "https://deno.land/[email protected]/http/server.ts";
// `serve` function returns an asynchronous iterator, yielding a stream of requests
for await (const req of serve({ port: 8000 })) {
req.respond({ body: "Hello World\n" });
}
Quan corrent aquest programa, Deno automà ticament descà rrega i cau els fitxers de biblioteca està ndards remots i compilar el codi.
De manera semblant, podem córrer un guió de biblioteca està ndard (com un servidor de fitxers) directament sense explÃcitament descarregant, per proporcionar l'URL quan entrada filename (-Unes voltes sobre tots els permisos):
$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file_server.ts
Compile https://deno.land/std/http/file_server.ts
...
HTTP server listening on http://0.0.0.0:4500/
Referències