Deno: qué es y primeras impresiones

Introducción

Hace unas semanas se liberó la primera versión oficial de Deno, un nuevo entorno de desarrollo en JavaScript y TypeScript en el lado del servidor. Creado por el mismo desarrollador que NodeJs (Ryan Dahl), comparte con NodeJs algunas de sus principales características como la programación asíncrona y el ‘event driven’.

Al igual que NodeJs, Deno es multiplataforma y está basada en el motor V8 de Chrome, pero a diferencia de NodeJS, Deno está construido sobre Rust, un lenguaje de desarrollo conocido por su robustez y seguridad, además de su eficiencia.

Instalación

La instalación de Deno es un proceso muy sencillo. Desde su página https://deno.land/#installation podemos acceder a diversos métodos de instalación según cual sea nuestro sistema operativo: a través de curl (Mac, Linux), PowerShell (Windows), etc...

Una vez instalado podremos comprobar nuestra instalación desde la consola:

Características

Soporte nativo de TypeScript

Deno proporciona un soporte nativo a TypeScript, esto es, no es necesario configurar ningún tipo de fichero.

Podemos construir el típico script ‘Hola mundo’ con la sentencia:

Dino soporte nativo de TypeScript

Si lo guardamos en un fichero .ts (TypeScript) y tras ejecutarlo con Deno el resultado es el siguiente:

Vemos que se realiza la compilación de TypeScript y se ejecuta la sentencia. Esta compilación solo se hace la primera vez que se ejecuta el script, hasta que no haya un cambio en el código. También se puede guardar un fichero .js (JavaScript) con la misma sentencia, y se puede ejecutar con Deno:

En este caso al ser código JavaScript no se realiza ninguna compilación.

Programación asíncrona

Uno de los objetos de Deno es acabar con los los ‘callback hells’; para ello toda sentencia asíncrona se puede utilizar con ‘await’, pero sin la necesidad de encapsulamiento dentro de una función ‘async’:

En este script podemos comprobar como las sentencias asíncronas solo necesitan utilizar ‘await’; además, nos permite presentar la siguiente característica de Deno.

Compatibilidad con API Browser

A diferencia de NodeJs, con Deno se pueden utilizar las APIs del navegador en el lado del servidor, tal y como nos muestra el script anterior utilizando fetch() para obtener un recurso desde internet.

Seguridad por defecto

Por defecto Deno no permite el acceso a ficheros, a la red o al entorno. Ésta es una clara diferencia con NodeJs y su problema de seguridad con un ecosistema tan grande donde nadie te asegura que un módulo no utiliza de forma maliciosa recursos del sistema.

Deno ejecuta los scripts en su propio sandbox, y los permisos para acceder a los diferentes recursos se proporcionan a través de ‘flags’ en su ejecución.

Por ejemplo, el script anterior necesita acceder a la red:

Importación de módulos externos

En Deno no existe un fichero package.json para el control de las dependencias utilizadas en un proyecto, sino que estos módulos se importan a través de URLs que se indican en la propia declaración. La primera vez que Deno ejecuta un programa los descarga e instala, y quedan cacheados.

En https://deno.land/std existe un repositorio con diferentes módulos ‘oficiales’. Además, se podría cargar cualquier modulo que sea accesible a través de una URL, por ejemplo:

Otra característica relacionada con la importación de módulos es que Deno da soporte a tener un ‘import map’ que sería una especie de ‘alias’ que permite acortar de forma significativa la longitud de los ‘imports’.

Modern JavaScript

Deno utiliza ESModules tanto en TypeScript como en JavaScript, a diferencia del require() de NodeJs.

También incluye soporte para los binarios .wasm de WebAssembly, lo que permite ejecutar cualquier código compilado de esta forma.

Tiene soporte para ‘workers’ que pueden ser utilizados en múltiples hilos de ejecución. Cada ‘worker0 se ejecuta en un hilo separada y dedicado en exclusiva.

Testing

Deno incorpora de forma integrada un entorno de testing para JavaSrcipt y TypeScript. Esto permite que no sea necesaria la instalación y configuración de herramientas externas como Mocha o Chai.

Otras herramientas

Además, Deno trae diferentes herramientas integradas como un debugger, un instalador de scripts, formatter, bundler, un generador de documentación y un inspector de dependencias.

Podemos consultar su información desde la propia página de Deno: https://deno.land/manual/tools

Conclusiones

Se puede afirmar que Deno ha presentado de una forma bastante clara su candidatura a disputar el trono de NodeJs. Sus decisiones de diseño son muy interesantes: la utilización de Rust, TypeScript de forma nativa, el enfoque en la seguridad… todas están enfocadas en atacar diferentes aspectos en los que NodeJs tiene margen de mejora.

Así que, en definitiva, habrá que seguir atentos a la evolución de Deno, porque la pinta que tiene es que ha venido para quedarse.