资深独立开发者 David Bushell 近日在完成一项重度依赖 SvelteKit 的客户项目后,正式宣布放弃使用了多年的 Deno 运行时,全面撤回 Node.js 阵营。这一转变并非技术怀旧,而是在 Node.js 演进至 Node.js v26.10.0 后,两者的技术天平发生了实质性倾斜。

让这场迁徙极具戏剧性的是迁移成本与性能反馈:在将个人静态网站生成器迁回 Node 环境时,代码仅需换用标准的 node:fs、node:path 与轻量 Hono 适配器,构建速度反而提升了 15%。这场个案揭示了服务端 JavaScript 格局的隐秘位移——挑战者曾经引以为傲的技术代差,已被主导者的工程迭代彻底抹平。

运行时迁移实测:核心指标对比 Deno 迁移前 基准耗时 专用 API(@std/path, Deno.serve) JSR 频发 429、并发请求偶发拥塞 Node.js v26.10.0 -15% 构建耗时 标准 API(node:fs, node:path) 原生 Type Stripping 免复杂编译管线

抹平代差:Node.js v26 的克制现代化

2018 年 Node.js 原作者 Ryan Dahl 创立 Deno 时,立论基础是 Node.js 早期设计的历史包袱:缺乏开箱即用的 TypeScript 运行能力、混乱的模块体系以及难以摆脱的依赖黑洞。然而八年后,这些曾经被视作陈年积弊的设计痛点,正在被主流生态逐一清理。

Node.js 官方严禁对本地依赖执行类型剥离并阻断执行(示意图)
Node.js 官方严禁对本地依赖执行类型剥离并阻断执行(示意图)

2026 年 9 月 22 日发布的 Node.js v26.10.0 是这场变革的关键锚点。该版本正式内置了稳定的 TypeScript 类型剥离(Type Stripping)机制。该功能并不在运行时做庞大而沉重的抽象语法树转换或实时类型校验,仅仅抹去代码中的类型注解直接执行。这意味着开发者无需配置冗余的构建工具,便能以近乎纯 JavaScript 的速度直接拉起 TypeScript 脚本。

更重要的是,Node.js 官方在模块设计上推行了一种哲学层面的防御策略:官方规范严格禁止对 node_modules 路径下的 TypeScript 源码做类型剥离,一旦触发便会抛出 ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING 异常。这种约束迫使包发布者必须在分发前用轻量打包器(如 tsdown)编译为标准 JavaScript,从而阻断未经预处理的杂乱语法污染整条下游依赖树。

随着 require() 彻底退居次席、现代 ESM 与内置 Fetch 的常态化,再加上 node:fs 等基础库的大幅精简,Node.js 已经完全吸收了 Deno 当初点燃的工程火种。

框架反向收口:Deno 消失的无依赖优势

Deno 最初最引人瞩目的设计在于摆脱本地依赖目录,改走 URL 远程导入。然而过去两年的前端生态演进,却走向了一条完全相反的道路。

现代框架依赖生态迫使运行时重新接入本地庞大依赖底座(示意图)
现代框架依赖生态迫使运行时重新接入本地庞大依赖底座(示意图)

以 SvelteKit 和 Vite 为代表的新一代现代全栈框架,其底层构建管线与模块拓扑深度依赖传统的 npm 生态。即便在演进到 Deno 2.x 的环境下运行类似项目,开发者通常也必须在配置中将 nodeModulesDir 设为 auto 或 manual,以维持一个本地的依赖目录。在复杂的工程实践与 Native Node-API 插件面前,去中心化导入的优势被彻底稀释。

现代前端框架以 npm 为第一公民的现实,让任何异构运行时的无依赖承诺名存实亡。
现代全栈框架生态链路的收口效应 前端应用层 SvelteKit / Vite 绑定传统模块拓扑 依赖分发层 node_modules Deno 2 妥协兼容本地目录 实际运行环境 Node.js v26 原生执行 运行时代差归零,开销更低

与此同时,Deno 商业化实体 Deno Land Inc. 的重心转移也加速了核心拥趸的离开。在遭遇团队裁员过半后,公司资源明显向迎合风投资本的 AI 概念转移。随之而来的是基础设施维护的质量滑坡:包管理注册表 JSR 频繁触发 429 限流报错、高并发 HTTP 请求出现拥塞异常、终端补全故障迟迟未修。当基础工具的可用性开始动摇,开发者便不再有理由忍受额外的认知负担。


逃离微软全家桶:供应链安全与独立代价

开发者重回 Node.js 并不代表拥抱现有的中心化垄断。在 npm 频遭 Shai-Hulud 凭据窃取等供应链投毒攻击的背景下,防御软件供应链风险成了回迁过程中最繁重的一道工序。

工程实践通过设置一天观察期与防降级锁隔绝供应链投毒(示意图)
工程实践通过设置一天观察期与防降级锁隔绝供应链投毒(示意图)

为避开恶意依赖的即时扩散,工程实践普遍转向利用 pnpm 构筑防线。例如通过在 pnpm-workspace.yaml 中配置 minimumReleaseAge: 1440,强制对所有新发布的依赖包执行 1 天观察期隔离,同时结合 trustPolicy: no-downgrade 防御包发布的信任凭据降级。这种配置在不拖慢实际开发节奏的前提下,为依赖审查争取了关键的安全缓冲。

开源供应链安全防御的闭环困局 pnpm 延迟防御策略 1440 分钟隔离 minimumReleaseAge 过滤投毒包 trustPolicy: no-downgrade 防凭据降级 自建 Forgejo 的身份断链 丢失 Provenance 证明 npm 官方仅支持 GitHub 等受信任 OIDC 独立开发者在垄断规则下沦为受限公民

但在试图彻底脱离平台锁定时,独立开发者撞上了更为坚固的高墙。为了抵制微软对开发基础设施的控制,David Bushell 等开发者尝试自建 Forgejo 替代 GitHub。然而 npm 的来源可证明性(Provenance)生成机制与可信发布流程(Trusted Publishing)深度绑定了特定的云端 OIDC 实体。

  • 风险.当开发者试图通过自建 Git 实例向 npm 发布模块时,无法被官方体系识别,导致包文件直接失去 Provenance 凭据,开发者反而在自己依赖的包管理器中被标记为需要额外放行的次级实体。

这种悖论表明,当下的前端基础设施不仅是一场运行时性能的角逐,更是平台规则的围剿。Node.js 凭借庞大的存量网络和自我重构,再次守住了王座;而曾经试图掀翻旧世界的革新者,不仅要面对旧主宰的防御性反击,还得在框架收敛与平台生态的精密罗网中苦苦寻觅立足之地。