目录

tsrs 是一个将 TypeScript 编译器移植到 Rust 的实验性项目。据初步基准测试报告,与 TypeScript 7.0 相比,其类型检查速度最高可达 8 倍,内存使用量约减少 70%。值得在自己的项目中尝试,但由于兼容性尚不完善、配置存在差异,现在就认为它能替代现有编译器还为时过早。

要点#

  • Cloudflare、VoidZero 和 Owner.com 的 Max Schwenk 正与 TypeScript 团队密切合作,将 tsrs 作为 Oxc JavaScript 编译器工具链的一部分进行开发。
  • 据初步基准测试报告,在类型检查工作线程数量相同的条件下,其速度最高可达 TypeScript 7.0 的 8 倍,内存使用量约减少 70%。
  • 使用 Rust 的 tsrs 可用于浏览器开发工具、Cloudflare Workers 等内存受限的 WebAssembly 环境。
  • npm 上的版本仍处于实验阶段,存在已知的行为差异,并计划将 tsrs 和 tsc-rs 整合为一个包。

tsrs 带来的改变#

tsrs 旨在用 Rust 实现 TypeScript,同时保留其现有行为。它并非要提出另一种语言,也不是要为 TypeScript 开辟新方向。语言设计仍由 TypeScript 团队负责,tsrs 需要遵循其决定。

评估时,这一区别很重要。编译器再快,也只有正确理解代码才有用。是否采用 tsrs,应取决于它能否以与官方编译器一致的方式处理项目的类型、配置和诊断信息。

计划的范围不止于命令行类型检查。团队正与 Theo Browne 合作,整合 tsc-rs 和 tsrs,开发支持 TypeScript 全部功能的包,包括 Language Server Protocol 支持和内容映射器。这些是既定目标,并不意味着实验版本已经涵盖所有功能。

谨慎解读基准测试#

备受关注的数据来自 tsrs 与 TypeScript 7.0 在类型检查工作线程数量相同的条件下的比较。据项目方介绍,他们与 TypeScript 团队合作统一了基准测试配置,避免给其中一种实现分配更多资源。

这项比较也说明,作为参照的性能水平正在快速变化。据报告,TypeScript 7.1 测试版的速度最高可达 TypeScript 7.0 的 2.5 倍。官方实现也吸收了 tsrs 的部分优化。因此,相比 7.0 达到 8 倍速度的结果,并不意味着相对于 7.1 测试版或项目当前使用的编译器版本也有同样的优势。

tsrs 默认使用根据机器情况自适应的配置。这可能会增加内存消耗,同时进一步提升速度。要在本地进行有参考价值的比较,请记录以下信息:

  • 编译器的确切版本和命令。
  • 工作线程数量和配置选项。
  • 多次运行时的类型检查耗时。
  • 峰值内存使用量和诊断信息差异。

Rust 为何重要#

开发另一种实现的实际意义,不仅在于加快本地类型检查。Rust 可以在无需附带垃圾回收器的情况下编译为 WebAssembly,因此有望减少受限环境中的内存开销。

因此,tsrs 适合在浏览器或 Cloudflare Workers 上运行的开发环境。如果编译器的内存占用更小,就可能更容易在沙箱中与其他构建工具一起执行类型检查,包括在编码智能体使用的环境中。

这些是潜在的应用场景,并非在所有目标环境中测得的结果。现有基准测试无法说明浏览器启动时间、WebAssembly 包大小或特定 Workers 应用中的内存消耗。如果这些因素会影响决策,请分别验证。

在自己的项目中尝试#

在临时分支或一次性检出目录中安装实验性包。

snippet.txt
npm install --save-dev tsrs
npx tsrs

请先使用一个已经通过 TypeScript 进行检查的项目。记录现有编译器的结果,再以相同配置运行 tsrs。除了运行时间和内存使用量,也要比较报告的错误。正常退出并不意味着两个编译器检查了相同文件,也不意味着结果一致。

评估期间,请保留现有的 TypeScript 检查。如果 tsrs 的结果不同,请先缩小为一个简短的复现示例,再判断哪一方正确。如果要在编辑器中使用,请逐项确认所需的语言服务功能,不要根据命令行性能推断支持情况。

需要确认兼容性#

团队承认,目前与官方 TypeScript 存在差异,例如诊断信息的显示顺序。即使只是顺序不同,也可能影响直接比较编译器输出的脚本或快照。

维持兼容性需要持续投入。拟议流程将使用智能体审查官方实现的变更,跟踪疑似兼容性不足之处,运行兼容性测试并提出修复建议。团队也有意将适用的性能改进回馈给 TypeScript 的 Go 实现。

这一流程属于维护计划,并不能证明目前已完全兼容。在将 tsrs 用于必需检查之前,请核实项目的诊断结果,以及构建所依赖的编译器行为。任一编译器发生变化时,都应重新确认这些结果。

下一步#

在临时分支上选取一个有代表性的项目运行 tsrs,保存与当前 TypeScript 编译器对比的类型检查耗时、峰值内存使用量和诊断结果。

来源:https://blog.cloudflare.com/typescript-rust-port/

目录