Cómo crear tu primera aplicación con Deno: guía paso a paso

He estado probando Deno y encontré que es una excelente opción si buscas un entorno de ejecución para JavaScript y TypeScript. Viene con módulos integrados que facilitan muchísimo desarrollar aplicaciones sin tener que empezar todo desde cero.
¿Por qué Deno?
Deno tiene una gran ventaja sobre Node: no depende del sistema de módulos CommonJS ni del registro de npm. En su lugar, usa el sistema de módulos ES (ES modules), lo que hace que compartir y distribuir módulos sea muy sencillo. Incluso puedes cargar módulos directamente desde URLs sin preocuparte por conflictos de versiones o gestión de paquetes.
Por defecto, los scripts de Deno se ejecutan en un entorno aislado (sandbox) sin acceso a recursos sensibles como el sistema de archivos o la red. Para dar acceso a estos recursos, debes otorgar permisos de forma explícita mediante una serie de flags. Por ejemplo, si quieres que tu script acceda a la red, debes usar el flag --allow-net.
Me gusta Deno porque es seguro, directo y ofrece herramientas de desarrollo integradas muy útiles para facilitarte el trabajo. Incluye un formateador de código (deno fmt), un linter (deno lint), un ejecutor de pruebas (deno test) y el servidor de lenguaje para tu editor. Además, cuenta con módulos estándar revisados que garantizan un funcionamiento óptimo en Deno, e incluso puedes usar módulos existentes de npm.
Lee más sobre Permisos
Creo que la mejor forma de probarlo es construyendo algo con Deno.
Instalar Deno en tu sistema
El proceso de instalación es muy directo. Como usuario de Windows, solo necesité ejecutar el siguiente comando en PowerShell:
irm https://deno.land/install.ps1 | iex)Si usas otro sistema operativo, revisa el sitio web oficial para consultar las instrucciones de instalación.
Una vez que termine la instalación, puedes ejecutar deno --help en la terminal para ver la lista completa de opciones:
C:\Users\dany.paredes>deno --help
deno 1.31.3
A modern JavaScript and TypeScript runtime
Docs: https://deno.land/manual@v1.31.3
Modules: https://deno.land/std/ https://deno.land/x/
Bugs: https://github.com/denoland/deno/issues
To start the REPL:
deno
To execute a script:
deno run https://deno.land/std/examples/welcome.ts
To evaluate code in the shell:
deno eval "console.log(30933 + 404)"
USAGE:IDE para Deno
Voy a usar mi IDE favorito, WebStorm, porque tiene soporte para Deno mediante una extensión, aunque también puedes usar VS Code sin problemas.
Una excelente alternativa es Netzo. Es mucho más que un IDE web para Deno: es una plataforma estupenda para crear y desplegar aplicaciones si quieres darle una oportunidad.

