Friendship ended with Deno, now Node is my best friend
💔 Friendship ended with Deno, now Node is my best friend
By David Bushell — Web Dev (UK)
It has finally happened: I am crawling back to Node.js.
After spending a month heavily utilizing Node for a SvelteKit client project, I found myself asking: When did Node actually become this good? I had been so loyal to Deno for so long that I’d practically forgotten how to use Node. Upon my return, I discovered that the modern ECMAScript sugar is fully supported and the clunky, legacy APIs have been streamlined or entirely replaced.
† Note: It doesn't look like that Oracle trademark battle is heading toward a happy ending...
📦 The Package Management Struggle
The official documentation still suggests piping a script from the internet directly into your bash shell to install NVM—a habit we simply cannot break. However, my history with NVM and NPM has been pleasant subpar.
I've since switched to Fast Node Manager (FNM) for version switching. While I prefer the bleeding edge, my clients require stability.
"The 'M' in NPM actually stands for 'malware'."
Because some of my scripts rely on specific binary names, I implemented these aliases:
alias npm = pnpm
alias npx = pnpx
(Edit: I might be remembering the time I used symlinks instead, but regardless, this works.) These aliases are a lifesaver when following installation guides that assume you're using NPM.
🛡️ Security Hardening
To mitigate the risk of malicious updates, I modified my pnpm-workspace.yaml:
minimumReleaseAge: 1440
trustPolicy: no-downgrade
I initially tried a "one month" delay to give Microsoft time to scrub reported malware, but that broke my dependency resolution. I settled for one day—just enough time for someone else to be the "canary in the coal mine" for the next Shai-Hulud attack.
🟦 TypeScript Integration
Node can now execute TypeScript without having a total meltdown. However, you still can't just publish TS packages to NPM. If you try, you'll hit this:
error: [ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING]: Stripping types is currently unsupported for files under node_modules
Why the restriction? According to the Node.js v26.10.0 docs, this is a philosophical choice. Node wants to discourage authors from publishing raw TypeScript to the registry. This means I'm forced to use whatever "churnware slop" is currently popular for bundling. (In my book, every single dotfile is just a monument to a past mistake).
🛠️ Self-Hosting & Forgejo
Since Microsoft has effectively ruined GitHub, I've moved to a self-hosted Forgejo instance. I had to tweak my PNPM trust policy specifically to allow my own internal projects.
🚀 Migrating the Website
The ultimate litmus test was moving my static site generator from Deno to Node. A few versions ago, this would have been a nightmare refactor. With Node v26.10.0, it was surprisingly trivial.
Migration Checklist
- Swap Deno file system API
node:fs - Swap
Deno.serveHono's node adapter (node:http) - Swap
@std/pathnode:path
Comparison of Changes
| Deno API | Node.js Equivalent | Effort |
|---|---|---|
Deno.readFile | node:fs | Low |
Deno.serve | node:http (via Hono) | Medium |
@std/path | node:path | Trivial |
The Result: After this minimal migration, my builds were faster (a performance gain of ). I suspect there is even more speed to be found if I dive deeper into built-in APIs.
TL;DR: Node had a massive glow-up.
📉 The Decline of Deno
I'll keep this brief because it's essentially flogging a dead horse. Deno failed the moment they let the "Silicon Valley Circus" define what success looks like. It evolved from a cutting-edge runtime into a generic startup pushing uninspiring products.
The current state of affairs:
- Mass layoffs.
- A leadership team tweeting about "vibe-coding" and AI fantasies.
- Essentially becoming a "Temu version" of Cloudflare.
The Final Straws
While Node caught up, Deno became borderline unusable due to:
- Broken ZSH integration that lasted for weeks.
- JSR's aggressive
429 (Too Many Requests)errors. - Concurrent HTTP request bugs that caused the runtime to choke.
My packages are now invisible, though old versions still linger. It's time to move on.
brew uninstall deno
Written by a human. All opinions are mine, not the result of a Large Language Model.
AI Policy: Valley Fold helps you build your website, whether you have a strict scope or just a vague idea. Let's make it happen.