← inicio

Deno 2: compatibilidad con Node y la apuesta por la interoperabilidad

Deno nació como la alternativa a Node. Deno 2 dice: “también puedes usar Node”. Es un giro radical y, creo, acertado.

Compatibilidad con npm

Puedes importar paquetes npm directamente:

import express from 'npm:express@4';

const app = express();
app.get('/', (req, res) => res.send('Hola desde Deno'));
app.listen(3000);

O usar un package.json normal:

{
  "dependencies": {
    "express": "^4.18.2",
    "lodash": "^4.17.21"
  }
}

Y luego importar con npm: specifiers. Deno lee el package.json y resuelve las dependencias igual que Node. La compatibilidad con el ecosistema npm es extensa — la mayoría de paquetes populares funcionan sin cambios — aunque no es del 100%. Algunos paquetes con bindings nativos o APIs de Node específicas pueden necesitar ajustes.

Permisos por defecto

Deno sigue siendo seguro por defecto. Para ejecutar un script que accede a red, archivos o variables de entorno, necesitas permisos explícitos:

deno run --allow-net --allow-read --allow-env app.ts

Si un script intenta acceder a algo sin permiso, falla. No hay modo --dangerous-permissive (bueno, existe deno run -A, pero no lo uses en producción).

Deno KV

Deno incluye una base de datos key-value nativa:

const kv = await Deno.openKv();

// Escribir
await kv.set(['user', 'david'], { name: 'David', city: 'Madrid' });

// Leer
const entry = await kv.get(['user', 'david']);
console.log(entry.value); // { name: "David", city: "Madrid" }

// Listar
const users = [];
for await (const entry of kv.list({ prefix: ['user'] })) {
  users.push(entry.value);
}

// Transacciones atómicas
await kv.atomic()
  .check({ key: ['user', 'david'], versionstamp: null })
  .set(['user', 'david'], { name: 'David', city: 'Burujón' })
  .commit();

Deno KV es ACID, funciona en local y en Deno Deploy sin cambiar el código.

Gestor de tareas

Deno 2 trae deno task como alternativa a los scripts de npm:

{
  "tasks": {
    "dev": "deno run --watch app.ts",
    "build": "deno compile app.ts",
    "test": "deno test --allow-all"
  }
}
deno task dev

Migration desde Node

ConceptoNodeDeno 2
Gestor de paquetesnpm/yarn/pnpmdeno install o package.json
Ejecutar scriptsnode app.jsdeno run app.ts
Testsjest/vitestdeno test
Lintingeslintdeno lint
Formateoprettierdeno fmt
Compilar binariopkg/nexedeno compile

Mi perspectiva

Deno 2 toma una decisión pragmática: en vez de pelear contra el ecosistema Node, lo abraza. Y al mismo tiempo mantiene lo que lo hace único: seguridad por defecto, TypeScript nativo, toolchain integrado.

¿Es hora de saltar de Node? Depende. Si empezaras un proyecto hoy desde cero, Deno 2 ofrece una experiencia de desarrollador más limpia. Pero si tienes un monorepo Node con años de historia, la migración no es trivial. No obstante, la compatibilidad npm hace que la transición sea posible.