Deno

> Temas > Deno
Editar

Plataforma de ejecución de Javascript fuera del navegador, en un entorno seguro y con compatibilidad a TypeScript.

Deno es un "runtime" de Javascript y TypeScript que permite ejecutar código en estos lenguajes fuera del contexto del navegador. Por lo tanto, con Deno podemos hacer todo tipo de programas, aunque principalmente se usa para programación del lado del servidor, creación de servicios web y programas de consola.

Deno, al igual que NodeJS, está basado en el motor de ejecución de Javascript V8, el que viene incorporado en el navegador Chrome y además tiene una configuración para interpretar TypeScript muy potente, ya implementada de manera predeterminada, por lo que podemos escribir código TypeScript y ejecutar directamente, sin necesidad de hacer ningún paso en particular. Por supuesto, en un proyecto podemos mezclar módulos escritos con Javascript y TypeScript sin problema alguno.

Deno es una apuesta del mismo creador de NodeJS, para hacer una nueva plataforma de ejecución de Javascript, solucionando todos los problemas históricos de la plataforma NodeJS, por lo que muchos desarrolladores lo han acogido de muy buena manera. Es sin embargo una plataforma relativamente joven, lanzada en 2018, pero que aún tiene camino que recorrer, sobre todo para alcanzar la estela de NodeJS en lo que respecta a paquetes disponibles. No obstante, tiene un futuro muy prometedor.

Más información:

Diferencias entre Deno y NodeJS

Para poder explicar mejor qué es Deno, lo mejor es centrarnos en las diferencias fundamentales con la plataforma Node.

Es más seguro: Cuando ejecutas un programa con Node éste tiene todos permisos para hacer cualquier cosa en tu equipo. Esta situación puede ser problemática porque en la práctica un programa escrito en Node te podría borrar todos los archivos de tu ordenador si quisiera, con lo que un software malicioso podría causar problemas. A veces ha ocurrido que se ha secuestrado un paquete de npm y les han colado una actualización con intención de causar daño y como consecuencia muchos programas se han infectado. Con Deno en cambio el desarrollador es capaz de otorgar solamente los permisos que sean absolutamente necesarios, como conectar por http, escribir solamente en unas carpetas determinadas, etc.

No usa npm: Deno no tiene un gestor de dependencias como tiene NodeJS en npm. En realidad no lo necesita. Todas las dependencias las instala a través de la URL donde está la dependencia en si, por lo que es capaz de funcionar sin depender de un repositorio centralizado. El propio Deno usa un manejador de paquetes interno, que funciona de manera transparente para el desarrollador, que se encarga de optimizar el funcionamiento de las dependencias, descargar o cachear sus archivos, gestionar las versiones, etc. Con todo, consigue aportar sencillez y agilidad para los desarrolladores.

Usa los módulos ES6: en lugar de CommonJS como usa NodeJS, esto lo hace mucho más cercano al estándar de Javascript y permite que el desarrollo de Deno sea más similar todavía a las costumbres de desarrollo que se tienen en los navegadores.

Funciona con promesas: para gestionar los procesos asíncronos, Deno usa promesas en lugar de funciones callback, por lo que el código que se puede realizar es más legible. Además puedes usar await en cualquier punto del código, a cualquier nivel, sin necesidad de declarar una función async, lo que facilita mucho la escritura de programas asíncronos como si fueran perfectamente secuenciales.

Ofrece más soporte a las API web: dispone de manera predeterminada de librerías o APIs del navegador, como fetch, que no están disponibles en Node.

Editar

Instalación de Deno

No existe un instalador de Deno, sino que lo podemos instalar directamente por línea de comandos.

En la página de Deno tienes los comandos para la instalación en todos los sistemas operativos.

Lo más sencillo es usar gestores de paquetes como Homebrew o Chocolatey o directamente descargar el .sh para instalar con Curl y ejecutarlo si estás en Linux.

Una vez instalado podemos comprobar si está funcionando correctamente en el sistema con el comando:

deno --version

Nos informará la versión de Deno que está funcionando, junto con la del motor V8 (de Chrome) y la de TypeScript. La salida será algo parecido a esto:

deno 1.4.6
v8 8.7.220.3
typescript 4.0.3

Editar

Crear un archivo con código y ejecutarlo con Deno

Podemos escribir programas en Deno tanto en archivos .ts como en archivos .js, ya que Deno es capaz de interpretar y ejecutar ambos lenguajes.

Los archivos los podemos colocar en cualquier ruta del disco duro. Por ejemplo, este podría ser el código de un archivo llamado helloworld.ts:

const message = 'Hola mundo'
console.log(message);

Para ejecutarlo lanzamos el comando "deno run" seguido del nombre del archivo que queramos ejecutar, por ejemplo:

deno run helloworld.ts

Editar

Flags de seguridad para la ejecución

