据公告,Deno 团队已正式加入 Cloudflare。Deno 运行环境将在未来一年内逐步停止服务,但 JSR 将继续在 Cloudflare 基础设施上运行。该团队的新任务是将 Deno 的 celld 合并到 workerd 中。

这一变动距离 Deno 2 发布整整两年,而 Bun 则在十个月前加入了 Anthropic。表面看,替代运行时实验似乎已结束,Node 凭借默认优势获胜。但事实上,生态系统确实获得了 Deno 所推动的红利,尽管这些益处并非直接来自 Deno 本身。

竞争是健康生态系统的必需品

Deno 从未在生产环境中达到临界规模,Node 在 2026 年的主导地位与 2018 年一样稳固。Deno 的真正成就在于重新激发竞争,给既得利益者施加了压力,且这种压力是双向的。

2018 年,Ryan 在 JSConf EU 大会上提出 Deno 的初衷:默认拒绝权限、TypeScript 作为一等公民、服务端使用 Web 标准 API、仅支持 ES 模块、单一可执行文件,并摒弃 npm、package.json 和 node_modules,转而通过 URL 引用依赖。然而,社区对 URL 导入的安全性持怀疑态度。Node TSC 成员 Matteo Collina 曾在 2020 年指出,缺乏中央实体修复可能导致类似“left-pad”的安全危机。这一担忧最终被证实是正确的。

Deno 1.0 于 2020 年发布后,在随后四年里逐步放弃了部分原始原则:从 deps.ts 清单文件到 lock.json 完整性哈希,再到导入映射(import maps)。当前官方文档甚至建议优先使用注册表而非 HTTPS 导入,重述了早年反对 URL 导入的理由。

Bun 的出现加速了这一转变。2022 年 7 月发布的 Bun 0.1 选择重建工具链以追求速度,同时兼容现有 npm 包。约六周后,Deno 宣布引入 npm: 规格说明符,承诺兼容大部分 npm 包,并将目标转向成为“最快的 JavaScript 运行环境”。2024 年 10 月发布的 Deno 2 实现了完整的 Node 和 npm 兼容性。历经四年,Deno 从 Node 的替代品变成了运行 Node 生态的另一种方式。

这一决策承认了生态系统无法一夜之间放弃十年的依赖积累。同样,Cloudflare 于 2022 年开源 workerd 时,也因软件包现状建立了自己的 Node 兼容层。

面对竞争,Node 被迫做出回应。自 2018 年以来,Node 陆续推出了全局 fetch、WebSocket、Web Streams、稳定测试运行器、权限模型、类型剥离等功能。这些变化若无其他运行环境的率先尝试,恐难按此时间表发生。竞争对手提供了成熟开源项目所缺乏的紧迫感。

标准化工作也源于此压力。WinterCG 成立于 2022 年,旨在界定最低限度的公共 API,现作为 Ecma TC55 持续推动标准整合。

包管理器与注册表的演进

JavaScript 包生态系统曾长期处于单一种植模式。Yarn(2016 年)引入了确定性安装、锁文件和离线缓存;pnpm 解决了 node_modules 的空间浪费问题;Bun 提升了安装速度;Deno 则倡导在安装前审查依赖源代码。这些改进均源于对现状的挑战。

近期最显著的例子是安装脚本。pnpm 和 Bun 默认不再运行安装脚本,vlt 亦从未这样做。在今年六月经历一系列供应链攻击后,GitHub 宣布 npm 12 也将默认停止运行此类脚本。这一变革并非激进之举,而是多家包管理器共同施压的结果。理念也在相互借鉴,如 npm 从 pnpm 引入目录概念,pnpm 则借鉴了命名注册表别名。

在注册表方面,JSR 通过发布 TypeScript 源代码、强制 ESM 和生成文档做出了不同尝试。尽管存在争议,但因其低成本、文档完善及 Cloudflare 的支持,JSR 将在 Deno 运行时停服后继续存在。

格局之变与未来展望

目前两大独立 JavaScript 运行环境已归属于业务重点不同的公司。Bun 团队表示其与 Claude Code 的关系类似 Google Chrome 与 V8,保持较高独立性;而 Cloudflare 明确 workerd 的发展路线图即为其自身路线图。这种资助模式虽非首创,但仍是显著变化。

Deno 运行环境是否会出现社区分支,将检验生态系统对默认安全、标准优先运行环境的重视程度。与此同时,celld 并入 workerd 为自行托管的 Workers 和 Durable Objects 实现提供了新选项。

JavaScript 生态在各层级均有冗余保障:三个生产级引擎、多个运行环境及包管理器。当运行环境层级整合时,其他层级依然稳固。所谓的“JavaScript 疲劳”虽常被诟病,但正是这种竞争让用户无需离开 Node 即可享受 fetch、权限模型或 TypeScript 支持等功能。项目未必总是获胜,但理念通常胜利,最终用户从中受益。

致 Ryan、Bert、Bartek 及 Deno 团队:你们的努力丰富了共享生态系统。谢谢你们!

Darcy Clarke
vlt 创始人兼 CEO