Hacker News 中文摘要

RSS订阅

Tsrs:TypeScript 的 Rust 移植版 -- Tsrs: A Port of TypeScript to Rust

2026 年 10 月 20 日,Cloudflare 推出 tsrs,启动将 TypeScript 移植到 Rust 的工作。TypeScript 作为面向 JavaScript 的静态类型语言,其编译器与相关工具原本主要用 TypeScript 编写;tsrs 的目标是把这套实现改用 Rust 重写,让类型检查、编译和语言服务等功能转移到 Rust 环境中运行,从而以 Rust 承载完整的 TypeScript 处理流程。

正文

Cloudflare 和 VoidZero 目前正与 Owner.com 的 Max Schwenk 合作开发 tsrs,这是 TypeScript 编译器的 Rust 移植版。我们与 TypeScript 团队紧密协作推进这项工作,并将 tsrs 作为 Oxc JavaScript 编译器工具链的一部分进行孵化。

tsrs 项目示意图

我们的目标是帮助开发者减少等待代码检查的时间,将更多精力投入构建。让 TypeScript 更快、更节省内存,也有助于把完整的开发环境带到更多场景中,包括直接在浏览器中运行。

需要说明的是,我们并不是在分叉 TypeScript。我们认为 TypeScript 团队应继续完全掌控这门语言的设计与发展方向。他们在推动 TypeScript 被 JavaScript 社区广泛采用的过程中,始终保持着长期愿景。我们不想改变这一点。

TypeScript 团队在很多事情上推进得很快,但某些特性他们可能会花数年时间有意地探索各种方案、制作原型,之后才选定合适的实现。Rust 移植版必须紧跟这些决策,否则最终会分崩离析并变得不兼容。我们必须严格基于 TypeScript 的原始实现来保留这门语言——而 TypeScript 团队应继续全权负责决定它该是什么样子。

性能与内存改进

我们对 TypeScript 的 Rust 移植版所做的早期基准测试结果很可观:在使用相同数量的类型检查工作进程时,tsrs 的速度最高提升至 TypeScript 7.0 的 8 倍,内存占用减少约 70%:

tsrs 与 TypeScript 7.0 的性能和内存对比

可以看到,TypeScript 的下一个版本已经带来了许多性能改进,使 TypeScript 7.1 beta 比 TypeScript 7.0 最快快 2.5 倍。其中一些优化是从 tsrs 向上游合并过去的,我们希望能找到更多。

你可能看过最近不同 TypeScript 移植版的各种性能基准测试,数据差异往往是因为使用了更大的机型以及不同于 TypeScript 默认值的选项。我们与 TypeScript 团队合作,确保上述基准测试是在相同配置下进行的比较。

默认情况下,tsrs 会附带一种依赖机型自适应配置,它占用更多内存,但速度更快:

tsrs 默认自适应配置下的性能表现

尝试 tsrs

Rust 版的 TypeScript 旨在成为 TypeScript 的忠实移植。你可以通过 npm 安装实验版本:先执行 npm install tsrs,再运行 npx tsrs。

为什么是现在?

多年来我们看到了许多把 TypeScript 移植到其他语言的尝试。由于涉及的复杂性,只有一个移植成功了,那就是 TypeScript 团队把 TypeScript 从 JavaScript 移植到 Go 的版本。

然而,前沿 AI 模型现在几乎可以独立地在几天内完成大规模移植。我们已经看到了 slopforks、忠实移植版,以及用 Rust 或 C++ 完全重构的 TypeScript 版本。显然,市场对更快的 TypeScript 有明确需求。

为什么选择 Rust?

你可能会想:TypeScript 的 Go 移植版已经让 TypeScript 比之前用 TypeScript 写的版本快了 10 倍,内存效率也高得多。为什么这还不够?

然而,这不仅仅是速度的问题。Rust 提供了一些独特优势,比如在 WebAssembly 中运行。Rust 与 Wasm 的结合一直很强大,原因之一在于 Rust 语言设计的基础特性。把 Go 程序编译到 Wasm 时,必须把 Go 的垃圾回收器一起编译进去。而 Rust 的内存管理模型让 WebAssembly 的 guest 与 host 之间能够直接进行内存交互。这是 Rust 更适合 WebAssembly 场景的关键原因之一:内存效率。