Como se ha comentado, Deno ofrece un esquema de seguridad muy útil, que permite limitar las capacidades de los programas que se ejecutan en Deno. De manera predeterminada, los permisos de ejecución son los mínimos posibles, de modo que los programas se puedan correr sin peligro de realizar ninguna acción potencialmente peligrosa.

Por ejemplo, si tenemos este código que hace una soliticud http contra un servidor en un archivo llamado do-fetch.ts:

const response = await fetch('https://jsonplaceholder.typicode.com/todos/1')
const json = await response.json();
console.log(json);

Y lo intentamos ejecutar sin activar ningún flag de seguridad, tal cual:

deno run do-fetch.ts

Obtendremos una respuesta que nos informa que no es posible ejecutar el archivo por permiso denegado:

error: Uncaught PermissionDenied: network access to "https://jsonplaceholder.typicode.com/todos/1", run again with the --allow-net flag

Esto se soluciona, como el mensaje indica, haciendo uso de la bandera --allow-net, con un comando como este:

deno run --allow-net do-fetch.ts

En la documentación de Deno encuentras la lista de permisos que puedes otorgar:

  • --allow-all: Permite todos los permisos.
  • --allow-env: Permite acceso a las variables de entorno.
  • --allow-hrtime: Permite medición de tiempo de alta precisión.
  • --allow-net: Permite el acceso a la red
  • --allow-plugin: Permite la carga de plugins
  • --allow-read: Permite la lectura al sistema de ficheros, pudiendo indicar qué carpeta se desea otorgar permiso, por ejemplo --allow-read=/etc
  • --allow-run: Permite la ejecución de procesos
  • --allow-write: Permite la escritura en el sistema de ficheros, que también permite discriminar por carpeta.

Editar

Importado de dependencias de terceros en Deno

La forma de importar dependencias en Deno es por URL. Cuando hacemos el import de una dependencia de terceros usamos la URL, en lugar del nombre del package como se hace en NodeJS.

Esto quiere decir que puedes usar cualquier dominio para obtener el código de una librería o framework. Puedes por tanto obtener código de tu propio dominio, de herramientas como Github Packages, desde un CDN, etc.

Por ejemplo, así obtenemos la dependencia "Application" del framework Oak, que se obtiene directamente de la URL del repostorio en deno.land.

import { Application } from "https://deno.land/x/oak/mod.ts";

Como decimos, las dependencias de terceros podrían alojarse en cualquier servidor, pero el propio Deno ofrece el hosting para scripts disponibles para este runtime, de modo que puedes hacerlos disponibles para la comunidad a través de la propia página oficial de Deno. Por lo tanto, un buen lugar para buscar librerías de terceros sería la página de Deno, donde existe una sección específica donde se pueden buscar las que están registradas: https://deno.land/x

La manera de publicar dependencias en Deno.land es por medio del propio Github, usando un tag. De este modo, cuando creas un tag en Github determinado, el propio sitio de Deno actualiza la dependencia que tiene alojada, creando la nueva versión y poniéndola a disposición de los desarrolladores.

Editar

Módulos estándar de Deno

También muy importante en la plataforma Deno son los módulos estándar o "Standard Library". Básicamente son todos los módulos que se encuentran disponibles en Deno para cualquier programa, sin necesidad de dependencias de terceros.

Estas librerías no obstante se necesitan importar como cualquier otro módulo en el lugar donde se necesiten. Para importarlos usamos la misma estrategia que las librerías de terceros, es decir, usamos la URL. Esa URL depende de una versión en concreto y podrá tener una forma como esta:

import { copy } from 'https://deno.land/std@0.76.0/fs/copy.ts';

copy("archivo-origen.csv", "archivo-destino.csv");

El uso de la versión es muy importante en Deno y se debe evitar el usar una librería estándar sin indicar la versión para evitar que cambie la librería que estemos importando y por tanto dejen de funcionar los programas.

Se pueden consultar las libererías estándar en https://deno.land/std. Aquí encontraremos el listado de librerías, con acceso a la documentación y al código fuente de cada módulo.

Editar

Módulos de terceros

Además de los módulos estándar de Deno, que están alojados en "denoland/deno", desde un programa podemos importar módulos de terceros que estén en múltiples fuentes.

En realidad gracias a Deno y a que no usa un gestor de paquetes como npm, puedes importar código que esté en cualquier lugar de la web, como un repositorio GitHub, en servicios de CDN como jspm.io o jsDelivr. En realidad podemos tener nuestro propio servidor de ficheros estáticos que podría estar realizando las veces de repositorio de módulos Deno, simplemente con que este servidor web esté conectado a Internet.

Editar

¿Quieres añadir algo sobre Deno?

Crea artículos, recursos o comparte información sobre Deno

Crear un bloque

Deno

Temas relacionados

Preguntas y respuestas de Deno

Se han recibido 1 faqs en Deno

Hacer una pregunta