¿Qué es Deno? Un Node.js 'mejor'

Si le gusta Node.js pero no su administrador de paquetes npm, o si desea un entorno de ejecución de JavaScript más seguro que Node.js, puede encontrar el nuevo proyecto de código abierto Deno de interés (la palabra Deno es un anagrama de Node). Por otro lado, si está utilizando Node.js en producción, no hay nada que ver aquí, siga adelante: Deno todavía está "en desarrollo".

Deno es un programa para ejecutar código JavaScript y TypeScript fuera de un navegador. Es el esfuerzo más reciente encabezado por Ryan Dahl, quien fundó el proyecto Node.js en 2009, y es un intento de reinventar Node.js a la luz de los avances en JavaScript desde 2009, incluido el compilador TypeScript. Al igual que Node.js, Deno es esencialmente un shell alrededor del motor JavaScript de Google V8, aunque a diferencia de Node.js, incluye el compilador TypeScript en su imagen ejecutable.

Deno y JavaScript avanzado

En 2009, JavaScript carecía de varias características que habrían sido útiles para Node.js, según Dahl. Algunos de estos se han agregado a JavaScript a lo largo de los años como parte del estándar ECMAScript (ES), y TypeScript ha abordado algunos más.

JavaScript ha tenido eventos y devoluciones de llamada esencialmente desde siempre, pero pueden conducir a un código bastante complicado, especialmente cuando desea encadenar acciones asincrónicas. Las promesas hacen que la sintaxis sea un poco más legible. A promisees un objeto devuelto que representa la eventual finalización o falla de una operación asincrónica, al que puede adjuntar devoluciones de llamada, en lugar de pasar devoluciones de llamada a una función. Declarar una función asyncsimplifica aún más la sintaxis, lo que le permite usar awaitdentro de la función para hacer una pausa sin bloqueo hasta que se establezca la promesa.

Cuando se creó Node.js, el estándar de facto para los módulos de JavaScript era CommonJS, que es lo que admite npm. Desde entonces, el comité ECMAScript bendijo oficialmente un estándar diferente, los módulos ES, que es lo que admite jspm. Deno admite módulos ES.

Las matrices escritas son una API de ES6 para manejar datos binarios, algo que Node.js podría haber usado; la falta de soporte de datos binarios llevó a algunos problemas de diseño de Node.js. Deno usa matrices escritas cuando necesita manipular datos binarios sin procesar. Node.js ahora admite matrices escritas para código de usuario.

TypeScript es un superconjunto escrito de JavaScript que se compila en JavaScript simple (ES3 o superior; es configurable). TypeScript agrega tipos, clases y módulos opcionales a JavaScript y admite herramientas para aplicaciones de JavaScript a gran escala. (Anders Hejlsberg lo llama "JavaScript que escala"). Como se mencionó anteriormente, Deno contiene una imagen del compilador TypeScript como parte de su tiempo de ejecución. Si le pasa a Deno un archivo TypeScript, primero lo compilará en JavaScript y luego lo pasará al motor V8.

Deficiencias de diseño de Node.js

Según Dahl, quien después de todo diseñó Node.js y Deno, Node.js sufre de tres problemas de diseño importantes:

  • un sistema de módulos mal diseñado, con distribución centralizada;
  • muchas API heredadas que deben ser compatibles;
  • y falta de seguridad.

Deno soluciona los tres problemas. 

Ejecución segura Deno

La forma en que Deno mejora la seguridad sobre Node.js es simple: de forma predeterminada, Deno no permitirá que un programa acceda al disco, la red, los subprocesos o las variables ambientales. Cuando necesite permitir alguno de estos, puede optar por una marca de línea de comando, que puede ser tan granular como desee, por ejemplo --allow-read=/tmpo --allow-net=google.com. Otra mejora de seguridad en Deno es que siempre muere por errores no detectados, a diferencia de Node.js, que permitirá que la ejecución continúe después de un error no detectado, con resultados que pueden no ser predecibles.

Módulos Deno

En Node.js, carga módulos CommonJS usando la requirepalabra clave y todos, tanto estándar como de terceros, vienen implícitamente de npmjs.com. En Deno, carga los módulos ES usando la importpalabra clave e indica explícitamente la URL. Por ejemplo:

importar * como registro de "//deno.land/std/log/mod.ts";

Los módulos Deno se pueden alojar en cualquier lugar; no hay un repositorio centralizado para módulos de terceros. Además, los módulos siempre se almacenan en caché y se compilan localmente, y no se actualizan a menos que solicite explícitamente una actualización. Por lo tanto, debería poder ejecutar los programas Deno que ya están en su computadora portátil, siempre que todas las importaciones se hayan resuelto una vez, incluso si está en un avión sin conectividad.

Deno tiene una colección centralizada de módulos estándar que no tienen dependencias externas y son revisados ​​por el equipo central de Deno; vive en el servidor deno.land. La colección de módulos deno_std es un puerto suelto de la biblioteca estándar de Go.

Hay un poco de historia detrás de esa elección de modelo para la biblioteca. Dahl escribió su prototipo de Deno principalmente en el lenguaje Go, pero descubrió posibles conflictos entre los recolectores de basura en Go y V8. Él y sus colaboradores luego reescribieron Deno propiamente dicho con V8, Rust y el paquete de E / S asincrónico de Rust Tokio. Implementaron la biblioteca estándar Deno en TypeScript.

En este punto, Deno es un entorno razonable y divertido de usar para crear pequeños proyectos privados de secuencias de comandos en TypeScript. Según Dahl, Deno nunca afectará realmente el éxito de Node.js. Sin embargo, una vez que Deno llegue a la versión 1.0, puede convertirse en una opción viable para construir proyectos más grandes.