推出 tsrs:TypeScript 的 Rust 移植版

💡 原文英文,约1600词,阅读约需6分钟。
📝

内容提要

Cloudflare与VoidZero正与Owner.com的Max Schwenk合作开发tsrs,这是TypeScript编译器的Rust移植版,在Oxc工具链中孵化,并与TypeScript团队紧密协作。tsrs并非TypeScript的分支,语言设计仍由TypeScript团队掌控。早期基准显示,在相同类型检查工作线程数下,tsrs比TypeScript 7.0快至多8倍,内存占用减少约70%。Rust编译为WebAssembly时内存效率高,适合在Cloudflare Workers、浏览器及嵌入式设备中运行完整开发工具链。维护上采用类似Vinext的自动化流程,每日同步上游变更,并将性能优化回馈TypeScript Go代码库。

🔎

延伸解读

性能对比需注意基准条件

文章强调,tsrs 的 8 倍加速和约 70% 内存节省是在与 TypeScript 7.0 相同类型检查工作线程数下测得,且与 TypeScript 团队确认了配置一致。同时指出,TypeScript 7.1 beta 已比 7.0 快至多 2.5 倍,部分优化来自 tsrs 回馈。读者应留意,不同移植项目的性能宣称可能因机器类型和选项不同而失真。

Rust 与 Wasm 结合带来部署灵活性

文章解释选择 Rust 的关键原因之一是 WebAssembly 场景下的内存效率:Go 编译为 Wasm 需附带垃圾回收器,而 Rust 的内存管理模型使 guest 与 host 间内存交互更直接。这使得完整开发工具链可运行在 Cloudflare Workers、浏览器、嵌入式设备或 IoT 应用中,而不仅限于传统服务器环境。

维护策略旨在避免与上游分叉

tsrs 采用类似 Vinext 的自动化流程:每日由代理审查上游变更、获取差异并创建跟踪问题,每晚重新生成兼容性矩阵并运行 TypeScript 测试套件。发现差距时,代理可定位变更、构建复现、移植测试并提出修复。性能优化会尝试回馈 TypeScript Go 代码库。文章也承认当前存在诊断输出顺序等差异,目标是在稳定版发布前最小化。

定位是补充而非替代 TypeScript

文章明确 tsrs 不是 TypeScript 的分支,语言设计仍由 TypeScript 团队掌控。其目标是提供更快的检查体验,并探索与 Oxlint 等工具链的深度集成,例如类型感知的 lint 规则。对于关注工具链性能的开发者,tsrs 目前是实验性发布,可通过 npm 安装试用,但需注意其与上游的差异尚未完全消除。

❓

Q&A

tsrs 是什么?它和 TypeScript 官方是什么关系?

tsrs 是 TypeScript 编译器的 Rust 移植版,由 Cloudflare、VoidZero 与 Owner.com 的 Max Schwenk 合作开发,在 Oxc 工具链中孵化。它不是 TypeScript 的分支,语言设计仍由 TypeScript 团队掌控,tsrs 严格遵循上游实现。

tsrs 相比 TypeScript 7.0 性能提升多少?

在相同类型检查工作线程数下,tsrs 比 TypeScript 7.0 快至多 8 倍,内存占用减少约 70%。默认配置下还会根据机器类型自适应,使用更多内存但速度更快。

为什么选择用 Rust 而不是 Go 来移植 TypeScript?

虽然 TypeScript 的 Go 移植版已大幅提速,但 Rust 在编译为 WebAssembly 时内存效率更高:Go 编译到 Wasm 需附带垃圾回收器,而 Rust 的内存管理模型使 Wasm guest 与 host 之间内存交互更简单,适合在 Workers、浏览器及嵌入式设备中运行完整工具链。

如何试用 tsrs?

可以通过 npm 安装实验版本:先运行 npm install tsrs,然后使用 npx tsrs 命令。

tsrs 项目如何维护并与上游 TypeScript 保持同步?

采用类似 Vinext 的自动化流程:每天由代理审查上游变更、获取差异并创建跟踪 issue,每晚重新生成兼容性矩阵并运行 TypeScript 测试套件。发现性能优化时会回馈到 TypeScript Go 代码库,并尽量减少与上游的差异。

tsrs 目前有哪些已知差异或限制?

目前与上游 TypeScript 存在一些差异,例如诊断信息的打印顺序不同。项目目标是在发布稳定版前将这些差异降到最低。

🏷️

标签

➡️

继续阅读