Deno 2.0: Node compatibility without losing identity
Actualizado: 2026-05-03
Deno 2.0 shipped in October 2024, and five months later it’s a good time to take stock. Version 2.0 looks nothing like the original 2018 Deno, which was born as an explicit rejection of many Node.js decisions. What Ryan Dahl and his team have done is probably the most pragmatic move they could: accept that npm won, integrate with the existing ecosystem, and stop fighting package.json and node_modules. Without losing, of course, the pieces that have always made Deno different.
Key takeaways
- Deno 2 understands
package.json, createsnode_modules, and works with pnpm: the barrier to existing projects has fallen drastically. - The permissions model remains unique: sandbox by default, no network or disk without explicit flags.
- Native TypeScript without tsc or tsx remains a real advantage over Node.
- Node compatibility is better than ever but not total: large frameworks (Next.js, NestJS) remain imperfect.
- The 2025 JavaScript ecosystem has three serious runtimes: Node (mature default), Bun (raw speed), Deno (security and DX).
What 2.0 actually brings
Node compatibility. Deno 2 supports the npm: protocol, but now also understands package.json, creates and reads node_modules, and works with pnpm. deno install in an existing Node project works. deno run script.js on a file using require('express') works. A year ago this was unthinkable.
Native workspaces. Deno 2.0 natively supports monorepos with multiple packages, sharing configuration and dependencies.
JSR. The official registry Deno and TypeScript are pushing as a modern npm alternative. Technically attractive, but adoption is still small.
Closed Node API gaps. process.env, parts of fs, and better worker support.
What problem it solves in practice
The problem Deno 2 solves is specific: the barrier to trying Deno in an existing project was too high. Today the experiment is to open an existing project, run deno run main.ts, and see what happens.
Deno 1.x was an all-or-nothing bet: either rewrite in its style, or stay in Node. Deno 2.0 is a possible gradual upgrade: use Deno to run, test, lint, and format your Node project, keeping package.json as source of truth.
Where it still shines
The permissions model: Deno runs code in a sandbox by default. A script cannot read files, open sockets, or execute subcommands without explicit flags (--allow-read, --allow-net, etc.). For running third-party code, this is real value.
Developer experience: deno fmt, deno lint, deno test, deno bench, and deno task come integrated, with consistent output, no configuration.
Standard Web APIs work as in the browser: fetch, Request, Response, URL, crypto.subtle, WebSocket. For writing code running on both server and edge, a real advantage.
Native TypeScript: Deno executes TypeScript without prior compilation, no tsc, no tsx, no configuration.
Where it still falls short
Node compatibility is better but not total. Some popular packages still don’t work, especially those with native binaries. Puppeteer and Playwright work but with asterisks.
Large frameworks (Next.js, NestJS) expect a specific process lifecycle, and Deno 2.0’s emulation is still imperfect. For APIs with Express, Fastify, or Hono it works well. For a complex Next.js 14, I’d stay on Node.
The community and ecosystem are smaller. Finding tutorials and Stack Overflow answers for Deno is harder than for Node.
Cold-start performance has improved but remains slightly below Bun in benchmarks.
Deno vs Bun vs Node
Three serious runtimes in the 2025 JavaScript ecosystem:
- Node: mature default, stable, full ecosystem support.
- Bun: raw speed and lightning-fast package manager. Great for development.
- Deno: security, developer experience, standard web APIs. Node compatibility in 2.0 solves the main friction.
My informal recommendation: – Small new APIs or infrastructure scripts: Deno 2. – Large services with established ecosystem: Node. – Local development with fast reload: Bun. – Any project where security against third-party code matters: Deno by default.
How to think about the decision
The question Deno 2.0 answers isn’t “is it better than Node?” but “is it worth trying in my project?”. The answer, unlike in 2022, is a qualified yes for many cases.
Deno 2.0 is humbler than Deno 1.x. It acknowledges Node is the standard and practical life passes through coexisting with its ecosystem, but it retains its own identity. A runtime has to choose between being pure or being useful, and Deno 2 has chosen useful without giving up its design principles. It’s a mature decision.