<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj" -->

---
title: Friendship ended with Deno, now Node is my best friend
description: A developer recounts migrating a static site generator and client project from Deno back to Node.js, citing Node&#x27;s improved TypeScript handling, modernized...
canonical: https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Friendship ended with Deno, now Node is my best friend | daily.dev
og:description: A developer recounts migrating a static site generator and client project from Deno back to Node.js, citing Node&#x27;s improved TypeScript handling, modernized...
og:url: https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj
og:image: https://api.daily.dev/og/posts/O6SUQABLj.png
og:image:alt: Friendship ended with Deno, now Node is my best friend
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Friendship ended with Deno, now Node is my best friend

**[Lobsters](https://daily.dev/sources/lobsters)** · 5 min read · 0 upvotes · 0 comments

## Summary

A developer recounts migrating a static site generator and client project from Deno back to Node.js, citing Node's improved TypeScript handling, modernized APIs, and a 15% faster build after the switch. The piece covers package management choices (PNPM with delayed release ages to dodge supply-chain malware like Shai-Hulud, FNM over NVM), Node's refusal to strip types inside node_modules, and personal frustrations with Deno's decline — including JSR rate limiting, broken ZSH integration, and concurrency bugs — alongside broader criticism of Deno Land Inc.'s pivot toward AI and cloud products.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://dbushell.com/2026/10/03/deno-to-node>

## Questions this post answers

### Why does Node.js throw ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING when using TypeScript packages?

Node.js deliberately refuses to strip types from TypeScript files located inside node_modules, even though it supports running TypeScript directly elsewhere. This is a philosophical restriction, not a technical limitation, intended to discourage package authors from publishing TypeScript source directly to NPM rather than compiled JavaScript.

_Developers hitting type-stripping errors while publishing packages can track Node.js runtime changes like this on daily.dev._

### What settings can I use in pnpm-workspace.yaml to delay installing malicious package updates?

Setting minimumReleaseAge to 1440 minutes (one day) and trustPolicy to no-downgrade in pnpm-workspace.yaml delays picking up newly published package versions, giving time for malware like Shai-Hulud-style supply chain attacks to be reported and removed before you install them. Setting the delay to a full month caused dependency resolution issues, so one day was a practical compromise.

_Teams hardening their dependency pipeline against supply chain attacks can follow PNPM security configuration discussions on daily.dev._

### What had to change to migrate a Deno static site generator to Node.js v26?

Migrating required replacing Deno's file system API with node:fs, swapping Deno.serve for Hono's Node adapter (built on node:http), and replacing the @std/path module with node:path as a direct import swap. With Node v26.10.0, this minimal migration required surprisingly little rework and resulted in builds running 15% faster than the equivalent Deno setup.

_Developers weighing a Deno-to-Node migration can follow real-world runtime comparisons like this on daily.dev._

## Community take

How the wider developer community reacted, aggregated from 1 discussion and 34 comments across lobsters (as of 2026-10-06).

**TL;DR:** Reactions mostly share the author's relief at moving back to Node after bad experiences with alternative runtimes (Bun, Deno), while some push back that Deno's defaults and performance are still underrated and that the post's specific complaints feel thin.

**Sentiment:** 40% positive · 45% mixed · 15% skeptical

**The case for**

- Several people recount similar migrations away from Bun or Deno back to Node and found it smooth and stable.
- Node has added many conveniences (parseArgs, styleText, --env-file, node:test, fetch, glob, sqlite) that reduce the need for extra runtimes or dependencies.
- npm and pnpm now support minimum release age and disabling post-install scripts, addressing supply-chain concerns raised in the post.

**The pushback**

- One commenter argues Deno's JSX precompiling and import ergonomics are still genuinely better and that the post doesn't substantiate its claims about bugs or ZSH issues.
- Deno's permission system is seen by some as a real advantage Node still lacks, though others find it too coarse-grained to be very useful.
- A migration story about Bun's abrupt internal rewrite to Rust is cited as a trust-breaking move unrelated to Deno but reinforcing runtime-switching fatigue.

**By community**

- lobsters (mixed): Discussion splits between people validating the move back to Node with their own runtime-switching stories and others defending Deno's design choices and questioning the post's specific complaints.

**Hottest debate:** Whether Deno's distinctive features (permissions, JSX precompiling, import ergonomics) still justify using it despite the post's criticisms, versus Node having closed the gap enough to make switching back the easy choice.

**Open questions**

- Is there a good Node-compatible static site generator alternative to Lume for those currently relying on Deno-based tooling?
- Does Deno's permission system support host/IP allowlisting for outbound network access, and how does that compare to Node's newer permission model?

**Highlights**

> I’ve really been enjoying Deno recently. Its JSX bundler produces better JS than any other thanks to an innovative optimization they call precompiling. My draft blog post on that: => https://matthiasportzel.com/rendering-benchmarks There are a couple of other things. I was writing a quick script the other day and it was super nice to be able to `import "npm:foo"` without having to create a package.json or a node_modules folder. The homepage advertises its performance is much better than node or npm. I like deno.json more than package.json since the import block maps nicely to a browser importmap. None of this is super new, so maybe the author has used these features for longer than me and is bored by them. I wish this post was more substantial about what advantages node has over Deno. The author claims Node is 15% faster on his workload but there other workloads (see above link or Deno homepage for examples) where Deno is faster. I don’t know why Deno integrates with ZSH or what is broken about it; Deno supports NPM or URL imports if JSR has issues; and I’d be interested in hearing about bugs but just alluding to them isn’t interesting. The author has used Deno more than me and has linked to some of their missteps, but I’m optimistic about using it going forward.
> — [matthiasportzel on lobsters · 3 points](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my#c_jwzniz)

> I recently moved a Bun project to Node. When I picked Bun I was convinced by their built-in support for TypeScript, modern standard library including a testing framework, better performance and compatibility with the NPM ecosystem. In practice we had multiple issues with Playwright, our main dependency. Their test coverage data is just wrong. And what finally lost all my faith in the project was the infamous overnight port to Rust. No problems with Rust, I'm a huge fan, the problem is their lack of responsibility/accountability to their user base running actual software on the platform.  Thankfully I built everything with a "port to node in case of emergency" design and it paid off. Moved to Node and have not looked back.
> — [gcollazo on lobsters · 8 points, 2 comments](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my#c_lfeqxh)

> > PNPM also blocks post-install scripts. Does NPM still yolo those? [Nope.](https://github.blog/changelog/2026-06-09-upcoming-breaking-changes-for-npm-v12/) (But you have to manually upgrade npm to get the off-by-default behavior and not just a warning; npm 12 shipped too late to be included with Node 26.) > `minimumReleaseAge: 1440` [npm also has this now](https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age) although, [infuriatingly](https://ruuda.nl/2022/please-put-units-in-names), it is in units of days instead of seconds. > So if I were to TL;DR in the middle: Node got a glow-up, wow! Some other handy things node has now: - [`util.parseArgs`](https://nodejs.org/api/util.html#utilparseargsconfig) - [`util.styleText`](https://nodejs.org/api/util.html#utilstyletextformat-text-options) - [`--env-file`](https://nodejs.org/api/cli.html#--env-filefile) - [`node:test`](https://nodejs.org/api/test.html) - [`fetch`](https://nodejs.org/learn/getting-started/fetch) - [glob](https://nodejs.org/api/fs.html#fsglobsyncpattern-options) - [sqlite](https://nodejs.org/api/sqlite.html) - [.zip support](https://nodejs.org/api/zlib.html#class-zlibzipfile) (still very new/experimental) For most applications, most of the time, I don't need any dependencies at all, or at most just `express`. It's pretty nice.
> — [bakkot on lobsters · 1 points, 1 comments](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my#c_y14ixs)

> I had this phase, a few years ago, where I really was into JS build/dev tooling. The whole ESM/CJS, TypeScript support and slow dev times, got me into a lot of fun stuff like Vite, ESBuild, Deno, Turbopack, CSS tooling. And it's all fun but it also ended up not really improving anything.  I remember trying out Bun and thinking wow I took Node's stability for granted. And thus returned to following whatever the team liked the most, hoping that Deno would make a bigger splash. And then around Node v20-22...Node included some really nice things! And the need for other (fast-moving) runtimes kinda dwindled away. I'm pretty happy with JS tooling these days, it can still be a lot, but with the experience gained I feel like I can communicate very well why a project might not need a tool. Still Deno holds a really nice place(it just includes so many great defaults!), and maybe OSS Deno can thrive in a similar way Biome or Servo does.
> — [zetashift on lobsters · 3 points](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my#c_ccay3h)

> Unless Node adds Deno's permission system, I see no reason to switch.
> — [KevinMGranger on lobsters · 1 points, 2 comments](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my#c_wgtd9e)

**Source threads**

- [lobsters](https://lobste.rs/s/a9kwzv/friendship_ended_with_deno_now_node_is_my) · 47 points · 34 comments

## Similar posts on daily.dev

- [I wish Deno would keep doing what it does best](https://daily.dev/posts/i-wish-deno-would-keep-doing-what-it-does-best-o8i7dtahx) · Lobsters · 3 upvotes · 0 comments
- [When Deno or Bun is a Better Solution than Node.js – Frontend Masters Blog](https://daily.dev/posts/when-deno-or-bun-is-a-better-solution-than-node-js-frontend-masters-blog-sg2hmfhep) · Frontend Masters · 1 upvotes · 0 comments
- [Node.js vs Bun vs Deno: Which JavaScript Runtime Should You Choose in 2026?](https://daily.dev/posts/node-js-vs-bun-vs-deno-which-javascript-runtime-should-you-choose-in-2026--cdpzqgies) · Medium · 2 upvotes · 0 comments
- [404 Deno CEO not found](https://daily.dev/posts/404-deno-ceo-not-found-onnca8fku) · Hacker News · 22 upvotes · 1 comments

---

Tags: [#javascript](https://daily.dev/tags/javascript), [#nodejs](https://daily.dev/tags/nodejs), [#typescript](https://daily.dev/tags/typescript), [#deno](https://daily.dev/tags/deno), [#pnpm](https://daily.dev/tags/pnpm)

[View this post on daily.dev](https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Friendship ended with Deno, now Node is my best friend","url":"https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj"},"datePublished":"2026-10-05T15:10:00.577Z","dateModified":"2026-10-05T23:42:40.679Z","description":"A developer recounts migrating a static site generator and client project from Deno back to Node.js, citing Node's improved TypeScript handling, modernized...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6b6202f1aba9dafc23b904090e826937?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6b6202f1aba9dafc23b904090e826937?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Lobsters","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Lobsters","logo":"https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg","url":"https://daily.dev/sources/lobsters"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"javascript,nodejs,typescript,deno,pnpm","timeRequired":"PT5M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Lobsters","item":"https://daily.dev/sources/lobsters"},{"@type":"ListItem","position":3,"name":"Friendship ended with Deno, now Node is my best friend"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/friendship-ended-with-deno-now-node-is-my-best-friend-o6suqablj#faq","mainEntity":[{"@type":"Question","name":"Why does Node.js throw ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING when using TypeScript packages?","acceptedAnswer":{"@type":"Answer","text":"Node.js deliberately refuses to strip types from TypeScript files located inside node_modules, even though it supports running TypeScript directly elsewhere. This is a philosophical restriction, not a technical limitation, intended to discourage package authors from publishing TypeScript source directly to NPM rather than compiled JavaScript. Developers hitting type-stripping errors while publishing packages can track Node.js runtime changes like this on daily.dev."}},{"@type":"Question","name":"What settings can I use in pnpm-workspace.yaml to delay installing malicious package updates?","acceptedAnswer":{"@type":"Answer","text":"Setting minimumReleaseAge to 1440 minutes (one day) and trustPolicy to no-downgrade in pnpm-workspace.yaml delays picking up newly published package versions, giving time for malware like Shai-Hulud-style supply chain attacks to be reported and removed before you install them. Setting the delay to a full month caused dependency resolution issues, so one day was a practical compromise. Teams hardening their dependency pipeline against supply chain attacks can follow PNPM security configuration discussions on daily.dev."}},{"@type":"Question","name":"What had to change to migrate a Deno static site generator to Node.js v26?","acceptedAnswer":{"@type":"Answer","text":"Migrating required replacing Deno's file system API with node:fs, swapping Deno.serve for Hono's Node adapter (built on node:http), and replacing the @std/path module with node:path as a direct import swap. With Node v26.10.0, this minimal migration required surprisingly little rework and resulted in builds running 15% faster than the equivalent Deno setup. Developers weighing a Deno-to-Node migration can follow real-world runtime comparisons like this on daily.dev."}}]}
```