Cloudflare Workers 支持 Wasm 已经有很长时间。就在几周前,我们宣布通过 wasm-bindgen 的新 Emscripten 目标,在 Workers 中支持原生 Rust。当你在 Workers 上以紧密循环的方式运行完整的软件构建和部署系统时,小内存占用的好处很快就能体现出来。这意味着你可以如此高效地运行这些工作负载,以至于现在能够在以前无法运行的地方运行完全封装的开发系统。

当与 agent 结合时,这带来了新的可能性:你现在可以在 Cloudflare 上完全沙盒化的环境中端到端地运行开发工具链。而借助 Wasm,你也可以在浏览器中安全地在客户端运行这些环境,或者运行在嵌入式设备、物联网应用中。

tsrs 移植版将如何维护?

Image 3: Boshen Chen

Image 4: Dimitri Mitropoulos

Image 5: Christoph Nakazawa

Image 7

首先,我们正与 Theo Browne 合作,将 tsc-rs 和 tsrs 合并成一个单一的包,支持 TypeScript 的所有功能,包括语言服务器协议(LSP)和 content mappers。

Image 8

Image 10

其次,我们在让 Vinext 与其上游 Next.js 保持同步方面取得了很大成功。我们在最近的一篇博文中解释了具体做法:

每天早上,一个 agent 会审查变更、获取 diff,并为任何可能影响 Vinext 的内容创建跟踪 issue。每天晚上,我们会在 Vinext 上运行 Next.js 测试套件,并重新生成兼容性矩阵。当其中一个测试或 issue 暴露出差距时,agent 现在能够识别两个代码库中的对应变更、构建复现用例、移植相关测试并提出修复。

我们将把同样的流程应用到 TypeScript 上,极其小心地确保不会引入与上游 TypeScript 不一致的行为。当我们发现性能改进时,会尝试把它们贡献回 TypeScript 的 Go 代码库,让所有人受益。

Image 12: Cloudflare

最后,我们承认目前与上游 TypeScript 版本存在一些差异,比如诊断信息的输出顺序。我们的目标是在发布稳定版时把这些差异降到最低。

Image 13: Ryan Skidmore

Image 14: Alex Reneau

Image 15: Michelle Chen

Image 16: Kevin Flansburg

Image 17: Grant Bourzikas

Image 18: Kenny Johnson

Image 19: Cloudflare

下一步是什么?

Cloudflare 已经是许多支撑 JavaScript 生态的免费开源 Rust 工具的所在地,例如 Vite、Rolldown、Oxlint 和 Oxfmt。有超过 1000 万开发者在 Cloudflare 上构建项目,我们非常关心如何让底层开发者工具链变得更快、更可移植、更容易在更多地方运行。我们很期待尝试把 tsrs 更深入地集成到我们的技术栈中,比如在 Oxlint 中实现类型感知的 lint 规则。

就像 Vinext 一样,我们的目标是把 tsrs 作为一个维护良好、健康的开源项目来运营——而不会妨碍 TypeScript 本身。Oxc 团队已经开始重构代码库,使其更快、占用更少内存并且更易于维护。我们知道 TypeScript 团队也在认真对待这件事——他们正在试验针对 tsc 的内存和性能改进。我们很期待与 TypeScript 团队及 JavaScript 社区合作,共同构建最好、最快的 TypeScript 实现。

Image 20

Image 21

Image 22

评论

社区整体处在“兴奋但疲惫”的交叉情绪里:一边是 tsrs 带来的速度和内存改进让人眼前一亮,另一边是对“一切都用 Rust 重写”、人工智能几天生成大型移植以及同类 TypeScript 检查器不断重复的厌倦。真正分歧不在于 Rust 是否更快,而在于这些收益来自 Cloudflare 的特定 WASM 场景和具体优化、官方 TypeScript 会吸收多少,以及普通开发者到底要不要跟进。

