Deno es un tiempo de ejecución para JavaScript y TypeScript que se basa en el motor JavaScript V8 y el lenguaje de programación Rust . Fue creado por Ryan Dahl , creador original de Node.js , y está enfocado en la productividad. [6]
Autor (es) original (es) | Ryan Dahl |
---|---|
Desarrollador (es) | The Deno Company [1] y colaboradores |
Versión inicial | 13 de mayo de 2018 [2] |
Lanzamiento estable | 1.11.1 [3] / 15 de junio de 2021 |
Repositorio | github |
Escrito en | TypeScript , JavaScript , Rust , C ++ (enlaces V8) |
Sistema operativo | Linux , macOS , Microsoft Windows |
Tipo | Entorno de ejecución |
Licencia | Licencia MIT [4] [5] |
Sitio web | deno |
Fue anunciado por Dahl en 2018 durante su charla "10 cosas de las que me arrepiento de Node.js". [7] Deno asume explícitamente el papel de administrador de paquetes y tiempo de ejecución dentro de un solo ejecutable , en lugar de requerir un programa de administración de paquetes separado. [8] [9]
Historia
Deno fue anunciado en JSConf EU 2018 por Ryan Dahl en su charla "10 cosas de las que me arrepiento de Node.js". [7] En su charla, Dahl mencionó su pesar por las decisiones de diseño iniciales con Node.js, enfocándose en sus opciones de no usar promesas en el diseño de API , uso del sistema de compilación heredado GYP , módulos de nodo y package.json, dejando de lado extensiones de archivo, resolución mágica del módulo con index.js y rompiendo el entorno de espacio aislado de V8. [10] Finalmente presentó el prototipo de Deno, con el objetivo de lograr enlaces de llamadas al sistema a través del paso de mensajes con herramientas de serialización como Protocol Buffers , y proporcionar indicadores de línea de comando para el control de acceso .
Deno se escribió inicialmente en Go y usó Protocol Buffers para la serialización entre lados privilegiados (Go, con acceso a llamadas al sistema) y no privilegiados (V8). [11] Sin embargo, Go pronto fue reemplazado por Rust debido a preocupaciones sobre el doble tiempo de ejecución y la presión de recolección de basura . [12] Tokio se introdujo en lugar de libuv como la plataforma asincrónica impulsada por eventos, [13] y FlatBuffers se adoptó para una serialización y deserialización más rápida y "sin copia" [14], pero más tarde en agosto de 2019, FlatBuffers fue finalmente eliminado [15] después de publicar puntos de referencia que midieron una sobrecarga significativa de serialización en abril de 2019. [16]
En noviembre de 2018 se creó una biblioteca estándar, modelada a partir de la biblioteca estándar de Go, para proporcionar herramientas y utilidades extensas, resolviendo parcialmente el problema de explosión del árbol de dependencias de Node.js. [17]
El Deno 1.0 oficial fue lanzado el 13 de mayo de 2020. [18]
El 29 de marzo de 2021, se anunció la compañía Deno, con el respaldo en millones de dólares de Shasta Ventures , Mozilla Corporation y algunos otros. Se estableció para promover el desarrollo de Deno y proporcionar una oferta comercial a los usuarios. [1]
Descripción general
Deno tiene como objetivo ser un entorno seguro y de secuencias de comandos productivo para el programador moderno. [8] Similar a Node.js, Deno enfatiza la arquitectura dirigida por eventos , proporcionando un conjunto de utilidades de E / S centrales sin bloqueo , junto con sus versiones de bloqueo. Deno podría usarse para crear servidores web , realizar cálculos científicos, etc. Deno es un software de código abierto bajo la licencia MIT . [19]
Comparación con Node.js
Deno y Node.js son tiempos de ejecución creados en el motor JavaScript V8 de Google , el mismo motor que se utiliza en Google Chrome . Ambos tienen bucles de eventos internos y proporcionan interfaces de línea de comandos para ejecutar scripts y una amplia gama de utilidades del sistema.
Deno se desvía principalmente de Node.js en los siguientes aspectos: [8]
- Utiliza el módulo ES como sistema de módulo predeterminado, en lugar de CommonJS .
- Utiliza URL para cargar dependencias locales o remotas, similar a los navegadores .
- Incluye un administrador de paquetes incorporado para la búsqueda de recursos, por lo que no es necesario npm .
- Admite TypeScript listo para usar, utilizando un compilador de TypeScript instantáneo con mecanismos de almacenamiento en caché.
- Tiene como objetivo una mejor compatibilidad con navegadores con una amplia gama de API web.
- Restringe el sistema de archivos y el acceso a la red de forma predeterminada para ejecutar código en espacio aislado.
- Rediseña la API para utilizar promesas, funciones ES6 y TypeScript.
- Minimiza el tamaño de la API principal, al tiempo que proporciona una gran biblioteca estándar sin dependencias externas.
- Utiliza canales de paso de mensajes para invocar las API del sistema con privilegios y utilizar enlaces.
Lanzamientos
Versión | Lanzamiento del parche más reciente | Fecha de lanzamiento | Fecha de la última versión del parche | Descripción |
---|---|---|---|---|
0.1.0 | 0.1.12 | 2018-08-23 | 2018-11-12 | Rust reescritura e instantánea V8 |
0.2.0 | 0.2.11 | 2018-11-27 | 2019-02-08 | Ligeramente utilizable |
0.3.0 | 0.3.10 | 2019-02-18 | 2019-04-25 | En lugar de importar un módulo "deno", ahora hay una variable global llamada "Deno" |
0.4.0 | 0.4.0 | 2019-05-03 | 2019-05-03 | - |
0.5.0 | 0.5.0 | 2019-05-11 | 2019-05-11 | - |
0.6.0 | 0.6.0 | 2019-05-20 | 2019-05-20 | - |
0.7.0 | 0.7.0 | 2019-05-29 | 2019-05-29 | - |
0.8.0 | 0.8.0 | 2019-06-08 | 2019-06-08 | - |
0.9.0 | 0.9.0 | 2019-06-15 | 2019-06-15 | - |
0.10.0 | 0.10.0 | 2019-06-25 | 2019-06-25 | - |
0.11.0 | 0.11.0 | 2019-07-06 | 2019-07-06 | - |
0.12.0 | 0.12.0 | 2019-07-16 | 2019-07-16 | - |
0.13.0 | 0.13.0 | 2019-07-31 | 2019-07-31 | - |
0.14.0 | 0.14.0 | 2019-08-09 | 2019-08-09 | - |
0.15.0 | 0.15.0 | 2019-08-13 | 2019-08-13 | - |
0.16.0 | 0.16.0 | 2019-08-22 | 2019-08-22 | - |
0.17.0 | 0.17.0 | 2019-09-04 | 2019-09-04 | - |
0.18.0 | 0.18.0 | 2019-09-13 | 2019-09-13 | - |
0.19.0 | 0.19.0 | 2019-09-24 | 2019-09-24 | - |
0.20.0 | 0.20.0 | 2019-10-06 | 2019-10-06 | - |
0.21.0 | 0.21.0 | 2019-10-19 | 2019-10-19 | - |
0.22.0 | 0.22.0 | 2019-10-28 | 2019-10-28 | - |
0.23.0 | 0.23.0 | 2019-11-04 | 2019-11-04 | - |
0.24.0 | 0.24.0 | 2019-11-14 | 2019-11-14 | - |
0.25.0 | 0.25.0 | 2019-11-26 | 2019-11-26 | - |
0.26.0 | 0.26.0 | 2019-12-05 | 2019-12-05 | - |
0.27.0 | 0.27.0 | 2019-12-18 | 2019-12-18 | - |
0.28.0 | 0.28.1 | 2020-01-02 | 2020-01-03 | - |
0.29.0 | 0.29.0 | 2020-01-09 | 2020-01-09 | - |
0.30.0 | 0.30.0 | 2020-01-17 | 2020-01-17 | - |
0.31.0 | 0.31.0 | 2020-01-24 | 2020-01-24 | - |
0.32.0 | 0.32.0 | 2020-02-03 | 2020-02-03 | - |
0.33.0 | 0.33.0 | 2020-02-13 | 2020-02-13 | - |
0.34.0 | 0.34.0 | 2020-02-20 | 2020-02-20 | - |
0.35.0 | 0.35.0 | 2020-02-28 | 2020-02-28 | - |
0.36.0 | 0.36.0 | 2020-03-11 | 2020-03-11 | - |
0.37.0 | 0.37.1 | 2020-03-23 | 2020-03-23 | - |
0.38.0 | 0.38.0 | 2020-03-28 | 2020-03-28 | - |
0.39.0 | 0.39.0 | 2020-04-03 | 2020-04-03 | - |
0.40.0 | 0.40.0 | 2020-04-08 | 2020-04-08 | - |
0.41.0 | 0.41.0 | 2020-04-16 | 2020-04-16 | - |
0.42.0 | 0.42.0 | 2020-04-29 | 2020-04-29 | - |
1.0.0 | 1.0.5 | 2020-05-13 | 2020-06-03 | - |
1.1.0 | 1.1.3 | 2020-06-12 | 2020-07-03 | - |
1.2.0 | 1.2.3 | 2020-07-13 | 2020-08-08 | - |
1.3.0 | 1.3.3 | 2020-08-13 | 2020-09-04 | - |
1.4.0 | 1.4.6 | 2020-09-13 | 10/10/2020 | - |
1.5.0 | 1.5.4 | 27-10-2020 | 2020-11-23 | Agitación y agrupación de árboles más rápida, REPL refactorizado |
1.6.0 | 1.6.3 | 2020-12-08 | 2020-12-30 | Compile binarios independientes a través de "deno compile", soporte TypeScript 4.1, soporte experimental para Mac ARM64 |
1.7.0 | 1.7.5 | 2021-02-05 | 2021-02-19 | Compilación cruzada y binarios 60% más pequeños para compilación deno, una API de resolución de DNS, soporte para URL de datos en declaraciones de importación y trabajadores web |
1.8.0 | 1.8.3 | 2021-03-02 | 2021-04-02 | Soporte experimental para WebGPU API, API de internacionalización integradas habilitadas, soporte para buscar módulos privados, herramientas de cobertura renovadas, soporte para TypeScript 4.2 |
1.9.0 | 1.9.2 | 2021-04-13 | 2021-04-23 | Servidor web HTTP / 2 nativo, llamadas más rápidas a Rust con serde_v8, compatibilidad con URL de blob y mejoras para obtener api, finalizaciones de importación en el LSP, solicitud de permiso interactivo |
1.10.0 | 1.10.2 | 2021-05-11 | 2021-05-17 | Mejoras en el ejecutor de pruebas integrado, compatibilidad con clones estructurados en Web Workers, API de almacenamiento web, compatibilidad con mapas de importación remota |
Leyenda: Versión antigua Ultima versión Lanzamiento futuro |
La tabla anterior se creó utilizando la página de lanzamientos oficiales. [20]
Ejemplo
Esto ejecuta un script Deno básico sin ningún sistema de archivos o permisos de red ( modo sandbox ):
deno ejecutar main.ts
Se requieren indicadores explícitos para habilitar los permisos:
deno ejecutar --allow-read --allow-net main.ts
Para inspeccionar el árbol de dependencias del script, use el info
subcomando:
deno info main.ts
¡Un saludo básico , mundo! El programa en Deno se ve igual que en Node.js:
consola . log ( "¡Hola, mundo!" );
Un Deno
espacio de nombres global expone las API que no están disponibles en el navegador. Un programa cat de Unix podría implementarse de la siguiente manera:
/ * cat.ts * // * Las API de Deno se exponen a través del espacio de nombres `Deno`. * / const { stdout , open , copy , args } = Deno ;// await de nivel superior está soportado para ( dejar que i = 0 ; i < args . Longitud ; i ++ ) { const nombre de archivo = args [ i ]; // Obtiene argumentos de la línea de comandos. const file = aguardar abierto ( nombre de archivo ); // Abre el archivo correspondiente para su lectura. esperar copia ( archivo , stdout ); // Realiza una copia asíncrona de copia cero de `file` a` stdout`. }
La Deno.copy
función utilizada anteriormente funciona de manera muy similar a la de Go io.Copy
, donde stdout
( salida estándar ) es el destino Writer
y file
es la fuente Reader
. Para ejecutar este programa, necesitamos habilitar el permiso de lectura en el sistema de archivos :
deno run --permitir leer cat.ts myfile
El siguiente script Deno implementa un servidor HTTP básico :
// Importa `serve` de la biblioteca estándar remota de Deno, usando URL. importar { serve } de "https://deno.land/[email protected]/http/server.ts" ;// La función `serve` devuelve un iterador asincrónico, produciendo un flujo de solicitudes para await ( const req of serve ({ puerto : 8000 })) { req . responder ({ cuerpo : "¡Hola, mundo! \ n" }); }
Al ejecutar este programa, Deno descargará y almacenará en caché automáticamente los archivos de la biblioteca estándar remota y compilará el código. De manera similar, podemos ejecutar un script de biblioteca estándar (como un servidor de archivos ) directamente sin descargarlo explícitamente, proporcionando la URL como el nombre del archivo de entrada ( -A
activa todos los permisos):
$ deno run -A https://deno.land/std/http/file_server.ts Descargar https://deno.land/std/http/file_server.ts Compilar https://deno.land/std/http/file_server .ts ... servidor HTTP escuchando en http://0.0.0.0:4500/
Referencias
- ↑ a b Ryan Dahl, Bert Belder (29 de marzo de 2021). "Anunciando la Compañía Deno" .
- ^ "Colaboradores, denoland / deno, Github" . Consultado el 5 de julio de 2019 .
- ^ "Lanzamiento 1.11.1" . 15 de junio de 2021 . Consultado el 21 de junio de 2021 .
- ^ "deno / LICENSE at main" . GitHub . Consultado el 5 de julio de 2019 .
- ^ "La licencia del MIT" . Iniciativa de código abierto . 17 de septiembre de 2018 . Consultado el 17 de septiembre de 2018 .
- ^ "Deno: Secure V8 TypeScript Runtime de Original Node.js Creator" . InfoQ . Consultado el 17 de mayo de 2019 .
- ^ a b JSConf (6 de junio de 2018), 10 cosas de las que me arrepiento de Node.js - Ryan Dahl - JSConf EU 2018 , consultado el 17 de mayo de 2019
- ^ a b c "Deno Manual" . deno.land . Consultado el 17 de mayo de 2019 .
- ^ Paul Krill (21 de junio de 2018). "Ryan Dahl's Node.js lamenta llevar a Deno" . InfoWorld .
- ^ Dahl, Ryan (6 de junio de 2018). "Errores de diseño en Node" (PDF) . Github .
- ^ "denoland / deno, rama" golang " " . Github .
- ^ "Sugerencia: Mire la posibilidad de portar a Rust y usar Tokio" . GitHub .
- ^ "Tokio - El tiempo de ejecución asincrónico para el lenguaje de programación Rust" . Tokio.rs .
- ^ "¿Protobuf parece una gran sobrecarga para este caso de uso?" . Github .
- ^ "Eliminar flatbuffers" . GitHub .
- ^ "Reemplazar flatbuffers" . GitHub .
- ^ "denoland / deno_std: módulos estándar deno" . Github .
- ^ "Deno 1.0" . deno.land . Consultado el 14 de mayo de 2020 .
- ^ "Deno está listo para la producción" . InfoQ . Consultado el 1 de julio de 2020 .
- ^ "Lanzamientos" . 2020-12-30 . Consultado el 14 de enero de 2021 .
enlaces externos
- Página web oficial
- Manual oficial de Deno