Ejemplo de un servidor web
Antes de construir una aplicación, quiero crear un ejemplo clásico de servidor web tipo "hola mundo" para desarrolladores de Node o Deno. La idea es ver lo fácil que resulta importar librerías y usar objetos nativos como Response del API Fetch.
Crea un archivo nuevo, por ejemplo mywebserver.ts, y pega el siguiente código:
import { serve } from "https://deno.land/std@0.182.0/http/server.ts"
serve(() => new Response("Hello World"), { port: 8800 })Este código importa la función serve de la librería estándar de Deno, crea una instancia del servidor y la configura para escuchar en el puerto 8800. Cuando recibe una petición, el objeto Response del API Fetch devuelve una respuesta "Hello World" al cliente.
Como mencioné antes, para ejecutar el servidor web debemos autorizar el acceso a la red, ya que depende del servidor de la librería.
Cuando ejecutas el comando deno run mywebserver.ts, Deno te pedirá que concedas los permisos requeridos:
deno run .\mywebserver.ts
┌ ⚠️ Deno requests net access to "0.0.0.0:8800".
├ Requested by `Deno.listen()` API
├ Run again with --allow-net to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all net permissions) >Autoriza todos los permisos para nuestro servidor web seleccionando la opción A.
¡Listo! Nuestro servidor web ya está respondiendo con el mensaje "Hello World", algo muy práctico para armar una API simulada (mock).
Release notes: https://github.com/denoland/deno/releases/tag/v1.32.2
Blog post: https://deno.com/blog/v1.32
✅ Granted all net access.
Listening on http://localhost:8000/
Actualizar a una nueva versión
Mientras probaba Deno, vi que acababan de publicar una nueva versión. Sin pensarlo dos veces, ejecuté un comando muy sencillo en la terminal para actualizarlo:
deno upgrade
Looking up latest version
Found latest version 1.32.3
Downloading https://github.com/denoland/deno/releases/download/v1.32.3/deno-x86_64-pc-windows-msvc.zip
Deno is upgrading to version 1.32.3
Upgraded successfully
Release notes: https://github.com/denoland/deno/releases/tag/v1.32.3Crear la app DenoPassword
Quiero dar un paso adelante, más allá de un simple hola mundo, y desarrollar una aplicación de terminal donde el usuario ingrese el nombre de un servicio o cuenta y la herramienta genere una contraseña para ese recurso.
En este ejercicio, vamos a aprender los siguientes puntos:
-
Importar la librería
passwordGenerator. -
Leer valores ingresados desde la terminal.
-
Usar una librería externa y mostrar los datos en pantalla.
-
Combinar múltiples archivos.
¡Manos a la obra!
Primero, crea un archivo nuevo llamado denopass.ts e importa la librería passwordGenerator. Luego, agrega dos funciones: createPassword y getRandomPasswordLength.
-
La función
createPasswordrecibe el nombre de un dominio o cuenta y genera una contraseña. -
La función
getRandomPasswordLengthgenera un número aleatorio cuando el nombre del dominio es corto.
El código final debería verse así:
import { passwordGenerator } from "https://deno.land/x/password_generator/mod.ts";
export function createPassword(accountName: string): string {
const passwordLength = accountName.length > 8 ? accountName.length : getRandomPasswordLength();
return passwordGenerator("*", passwordLength);
}
export function getRandomPasswordLength(): number {
const min = 5;
const max = 15;
return Math.floor(Math.random() * (max - min + 1)) + min;
}Perfecto, el siguiente paso es crear el archivo principal o punto de entrada, donde interactuamos con el usuario, pedimos datos y mostramos los resultados.
Crea un archivo llamado main.ts e importa la función createPassword desde el archivo denopass.ts.
Dentro de main.ts vamos a usar métodos habituales como console.log, console.clear y prompt:
-
Para limpiar la terminal, usamos
console.clear(). -
Usamos
console.log('Welcome to DenoPass')para mostrar un mensaje de bienvenida. -
Usamos
promptpara solicitar el nombre de la cuenta al usuario. -
Si el nombre de la cuenta está vacío, usamos
Deno.exit(1)para terminar la aplicación. -
Generamos una contraseña pasando
accountNamea la funcióncreatePassword. -
Usamos
console.logpara mostrar la contraseña generada en la terminal.
La versión final del código debe verse así:
import { createPassword } from "./denopass.ts";
console.clear();
console.log("Welcome to DenoPass");
const accountName = prompt(
"Please enter the name of the account or domain for which you want to generate a password"
);
if (!accountName) {
console.error("Account or domain name cannot be empty.");
Deno.exit(1);
}
const accountPassword = createPassword(accountName);
console.log(`The password for ${accountName} is ${accountPassword}`);Ahora, abre la terminal y ve al directorio donde guardaste main.ts. Luego, ejecuta la aplicación con deno run main.ts:
deno run main.tsAl ejecutar main.ts, la aplicación le pide al usuario que ingrese el nombre deseado y genera una contraseña segura y aleatoria. Una vez terminado el proceso, la contraseña aparece directamente en la terminal.
¡Listo! Ya tenemos nuestro generador de contraseñas funcionando.