认为 tsrs 让更快的 TypeScript 编译器变得可信

  • 在大代码库里本地跑 TypeScript 一直很慢,而 tsrs 据称比 TypeScript 7.0 最多快 8 倍、内存少约 70%;有人实测它在多线程下内存表现很好,还保留了 bun 没有的增量检查,因此不少人觉得这条路值得认真对待,甚至直接喊话微软移植。(较多人) > 这个 Rust 移植比 TypeScript 7.0 最多快 8 倍、内存少约 70%,微软真该认真考虑把 TypeScript 移植到 Rust。(@AbuAssar)
  • 在认可收益的同时,也有人希望官方或社区拉一个 TypeScript 7.2 实验分支,直接对比 tsrs 与官方版本的真实表现,而不是只看宣传里的倍数。(少数人)

认为普通项目不必急着切换,场景完全不同

  • Cloudflare 的需求是在大规模场景下省成本、要跑几百万次编译,这和日常前端开发的迭代循环完全是两回事,所以你几乎肯定不需要立刻计划替换现有工具链。(较多人) > Cloudflare 要跑几百万次编译来省成本,和普通前端开发者的迭代循环完全不是一回事,你几乎肯定不需要马上计划切换。(@nsm)

认为加速不只来自 Rust 语言,官方会吸收优化

  • TypeScript 团队成员表示,tsrs 很有意思,但他们自己做过 Rust 实验性移植,推测不少加速并不只是换语言带来的;tsrs 中发现的一些安全优化会被吸收进官方 TypeScript 7.1,Cloudflare 的 WASM 与 oxlint 整合也确实合理。因此不宜把 tsrs 读成“Rust 天生碾压 JavaScript/TypeScript”,它更像是特定约束下挖出的一套优化,还会回流到官方工具链。(高赞) > 我们自己做过 Rust 氛围式移植,怀疑不少加速并不只是语言选择带来的;tsrs 中发现的一些安全优化会进入 TypeScript 7.1。(@DanRosenwasser)

担心人工智能几天生成大型移植会削弱架构质量与人工投入的意义

  • 虽然认可速度提升,但从“精心手写移植”转向“人工智能模型几天内几乎独立完成移植”让人不安:输出仍需要人审,因为架构决策往往不牢靠;如果一个人花一年做的语言项目能在几天被替代,手写和设计的价值会很难辩护。(少数人) > 我很高兴看到速度提升,但整个移植在几天内由人工智能完成、作者写了零行代码,让我担心架构决策的质量,也不确定以后花时间手写还有什么意义。(@egonschiele)

反感“万物皆可 Rust 重写”与同类项目重复造轮子

  • 已经有 tsrs、tsgo-rs、bun check,甚至还有 C# 移植等多个同类 TypeScript 实现同时出现,有人觉得大家其实在造同一个东西;整体趋势像把一切都用 Rust 重写,令人疲惫。(较多人) > 现在的趋势似乎就是把所有东西都用 Rust 重写一遍。(@jdw64)
  • 对 Rust 的狂热出现反弹,有人以玩笑口吻调侃 Rust 现在成了大家默认的“敷衍式”语言,甚至想换回 C。(少数人)

希望能力被收编进现有工具链,而不是再多一个新工具

  • 虽然厌倦每天冒出新工具,但如果这类能力由 Vite 团队以 Vite+ 的形式提供,就能减少工具链决策、只维护一个配置,因此值得支持;否则只是又一个新选择。(少数人) > 我厌倦每天出现的新工具,但如果这基本是 Vite 团队在做、并能和 Vite+ 整合,我就支持,因为能少做工具链决策、只留一个配置。(@norman784)

有价值的补充

  • Cloudflare 做 tsrs 的真实动机不是“用 Rust 写个更快的编译器”,而是需要一个能跑在纯 WASM 沙箱里的 TypeScript 编译器;把 Go 版 tsc 导出到 WASM 会带上完整 Go 运行时,改用 Rust 是为了绕开这个成本,速度更快只是副作用。(@sheepscreek)
  • tsrs 采用了一种近似“模拟垃圾回收”的内存模型:用永不释放的内存池管理长生命周期对象,绕开 Rust 没有垃圾回收机制、从带垃圾回收的语言移植时通常要重构数据结构的难题;这种做法是否完全符合 Rust 的安全要求、足够可靠,仍值得观望。(@afdbcreid)
  • 在单体仓库上实测对比显示,tsrs 增加线程时内存表现很好,并支持 bun 没有的增量检查,但单论效率仍不及 bun。(@jscheel)