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
| Concepto | Node | Deno 2 |
|---|---|---|
| Gestor de paquetes | npm/yarn/pnpm | deno install o package.json |
| Ejecutar scripts | node app.js | deno run app.ts |
| Tests | jest/vitest | deno test |
| Linting | eslint | deno lint |
| Formateo | prettier | deno fmt |
| Compilar binario | pkg/nexe | deno 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.