Cloudflare 与 VoidZero 推出 TypeScript 编译器的 Rust 移植 tsrs
Introducing tsrs: a Port of TypeScript to Rust
Cloudflare、VoidZero 与 Owner.com 的 Max Schwenk 合作开发 tsrs,一个 TypeScript 编译器的 Rust 移植,在 Oxc 工具链中孵化,并与 TypeScript 团队密切协作,明确表示不是分叉。
官方与 TypeScript 团队协作的 Rust 移植,给出同配置基准数据和维护方式,读者可据此评估其可用性。
Cloudflare 和 VoidZero 现在正与 Owner.com 的 Max Schwenk 合作开发 tsrs,这是 TypeScript 编译器的 Rust 移植版。我们与 TypeScript 团队紧密合作开展这项工作,并将 tsrs 作为 Oxc JavaScript 编译器工具链的一部分进行孵化。
我们的目标是帮助开发者减少等待代码检查的时间,将更多时间用于构建。让 TypeScript 更快、更省内存,也有助于将完整的开发环境带到更多地方,包括直接在浏览器中。
需要明确的是,我们不会分叉 TypeScript。我们认为 TypeScript 团队应继续完全掌控该语言的设计和方向。他们一直保持着长期愿景,同时引导 TypeScript 在整个 JavaScript 社区中的采用。我们不想改变这一点。
TypeScript 团队在许多事情上可以推进得相当快,但对于某些特性,他们可能会花数年时间有意探索各种方案并制作原型,然后才选定正确的实现。Rust 移植版必须紧跟这些决策,否则最终会分崩离析并变得不兼容。我们必须严格依据 TypeScript 的原始实现来保持该语言,而 TypeScript 团队应继续独自负责决定它应该是什么样子。
性能与内存改进
我们对 TypeScript 的 Rust 移植版的早期基准测试结果很令人期待:在使用相同数量的类型检查工作进程时,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 的内容创建跟踪问题。每天晚上,当我们针对 Vinext 运行 Next.js 测试套件时,兼容性矩阵会被重新生成。当这些测试或问题之一揭示出差距时,代理现在能够识别两个代码库中的变更、构建复现、移植相关测试并提出修复方案。
我们将对 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 实现。
来源:Cloudflare Blog · blog.cloudflare.com