Cloudflare 与 VoidZero 推出 TypeScript 的 Rust 移植版 tsrs
Tsrs: A Port of TypeScript to Rust
Cloudflare 与 VoidZero 联合 Owner.com 的 Max Schwenk 推出 tsrs,这是 TypeScript 编译器的 Rust 移植版,孵化于 Oxc 工具链,并已发布 npm 实验版本(npm install tsrs)。
Cloudflare 和 VoidZero 目前正与 Owner.com 的 Max Schwenk 合作开发 tsrs,这是 TypeScript 编译器的 Rust 移植版本。我们与 TypeScript 团队紧密协作开展这项工作,并将 tsrs 作为 Oxc JavaScript 编译器工具链 的一部分进行孵化。
我们的目标是帮助开发者减少等待代码检查的时间,把更多时间用于构建。让 TypeScript 更快、更省内存,也有助于将完整的开发环境带到更多地方,包括直接在浏览器中。
需要明确的是,我们并非在分叉 TypeScript。我们认为 TypeScript 团队应当继续完全掌控该语言的设计与方向。他们一直保持着长期愿景,同时引导 TypeScript 在整个 JavaScript 社区中的采用。我们不想改变这一点。
TypeScript 团队在许多事情上可以推进得相当快,但对于某些特性,他们可能会花数年时间有意探索各种方案并制作原型,然后才选定正确的实现。Rust 移植必须紧密跟随这些决策,否则最终会分崩离析并变得不兼容。我们必须严格依据 TypeScript 的原始实现来保持该语言不变——而 TypeScript 团队应当继续独自负责决定它应该是什么样子。
性能与内存改进
我们 Rust 版 TypeScript 移植的早期基准测试结果令人鼓舞:在使用相同数量的类型检查工作线程时,tsrs 比 TypeScript 7.0 快最多 8 倍,内存占用减少约 70%:

如你所见,下一版 TypeScript 已经带来了许多性能改进,使 TypeScript 7.1 beta 比 TypeScript 7.0 快最多 2.5 倍。其中一些优化已从 tsrs 上游合并,我们希望还能找到更多。
你可能已经看到过近期不同 TypeScript 移植版本的基准测试及各种性能宣称,这往往是因为与 TypeScript 的默认配置相比使用了更大的机器类型和不同的选项。我们与 TypeScript 团队合作,确保上述基准测试比较的是相同配置。
默认情况下,tsrs 附带一种取决于机器类型的自适应配置,它会使用更多内存,但速度更快:

试用 tsrs
用 Rust 实现的 TypeScript 旨在成为 TypeScript 的忠实移植。你可以从 npm 安装 tsrs 包来试用实验版本:
npm install tsrs
npx tsrs为什么是现在?
多年来,我们见过许多将 TypeScript 移植到其他语言的尝试。由于涉及的复杂性,只有一个移植成功了:TypeScript 团队将 TypeScript 从 JavaScript 移植到 Go。
然而,前沿 AI 模型现在可以在几天内几乎独立地完成大规模移植。我们已经看到过 TypeScript 的粗糙分叉、忠实移植以及用 Rust 或 C++ 完全重新架构的版本。显然,人们对更快的 TypeScript 有需求。
为什么选 Rust?
你可能会想:“TypeScript 的 Go 移植已经让 TypeScript 比之前用 TypeScript 编写的版本快 10 倍,内存效率也高得多。为什么这还不够?”
然而,这不仅仅是速度的问题。Rust 提供了一些独特的优势:在 WebAssembly 中运行。Rust + Wasm 的组合一直很强大,其中一个原因在于 Rust 语言设计的基础。当你将 Go 程序编译为 Wasm 时,必须同时编译 Go 的垃圾回收器。但 Rust 的内存管理模型使得 WebAssembly 客户机与宿主之间的内存交互变得直接。这正是让 Rust 更适合 WebAssembly 用例的关键因素之一:内存效率。
Cloudflare Workers 长期以来一直支持 Wasm。就在几周前,我们宣布通过 wasm-bindgen 的新 Emscripten 目标在 Workers 中支持原生 Rust。当你在 Workers 上以紧密循环运行整个软件构建和部署系统时,小内存占用的优势会迅速显现。这意味着你可以如此高效地运行这些工作负载,以至于现在可以在以前无法运行的地方运行完全封装的开发系统。
与代理结合后,这开启了新的可能性:你现在可以在 Cloudflare 上完全沙箱化的环境中端到端地运行开发工具链。但借助 Wasm,你也可以在浏览器客户端、嵌入式设备或 IoT 应用中安全地运行这些环境。
tsrs 端口将如何维护?
首先,我们正与 Theo Browne 合作,将 tsc-rs 和 tsrs 合并为一个支持 TypeScript 所有功能的单一包,包括语言服务器协议(LSP)和内容映射器。其次,我们在保持 Vinext 与其上游 Next.js 同步方面取得了很大成功。我们在最近的一篇博客文章中解释了我们的做法:
每天早上,一个代理会审查变更、获取差异,并为任何可能影响 Vinext 的问题打开跟踪 issue。每天晚上,我们会针对 Vinext 运行 Next.js 测试套件,重新生成兼容性矩阵。当这些测试或 issue 之一揭示出差距时,代理现在能够识别两个代码库中的变更、构建复现、移植相关测试并提出修复方案。
我们将对 TypeScript 应用同样的流程,极其谨慎地避免引入与上游 TypeScript 不同的行为。当我们发现性能改进时,我们会尝试将其贡献回 TypeScript Go 代码库,以实现共赢。
最后,我们认识到目前与上游 TypeScript 版本存在一些差异,例如诊断信息的打印顺序。我们的目标是在发布稳定版本时将这些差异降至最低。
接下来是什么?
Cloudflare 已经是许多驱动 JavaScript 生态系统的免费开源 Rust 工具的所在地,例如 Vite、Rolldown、Oxlint 和 Oxfmt。有超过 1000 万开发者在 Cloudflare 上构建,我们非常关心让底层开发者工具链更快、更可移植,并更容易在更多地方运行。我们很高兴尝试将 tsrs 更深入地集成到我们的技术栈中,例如用于 Oxlint 中的类型感知 lint 规则。
与 Vinext 一样,我们的目标是让 tsrs 作为一个维护良好、健康的开源项目运行——同时不妨碍 TypeScript 本身。Oxc 团队已经开始重构代码库,使其更快、占用更少内存并更易于维护。我们知道 TypeScript 团队正在认真对待此事——他们正在为 tsc 试验内存和性能改进。我们很高兴能与 TypeScript 团队和 JavaScript 社区合作,共同构建最好、最快的 TypeScript 实现。
来源:Hacker News · blog.cloudflare.com