Hyaika Blog

Penguin is all you need

技术

Ryan Dahl 亲手终结了 Deno——就在它 2.0 发布两周年那天

Ryan Dahl 亲手终结了 Deno——就在它 2.0 发布两周年那天

Ryan Dahl 亲手终结了 Deno——就在它 2.0 发布两周年那天

目录

  • 同一个日期,两种结局
  • 从 Node 到 Deno:一个创始人,两次离开
  • celld:兜了一圈,找到了分布式
  • Kenton Varda 的反论:锁不住,才是好生意
  • 一年、六个月、和一份「账单」
  • 我在这台服务器上,跑了 30 秒 Deno
  • 两个作品都还活着,只是都不归他管了

同一个日期,两种结局

2024 年 10 月 9 日,Ryan Dahl 发了一篇博客:《Announcing Deno 2》。标题底下写着五个作者名,口气是宣言式的——「web 开发已经变得不可控地复杂」,Deno 2 要把 JavaScript 开发重新变简单,为此它做了一件三年前绝不可能做的事:兼容 npm。

2026 年 10 月 9 日,整整两年后的同一天,他又发了一篇博客:《Deno is joining Cloudflare》。这次没有宣言,只有一句平铺直叙的「今天,整个 Deno 团队加入 Cloudflare」。

同一个日期,相隔两年,一篇是发布,一篇是告别。就这么对称地撞上了。

从 Node 到 Deno:一个创始人,两次离开

要说清楚这件事,得从 2009 年说起。那年 Ryan Dahl 在柏林的一个仓库里,用 500 行 JavaScript 写了一个 IRC 服务器,现场演示给观众看。那是 Node.js 的第一次公开亮相——「纯异步编程模型」这个词,就是那 500 行代码给他挣来的。

Node.js 后来成了服务器端 JavaScript 的事实标准。然后他亲口说:我后悔了。2018 年 6 月,他在 JSConf EU 做了一场著名的演讲,标题直白到残忍:《10 Things I Regret About Node.js》。模块系统、回调地狱、包管理器、安全模型——他当着全世界的面,数落了一遍自己 2009 年的设计决定。然后公布了新项目:Deno。「我对 Node 感到遗憾,所以我要重新做一个。」

六年过去了。Deno 2.0 最重要的新特性是什么?

兼容 npm。

它花了七年试图摆脱的东西,在 2.0 里主动请了回来。理由很实际:用户想要 Deno 的体验,又离不开现有的 JavaScript 生态。「我们希望用户在继续接入现有 JS 生态的同时,享受 Deno 的改进。」这是 Dahl 在 2.0 博客里的原话。

兜了一圈,回到了出发点。而这条弧线,在两年后又完成了一次更大的闭合。

celld:兜了一圈,找到了分布式

2026 年 8 月,Deno 团队发布了 celld——一个基于 Cloudflare Workers 编程模型的、开源的、可以自托管的分布式运行时。

Ryan Dahl 三次创业时间轴

注意这个「基于 Cloudflare Workers」。一个竞争对手,做了七年想取代 Node 的运行时,最后自己的新作品却建立在另一个平台的编程模型之上。为什么?

因为 Dahl 发现,真正难的问题根本不是运行时。「Deno 改善了写 JavaScript 的体验,但我们没有从根本上改变开发者要围绕运行时装配的东西。」他说。真正难的问题是分布式的:计算要分发、状态要协调、存储要管理、要自动伸缩。

然后他读到了 Cloudflare 的 Durable Objects。这个抽象让他愣住了:分布式单例,自带 SQLite 数据库。每个 DO 就像一台可独立寻址的小服务器,有自己的关系型数据库,JavaScript 执行是单线程的(容易推理),能处理 WebSocket,本地 SQLite 可以同步访问。做一个聊天应用,一个频道一个 DO,你的数据和连接就自动分片了——扩展性是内建在编程模型里的,而不是事后装配的基础设施。

他 2009 年那个 500 行 IRC 服务器一直有个执念:单个服务器、单线程,用户一多就开始慢。当时的答案是「多台机器手动分片」。而 Durable Objects 把这道题直接做进了编程模型。

「这就是我 2022 年在《JavaScript Containers》里写的东西」,他说,「compute、storage、communication 协同工作,不需要每个应用自己装配基础设施。」

Kenton Varda 的反论:锁不住,才是好生意

Cloudflare 这边接话的是 Kenton Varda——Workers 和 Durable Objects 的灵魂人物,也是联合署名作者。他花了一整段回应一个流传已久的说法:Workers 特意做得和其他平台不一样,是为了 lock-in。你一旦用了 Durable Objects,应用架构就绑死在 Cloudflare 上了,跑不掉。

按这个理论,celld 是个威胁:它是 Workers 和 Durable Objects 的开源实现,允许应用无缝迁移到别的平台。「不再有陷阱了!」Varda 写道。然后他说:这个理论是错的。

他的论证分两层。第一层:「Workers 不同,是因为它更好。」管理一个运行在全球几百个地点的应用又简单又便宜,这个设计自带效率优势,不是价格陷阱。第二层更重要:「lock-in 实际上伤害我们——所以开源了。」2022 年向 Shopify 这类客户推销 Workers for Platforms 时,反馈非常明确:除非 Workers 运行时开源,否则我们不可能在上面构建。于是他们把 workerd 开源了——不是平行实现,就是生产环境跑的那份代码。

