Deno Became the Thing It Promised to Kill

A Node.js error after a version bump turned out not to be a bug — since 2.8.0, Deno ships Node.js as a first-class citizen by default, and the landing page now sells Node compatibility outright. De-no is No-de reversed, and it just did a 180 into the thing it was built to escape. Why that broke the promise I trusted it for, why I feel like a fool for evangelizing it — and why I'm staying for now, but already hoping for an alternative.

This week after upgrading Deno version for one of my projects, I realized that it was giving a Node.js error. I first assumed this was a bug and Deno was failing to exclude Node.js types leaking from a package.

So I tried to isolate the issue in order to open a bug report, and realized that the issue was happening at version +2.8.0. Soon I realized this was intentional, De-no which is reverse of No-de even in the name, was doing a 180 and including full Node.js support. Not just compatibility with Node.js packages, it was making Node.js first class citizen within Deno.

Then I realized landing page for Deno was redesigned to appeal to Node.js users, and was all about Node.js compatibility.

I opened an issue anyway, talking about why we can't opt-out of this: github.com/denoland/deno/issues/35821

And I have learned this change was here to stay. I have learned that Deno has broken the contract/promise to its userbase.

Deno has betrayed its own purpose, its own reason to exist.

I feel like a fool for trusting Deno, and for writing about and supporting it online.

Because I used to keep talking about how it's cleaner, how it doesn't sacrifice everything else for Node.js compatibility. I used to praise how Deno no longer gives CommonJS any attention. I would talk about how Bun just inherits the mess of Node.js, and I'd call it "just a fast Node.js."

I used to say, "I don't want a faster Node.js, I want Deno"

I have even written an article for supporting Deno: naddr1qvzqqqr4gupzq3vrtsm0g8vhn0yp9xps7t6ajftz756r6mldm4hnp2nefqrnpunwqq2nwkzl23ckvmzrdpprgemdvepryknh2ym9w5mvxuz

This whole shift feels like it should have been a different project, instead of using Deno's name to just create another Node.js runtime.

Seeing Node.js stuff now repulses me. It feels like a legacy relic that should have died years ago.

I mean, I would have accepted it if it were just "We'll inject Node.js stuff for now for compat, so you can use existing Node.js packages in your Deno applications, but DON'T WORRY we're actively working on a better solution, to GET RID OF it". But now the landing doubles down on node_modules, package.json, CommonJS🤢, tsconfig.json, npm, node.

I really do use Deno everywhere:

  • Quick scripting? Just create TypeScript files with a Deno shebang. Or just quickly open the terminal, write deno, import anything you want, and try out whatever you feel like directly.
  • GUI apps? Deno + jsr:@webview/webview, then just compile and package it. I even used the libadwaita package for Deno once. I think there's now deno desktop, which is even better (I guess — haven't tried it).
  • Web? Just use raw Deno to serve endpoints, bundle the JS, raw-import the JS and HTML, and serve them.
  • The @std packages cover almost everything. When I need something, I look at the existing @std packages and it's there. For most projects, just @noble and @std are enough.
  • Want to implement plugin support for your app? Just use Worker(s) with Deno permissions. Great. (It's kind of unstable right now and leaks data. It allows reads via imports, but it's great.) The plugin dev can even use WASM internally, and you don't even have to know about it.
  • I even thought about making my own DE with Deno. The UI processes only, I mean.

All clean, modern...

But now Node.js is creeping in as a first-class citizen, and that doesn't make me happy. Still, there's no alternative runtime. Deno is still the best. So I'll just stick around.

I wish Deno stayed stubborn, and gatekept its vision better. Project is not even 10 years old.

Now I'm just hoping for an alternative to exist. Same reason I switched to Deno will be the same reason why I'm switching away from it.