Empaquetar mi aplicación
En Deno tienes la posibilidad de combinar varios archivos en uno solo usando el comando bundle.
Por ejemplo, si quieres empaquetar main.ts y denopass.ts en un único archivo, puedes ejecutar el siguiente comando:
PS C:\Users\dany.paredes\Desktop\code\hello_deno> deno bundle .\main.ts zuperDeno.ts
Emit "zuperDeno.ts" (6.49KB)
PS C:\Users\dany.paredes\Desktop\code\hello_deno> deno bundle .\main.ts zuperDeno.tsSe generará un archivo llamado zuperDeno.ts con el código combinado de main.ts y denopass.ts.
¿Te imaginas lo genial que sería transformar nuestra aplicación de terminal en una API? Suena como un desafío interesante, así que vamos a construirla.
Convertirla en una API
El último paso es transformar el cliente del generador de contraseñas en una API. Con Deno este proceso es muy directo, ya que podemos usar el módulo HTTP integrado para levantar un servidor y gestionar las peticiones entrantes.
Para comenzar, creamos un archivo nuevo llamado passwordApi.ts. Dentro de este archivo, importamos la función createPassword desde denopass.ts.
Para configurar el servidor HTTP usamos serve(), tal como hicimos al inicio del artículo: una función que escucha las peticiones entrantes y genera contraseñas a partir de los parámetros de la solicitud.
Configuramos el servidor HTTP para escuchar en el puerto 8800. Cuando recibe una petición GET, verifica si la URL coincide con el patrón /password/<accountName>. Si coincide, llama a la función para generar una contraseña usando la variable <accountName>. Si la URL no coincide con el patrón, devuelve un error 404 "Not Found".
El código final se ve así:
import { createPassword } from "./denopass.ts";
import { serve } from "https://deno.land/std@0.96.0/http/server.ts";
const PORT = 8800;
const server = serve({ port: PORT });
console.log(`Listening on port ${PORT}...`);
for await (const req of server) {
const { method, url } = req;
if (method !== "GET") {
req.respond({ status: 405, body: "Method Not Allowed" });
continue;
}
const match = url.match(/^\/password\/(.+)$/);
if (match) {
const accountName = match[1];
const password = createPassword(accountName);
req.respond({ body: password });
} else {
req.respond({ status: 404, body: "Not Found" });
}
}Ejecuta el servidor con el comando deno run --allow-net passwordApi.ts.
Toma en cuenta que debes otorgar permisos de red usando el flag
--allow-net, ya que el servidor escucha en un puerto de red.
Una vez que el servidor esté activo, entra desde el navegador a http://localhost:8800/password/lebron para obtener una contraseña generada para la cuenta llamada lebron en la respuesta del servidor.

¡Listo! Aun así, para simplificar todavía más el flujo de trabajo, vale la pena probar herramientas como Netzo.
Netzo: una plataforma para crear y desplegar aplicaciones Deno con facilidad
Hace poco estuve revisando Netzo, una plataforma en la nube que ofrece un entorno completo para crear y publicar aplicaciones Deno. Con Netzo puedes armar tus propios front-ends y back-ends usando JavaScript o TypeScript puro, sin tener que preocuparte por la gestión de servidores ni la infraestructura.
Permite construir aplicaciones, APIs y flujos de trabajo con tus frameworks favoritos de Deno, o comenzar desde plantillas prediseñadas. Además, Netzo incluye funciones para compartir proyectos con facilidad y desplegar sin archivos de configuración, haciendo el desarrollo mucho más ágil y directo.
Desarrollar una aplicación similar en Netzo resulta muy práctico, ya que simplifica tanto la escritura de código como la publicación de proyectos en Deno.
Si quieres conocer más sobre lo que ofrece Netzo y probar su entorno, puedes visitar https://netzo.io.
Conclusión
¡Buen trabajo! En este artículo vimos los aspectos básicos de Deno: cómo instalarlo en tu computadora y cómo ejecutar tu primer programa. También pudimos ver en qué se diferencia de Node.js y los beneficios prácticos que aporta a nuestros proyectos.
Deno cuenta con una ventaja enorme al momento de integrar librerías externas directamente mediante URLs. Creamos un generador de contraseñas con la librería passwordGenerator para comprobar lo sencillo que es transformar una herramienta de terminal en una API web funcional con la ayuda de Deno.
Para cerrar, espero que esta pequeña introducción te anime a seguir explorando Deno en tus propios desarrollos, sacando partido de su enfoque en seguridad, simplicidad y una experiencia de desarrollo limpia y moderna.
- Código fuente: https://github.com/danywalls/hello_deno
Imagen por https://twitter.com/dcdunkan
Artículos Relacionados
Compartir este artículo
Si esta guía te resultó útil, compártela con tu equipo o con otros desarrolladores.
Software real. Lecciones reales.
Comparto las lecciones que aprendí por las malas, para que puedas evitarlas o estar preparado cuando ocurran.
Únete a 13,800+ desarrolladores y lectores.
Cero spam. Cancela tu suscripción en cualquier momento.