Hello World- Deno 1.0 [Articulo de 2020]
Published: 2023-07-17 07:07:05

En este articulo solo haremos una breve introducción a Deno, pero les recomendamos el articulo de [**David Else**](https://blog.logrocket.com/author/davidelse/) que pueden encontrar [**aquí**](https://blog.logrocket.com/deno-1-0-what-you-need-to-know/), el articulo de [**Aral Roca**](https://dev.to/aralroca) que les dejamos [**aquí**](https://dev.to/aralroca/learn-deno-chat-app-37f0) y de la documentación de [**Deno**](https://deno.land/)**.**

Un poco de historia
===================

Deno fue anunciado en la JSConf EU del 2018 por [**Ryan Dahl**](https://tinyclouds.org/) quien fue la persona la cual inicio el proyecto [**Node**](https://nodejs.org/es/) hace ya casi 11 años.  
En la JSConf Ryan Dahl nos contó lo que seria el proyecto Deno en el cual estaba trabajando, a través de su charla **“**[**10 Things I Regret About Node.js**](https://www.youtube.com/watch?v=M3BM9TB-8yA)**”** donde podemos resaltar los siguientes puntos:

*   Lenguajes dinámicos:Estos son fabulosos para ciertas cosas, sin embargo, en un servidor uno desearía que las cosas fueran estáticas.
*   Seguridad: Node puede acceder a todas las funciones del sistema sin restricción alguna y a funciones de la red. Esto es principalmente peligroso al momento de instalar paquetes desconocidos a través de npm
*   API asíncronas: Las promesas fueron agregadas en 2009 y eliminadas en 2010, esto provoca que muchas librerías tengan código obsoleto en su núcleo.
*   El sistema de compilación: Anteriormente cuando escribías o tenias un complemento de Node, que no son nadamas que módulos nativos de Node escritos en C o C++, donde tenias que correrlos en tu maquina primero, para que una vez compilados se utilizara una herramienta como _node-gyp_ para poder acceder a los datos de esta, lo cual se volvía un verdadero fastidio.  
    La compatibilidad de JSON entre Node y python se vuelve verdaderamente tedioso, por todo el diseño adicional que tiene Node.
*   Node modules y package.json: Aqui el principal problema es que nuestros modulos no son compatibles con los navegadores, por lo que no podemos tener una aplicacion uniforme.

¿Que es Deno y como trabaja?
============================

Deno es un entorno de ejecución de javascript y de typescript, al igual que su entorno hermano Node usa el motor V8 como núcleo para compilar javascript. Otra gran diferencia entre estos dos entornos es el lenguaje con el cual fueron escritos, Siendo este escrito en rust, y _Node_ en C y C++  
Este asume el papel tanto de entorno de ejecución como el de administrador de paquetes, haciendo innecesaria una segunda instalación de algún distribuidor como seria npm.

Este busca ser un entorno de scripting productivo y seguro, buscando enfatizar en la arquitectura basada en eventos.  
También nos proporciona un núcleo de utilidades síncronas y asíncronas, donde puede ser usado para crear servidores web, realizar cálculos científicos, entre otras cosas.

Instalación
===========

Tenemos varias formas de instalación, las cuales podemos ver con mas detalle en la [**documentación**](https://deno.land/).

*   Shell  
    `curl -fsSL https://deno.land/x/install/install.sh | sh`
*   PowerShell  
    `iwr https://deno.land/x/install/install.ps1 -useb | iex`
*   Homebrew (MacOS y/o Linux)  
    `brew install deno`
*   Chocolatey (Windows)  
    `choco install deno`

Para asegurarnos que todo se instalo correctamente podemos usar el siguiente comando para ver la versión de Deno que tenemos instalada.

`deno --version`

Y esto nos regresara lo siguiente:

`deno 1.0.0-rc1
v8 8.2.308  
typescript 3.8.3`

Si queremos inspeccionar el resto de comandos que tenemos a nuestra disposición podemos correr lo siguiente.

`deno help`

Y esto nos visualizara los siguientes comandos.
```bash
USAGE:  
    deno \[OPTIONS\] \[SUBCOMMAND\]  
  
OPTIONS:  
    -h, --help                     Prints help information  
    -L, --log-level <log-level>    Set log level \[possible values: debug, info\]  
    -q, --quiet                    Suppress diagnostic output  
    -V, --version                  Prints version information  
  
SUBCOMMANDS:  
    bundle         Bundle module and dependencies into single file  
    cache          Cache the dependencies  
    completions    Generate shell completions  
    doc            Show documentation for a module  
    eval           Eval script  
    fmt            Format source files  
    help           Prints this message or the help of the given subcommand(s)  
    info           Show info about cache or info related to source file  
    install        Install script as an executable  
    repl           Read Eval Print Loop  
    run            Run a program given a filename or url to the module  
    test           Run tests  
    types          Print runtime TypeScript declarations  
    upgrade        Upgrade deno executable to newest version  
  
ENVIRONMENT VARIABLES:  
    DENO\_DIR             Set deno's base directory (defaults to $HOME/.deno)  
    DENO\_INSTALL\_ROOT    Set deno install's output directory  
                         (defaults to $HOME/.deno/bin)  
    NO\_COLOR             Set to disable color  
    HTTP\_PROXY           Proxy address for HTTP requests  
                         (module downloads, fetch)  
    HTTPS\_PROXY          Same but for HTTPS
```

Hello world
===========

Como lo hemos estado diciendo durante todo el articulo, Deno nació para poder mejorar muchas de las “malas practicas” que Node venia arrastrando desde hace años por ser un proyecto demasiado grande, que difícilmente podía reestructurar todo su núcleo.  
Sin embargo ya desde un inicio podemos ver algunos cambios a la hora de correr un programa desde este entorno.

Ahora para crear nuestro hello world podemos hacer uso de un archivo de extensión javascript o de uno de extensión de typescript y Deno se encargara de correr ambos automáticamente.

_hello.ts_

`console.log('Hello world from Deno');`

Lo que tenemos que hacer para poder correr nuestro archivo es usar el siguiente comando.

`deno run hello.ts`

En el caso de nuestro archivo .ts Deno se encargara internamente de compilarlo y correrlo en nuestro programa, ya que este viene con configuraciones iniciales que nos permitirá probar typescript desde un inicio, pero también nos brinda la posibilidad de crear un archivo de configuración con el cual podamos adaptar typescript a nuestro proyecto.

Cabe mencionar que Deno trata de seguir estándares tanto como es posible, por lo que podremos usar fetch, Window, Worker, entre otros. Nuestro código debe de ser compatible tanto con Deno como con el navegador.

Tambien nos permite correr programas remotamente, como viene explicado en la documentación, por lo que otra manera de correr nuestro hello world es de la siguiente manera.

`deno run https://deno.land/std/examples/welcome.ts`

Serve an index.html
===================

En esta parte del post uso un ejemplo de [**Aral Roca**](https://dev.to/aralroca) por lo que los invito a darse una vuelta por su [**articulo**.](https://dev.to/aralroca/learn-deno-chat-app-37f0)

Deno tiene su propia librería y para usarla debemos de importar directamente la url de esta en nuestro código como lo veremos en unos momentos.  
Lo primero que tenemos que hacer es crear nuestro archivo html y el archivo que se encargara de levantar nuestro servidor, este puede ser .ts o .js

_index.html_
```html
<!DOCTYPE html>  
<html lang="en">  
  <head>  
    <meta name="viewport" content="width=device-width, initial-scale=1" />  
    <meta charset="utf-8" />  
    <title>Example using Deno</title>  
  </head>  
  <body>index.html served correctly</body>  
</html>
```

_server.ts_

```ts
import { listenAndServe } from "https://deno.land/std/http/server.ts";  
  
listenAndServe({ port: 3000 }, async (req) => {  
  if (req.method === "GET" && req.url === "/") {  
    req.respond({  
      status: 200,  
      headers: new Headers({  
        "content-type": "text/html",  
      }),  
      body: await Deno.open("./index.html"),  
    });  
  }  
});  
  
console.log("Server running on localhost:3000");
```

Ahora hablemos de dos de las grandes mejoras que este entorno tiene.

1.  Como mencionamos al principio uno de los objetivos de Deno fue erradicar los node\_modules y el package.json ¿y como es que hace esto? simplemente permitiendo agregar la url de los paquetes que necesitemos directamente en nuestro código. La primera vez que corramos nuestro programa instalara todas las dependencias que hayamos declarado en nuestro código y las guardara en el cache para que esto no se tenga que repetir cada vez que volvamos a iniciar nuestro programa y para limpiar este cache únicamente necesitaremos usar el comando`--reload`
2.  También hablamos de los problemas de seguridad de Node los cuales eran el permitir la lectura de archivos desde cualquier punto de nuestro programa o de terceros y el acceso a la red sin ningún tipo de restricción.  
    Si tratamos de correr nuestro programa sin mas Deno nos dira lo siguiente:`Uncaught PermissionDenied: network access to "127.0.0.1:3000", run again with the --allow-net flag`. Este no nos permitirá acceder a la red ni leer archivos sin que nosotros no otorguemos los permisos para hacerlo, esto incluye también a librerías de teceros, ya que muchos CLI podían hacer muchas cosas aun sin nuestro consentimiento. Con Deno es posible únicamente otorgar permisos de lectura a determinada carpeta o archivo, por ejemplo `deno --allow-read=/etc`.  
    Para poder ver todos los permisos que podemos otorgar o denegar con Deno podemos usar el siguiente comando `deno run -h` .

Finalmente, para poder correr nuestro nuestro programa usaremos el siguiente comando.

`deno run --allow-net --allow-read server.ts`

![](https://miro.medium.com/v2/resize:fit:630/1*DE3_FfhDLdrAGoI0kyXCIQ.png)

En este caso use la bandera — reload para que se volvieran a instalar las dependencias.

![](https://miro.medium.com/v2/resize:fit:345/1*j22z1btUfuqhqHGbNL0SwA.png)

Espero que esta breve intro les motive a seguir investigando de Deno. Les dejo el link a la documentación y a algunos artículos de interés acerca del tema:

*   [Documentación de deno](https://deno.land/)
*   [Learn Deno: Chat app](https://dev.to/aralroca/learn-deno-chat-app-37f0)
*   [Deno 1.0: What you need to know](https://blog.logrocket.com/deno-1-0-what-you-need-to-know/)
*   [Deno is the new Node?](https://medium.com/lean-mind/deno-node-js-killer-718c8969770b)
*   [Forget NodeJS! Build native TypeScript applications with Deno 🦖 (WebAssembly support)](https://deepu.tech/deno-runtime-for-typescript/#webassembly-support)

Cualquier duda, sugerencia u opinión son bien recibidas en la sección de comentarios 😁  
Pueden encontrarme en [_Twitter_](https://twitter.com/ulysses_316)_,_ [_Github_](https://github.com/ulysses316)_,_ [_LinkedIn_](https://www.linkedin.com/in/ulysses316/)_,_ [_Instagram_](https://www.instagram.com/ulysses.316/)_._