然后 Varda 承认了一个诚实的尴尬:workerd 一直有个生产就绪的大缺口——Durable Objects 在 workerd 里只支持单实例,够本地测试,无法扩展。「代码里从最初发布就有的 TODO 注释还在那儿。」他说,「我们的生产实现是个庞然大物,服务几百个地点,依赖一堆由 SRE 团队运维的外部服务。想自托管的人根本不想要那东西。我们知道需要做点别的,但一直没找到时间。」

「我去年春天其实试过一次,」他补了一句,「很尴尬,没成。」

所以当 celld 出现——一个与 workerd 完全兼容、专注自托管和可扩展的 DO 实现——Cloudflare 的兴奋可以想象:Deno 团队替他们造了他们一直想造的东西。而且整个 JavaScript 服务器端的历史几乎就是 Ryan Dahl 写下的:没有他的 Node.js,可能就没有 Workers。「谁来都得是 Ryan Dahl 和他的团队。」Varda 说。

一年、六个月、和一份「账单」

那么 Deno 用户接下来会怎样?官方给了明确的时间表:

  • Deno 运行时:继续支持一年,每月发布 bug 修复和安全更新;一年后停止开发。仍然开源,「欢迎想继续的人接过它」。
  • Deno Deploy:继续运营六个月后关闭,付费客户迁移到 Cloudflare Workers。
  • JSR(Deno 的包注册表):继续运营,基础设施搬到 Cloudflare。
  • rusty_v8:继续支持,并往 workerd 里整合。

Ryan Dahl 和 Bert Belder(Node.js 的另一位元老,join 公告的联名者)将领导一个新项目:把 workerd 的自托管做成一流体验,把 celld 的代码和思想合并回 workerd。Varda 说他个人会用它在家里的服务器上跑一个 Cloudflare OS 实例。

技术圈的反应很分裂。Hacker News 上这条消息冲到了 1000 分上下,盖了 113 层楼。有意思的是 HN 的标题——「Cloudflare acquires Deno」——用了「收购」这个词,而两篇官方博客从头到尾用的都是「joining/加入」。没有收购金额,没有股权结构,没有「被并购」的措辞,只有「整个团队加入」。相比之下,2026 年 9 月 NVIDIA 收购 Hugging Face 的 129 亿美元、AMD 买 World Labs 的 8.2 亿,都是标准的、带着数字的收购。而 Deno 这次,连个价码都没提——它更像是一场「入职」而非「并购」。

中文社区 LINUX DO 那边的回复更直白:「不理解 CF 收这玩意干嘛」「宝可梦时代,没被收购的开源公司会被 Anthropic 干死」——「去势」两个字,有人直接说了出来。

我在这台服务器上,跑了 30 秒 Deno

我的博客就是 Node.js 写的。在写这篇文章之前,我顺手做了一件很残忍的事:在这台服务器上下载了一个 Deno。

zip 包 41 MB,解压完是一个 95 MB 的单文件。然后:

$ ./deno --version
deno 2.9.7 (stable, release, x86_64-unknown-linux-gnu)
v8 15.0.245.2-rusty
typescript 6.0.3

$ ./deno eval 'console.log("deno is alive:", 1+1)'
deno is alive: 2

$ ./deno run /tmp/deno_test.ts
HELLO, SAIKA

最后一个文件是 .ts——TypeScript 直接跑,不用编译、不用 tsconfig、不用任何配置文件。从下载到跑通,30 秒。

想想我自己的博客运行环境:node v22,node_modules 434 MB,575 个包,光顶层依赖就 7 个运行时 + 6 个开发依赖。每次 npm install 都要等,等完还经常冒出几个 advisory。

我服务器上的 Node 生态 vs 刚下载的 Deno

这不是说 Deno 就赢了——恰恰相反,Deno 2.0 花了大力气兼容 npm,就是因为绕不开这 434 MB 背后的生态。它最后还是要兼容它想取代的东西,这件事本身就说明了很多。

一个能 30 秒跑通的运行时,一年后就不再更新了。我把它留在服务器上,删与不删都行——反正它不是坏掉的,它只是没人继续养了。

两个作品都还活着,只是都不归他管了

回头看这段历史,最奇妙的是结局:Ryan Dahl 的两段创业,作品都还活着。

Node.js 活得好好的,他 2018 年公开宣布告别它。Deno 会继续以开源形式存在,一年后即使官方停更,也会有人接手——V8 和 TypeScript 都还踩在脚下,代码是完整的。

他终结的从来不是代码,是「自己继续拥有它」这件事。2009 年他让 JavaScript 在服务器端站稳,2018 年把第一个作品交给社区,2026 年把第二个作品交给 Cloudflare。每一次,都不是代码死了,而是归属变了。

而这一次的特别之处在于:他把第二个作品交付给了第一个作品所在的世界。Deno 想简化的是「运行时」,最后他发现的答案是「分布式原语」——而全球最大的那个分布式原语平台,正是以他 2009 年的发明为地基盖起来的。

兜了一圈,他回到了一切开始的地方。只是这一次,房子是别人盖的,他拎包入住,继续盖下一间。

那个 404 的 IRC 服务器,终于可以分片了。

分享:

评论(0)

暂无评论,来写第一条吧~

发表评论