一个快 10 倍的 TypeScript
devblogs.microsoft.com/typescript/…
Anders Hejlsberg
今天,我很高兴宣布我们正在采取的下一步行动,以彻底提升 TypeScript 的性能。
TypeScript 的核心价值主张是提供卓越的开发者体验。随着代码库的增长,TypeScript 的价值也随之增加,但在许多情况下,TypeScript 无法有效扩展到最大规模的代码库。在大型项目中,开发者可能会遇到较长的加载和检查时间,并且不得不在合理的编辑器启动时间和完整的代码视图之间做出取舍。
我们知道,开发者希望能够自信地重命名变量、查找函数的所有引用、轻松导航代码库,并且所有这些操作都能无延迟地完成。借助 AI 赋能的新体验,需要更大范围的语义信息可用,并且对延迟的要求更严格。同时,我们也希望能够快速执行命令行构建,以验证整个代码库的健康状态。
为实现这些目标,我们已经开始对 TypeScript 编译器和工具进行 原生移植。这一原生实现将 大幅提升编辑器启动速度,将大多数构建时间缩短 10 倍,并 显著降低内存使用。通过移植现有代码库,我们预计 到 2025 年年中,能够预览一个原生实现的 tsc,支持 命令行类型检查,并在 年底前 提供 完整的项目构建功能 和 语言服务。
你可以在我们的 新仓库 中构建和运行 Go 版本的代码,该仓库采用与现有 TypeScript 代码库相同的许可证。请查看 README 了解如何构建和运行 tsc 和语言服务器,以及当前已实现的功能摘要。我们会定期发布更新,提供最新的功能进展。
有多快?
我们的原生实现已经能够加载许多流行的 TypeScript 项目,包括 TypeScript 编译器本身。以下是在 GitHub 上一些不同规模的代码库中运行 tsc 的时间对比:
| 代码库 | 代码行数 (LOC) | 现有版本 (JS) | 原生版本 (Go) | 提速倍率 |
|---|---|---|---|---|
| VS Code | 1,505,000 | 77.8s | 7.5s | 10.4x |
| Playwright | 356,000 | 11.1s | 1.1s | 10.1x |
| TypeORM | 270,000 | 17.5s | 1.3s | 13.5x |
| date-fns | 104,000 | 6.5s | 0.7s | 9.5x |
| tRPC (server + client) | 18,000 | 5.5s | 0.6s | 9.1x |
| rxjs (observable) | 2,100 | 1.1s | 0.1s | 11.0x |
虽然我们尚未完全实现所有功能,但这些数据已经能够代表 大多数代码库将获得数量级的性能提升。
我们对这次性能的 巨大飞跃 充满期待。这不仅提升了当前的开发体验,还为未来的 AI 赋能工具创造了更多可能。原生版本将能够提供 即时、全面的错误列表,支持更先进的 重构功能,并带来更深入的代码分析能力——而这些在过去都因性能成本过高而难以实现。
编辑器速度
大多数开发者的时间都花在编辑器里,因此编辑器性能至关重要。我们希望大型项目能够快速加载,并且在各种情况下都能保持流畅的响应速度。
现代编辑器(如 Visual Studio 和 VS Code)在底层 语言服务快速 的情况下,通常能够提供出色的性能。借助原生实现,我们将带来 极其流畅的编辑器体验。
仍然以 VS Code 代码库 为例,在高性能计算机上,当前 在编辑器中加载整个项目需要约 9.6 秒。而使用原生语言服务后,这个时间 缩短到 1.2 秒,相当于 8 倍的提升!
这意味着,从 打开编辑器 到 开始输入 TypeScript 代码 之间的等待时间大幅减少。我们预计 所有项目 都会在加载时间上获得类似的提升。
整体内存使用量 也减少了 约 50%,尽管我们尚未专门进行优化,未来仍有望进一步降低。所有语言服务操作(包括 代码补全、快速信息、跳转定义、查找引用)的响应速度也将显著提升。此外,我们还将 迁移到 LSP(语言服务器协议),以更好地与其他语言生态保持一致。
版本规划
我们最近发布了 TypeScript 5.8,并即将推出 TypeScript 5.9。现有的 JS 代码库 将继续 发展到 6.x 版本,而 TypeScript 6.0 将引入一些 弃用和破坏性变更,以与即将推出的 原生代码库 对齐。
当原生版本 达到足够的功能对等性 时,我们将正式发布 TypeScript 7.0。我们将在开发过程中 持续发布稳定性和功能进展。
为了方便理解,我们将 JavaScript 版 直接称为 TypeScript 6 (JS),而 原生版 则称为 TypeScript 7 (Native)。在内部讨论或代码注释中,你可能还会看到“Strada”(TypeScript 的原始代号)和“Corsa”(本次移植的代号)。
有些项目可以在 TypeScript 7 发布后 直接迁移,但另一些可能依赖于 特定 API、旧配置 或 其他限制,需要继续使用 TypeScript 6。由于 TypeScript 在 JavaScript 开发生态中 至关重要,我们将在 TypeScript 7+ 成熟之前 继续 维护 TypeScript 6.x。
我们的 长期目标 是让 这两个版本尽可能保持一致,以便你可以 随时迁移到 TypeScript 7,或者在 需要时回退到 TypeScript 6。
下一步
在接下来的几个月里,我们将分享更多关于 这一激动人心的变革 的细节,包括:
- 深入的性能解析
- 全新编译器 API
- LSP 支持
- 更多技术细节
我们在 GitHub 仓库的 FAQ 页面中 解答了许多常见问题,欢迎查看。此外,我们还将在 3 月 13 日 PDT 上午 10 点 / UTC 下午 5 点,在 TypeScript 社区 Discord 上 举办 AMA(问我任何问题)活动,期待你的参与!
10 倍的性能提升 是 TypeScript 和 JavaScript 开发体验的一次巨大飞跃,我们希望你和我们一样,对此充满期待!🚀