本文由林不渡和 Deepseek 冠名完成。
本文部分内容参考: www.totaltypescript.com/typescript-...
TypeScript 在昨天官宣使用 Go 语言 对 TypeScript 进行全面重写(blog: devblogs.microsoft.com/typescript/...%25E3%2580%2582 "https://devblogs.microsoft.com/typescript/typescript-native-port/)%E3%80%82")
在基准测试中,在一些大型的 TypeScript 项目中使用 tsc
进行编译能得到 10 倍左右的速度提升,更有一些其他项目能有 15 倍左右的提升,参考 Blog 里面给出的基准项目参考:
近些年的 TS 更新中,也有一些关于性能提升做出的努力,例如 TypeScript 5.0 的一次 namespace 到 module 变更(devblogs.microsoft.com/typescript/...), 当时性能大概提升了 10%,但也是杯水车薪。
开源社区中也有使用原生语言对 TSC 进行重写的案例,例如 swc 作者 kdy 大神的 STC(Rust Rewrite TS Compiler)项目(github.com/dudykr/stc)...%25EF%25BC%258C%25E5%258F%25AF%25E4%25BB%25A5%25E7%259C%258B%25E5%2588%25B0%25E6%259C%2580%25E6%2596%25B0%25E7%259A%2584 "https://github.com/dudykr/stc)%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E6%9C%80%E6%96%B0%E7%9A%84") commit 也定格在两年前不了了之。
同样,在 deno 的 issue 也能看到关于用 Rust 重写 TS Compiler (github.com/denoland/de...%25E7%259A%2584%25E8%25AE%25A8%25E8%25AE%25BA "https://github.com/denoland/deno/issues/5432)%E7%9A%84%E8%AE%A8%E8%AE%BA"):
在这个 issue 经过漫长吃瓜群众们讨论后,最后定格在 nodejs 作者,现 deno 作者 RY 大神的一句结论里:
这张图曾一度被笔者用作飞书背景图片。在高手天才频出的开源社区,即使强如 kdy 和 ry 也没办法完成对 tsc 的重写,笔者曾一度感到这几乎是不可能完成的工作。
笔者之前在维护前端框架仓库时,比较关心 TSC 在 CI 以及业务项目中的性能进度,对于有性能提升的 TS 版本,都会选择一时间跟进升级,但似乎也没办法享受到像 Rspack 之于 Webpack 一般碾压的构建性能提升,一度觉得很遗憾。
最后还是得 TypeScript 的首席架构 Anders 老爷子出手,终结了社区中关于使用 Native language rewrite TS Compiler 的讨论。
发布时间
这个特性目测将会在 TypeScript 7.0 发布,目前拆分了一个单独的仓库(github.com/microsoft/t...%25E5%259C%25A8%25E5%25BC%2580%25E5%258F%2591%25EF%25BC%258C%25E5%25BD%2593%25E8%25BF%2599%25E4%25B8%25AA%25E4%25BB%2593%25E5%25BA%2593%25E6%2594%25AF%25E6%258C%2581%25E7%259A%2584%25E8%2583%25BD%25E5%258A%259B%25E5%25B7%25AE%25E4%25B8%258D%25E5%25A4%259A%25E5%2592%258C%25E5%258E%259F%25E6%259D%25A5%25E4%25BB%2593%25E5%25BA%2593%25E8%2583%25BD%25E5%258A%259B%25E4%25BF%259D%25E6%258C%2581%25E4%25B8%2580%25E8%2587%25B4%25E7%259A%2584%25E6%2597%25B6%25E5%2580%2599%25EF%25BC%258C%25E9%2582%25A3%25E5%25B7%25AE%25E4%25B8%258D%25E5%25A4%259A%25E5%25B0%25B1%25E5%2588%25B0%25E4%25BD%258D%25E4%25BA%2586%25E3%2580%2582%25E6%258C%2589%25E7%2585%25A7%25E8%25A7%2584%25E5%2588%2592%25E6%2597%25B6%25E9%2597%25B4%25E5%25A4%25A7%25E7%25BA%25A6%25E5%259C%25A8 "https://github.com/microsoft/typescript-go)%E5%9C%A8%E5%BC%80%E5%8F%91%EF%BC%8C%E5%BD%93%E8%BF%99%E4%B8%AA%E4%BB%93%E5%BA%93%E6%94%AF%E6%8C%81%E7%9A%84%E8%83%BD%E5%8A%9B%E5%B7%AE%E4%B8%8D%E5%A4%9A%E5%92%8C%E5%8E%9F%E6%9D%A5%E4%BB%93%E5%BA%93%E8%83%BD%E5%8A%9B%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E9%82%A3%E5%B7%AE%E4%B8%8D%E5%A4%9A%E5%B0%B1%E5%88%B0%E4%BD%8D%E4%BA%86%E3%80%82%E6%8C%89%E7%85%A7%E8%A7%84%E5%88%92%E6%97%B6%E9%97%B4%E5%A4%A7%E7%BA%A6%E5%9C%A8") 33 个月之后,届时可以关注林不渡公众号关于 TypeScript 7.0 Beta 发布内容介绍 :),不过测试版本应该在 25 年有望可以使用到。
对于社区的影响
首先是 tsc,它会快 10 倍,这意味着 TypeScript 代码检查会更加快,举个例子,假如用 webpack 来开发项目,ts-loader
或者 fork-ts-checker-webpack-plugin
这类插件速度都会快到飞起。
如果你用 rsbuild 或者 rspack 去构建一个前端 TypeScript 项目,本身因为有 swc (Rust 开发)做 TypeScript 到 JavaScript 的 transformer,再加持一波用 go 开发的 typescript 去做 type checker,那么速度只会更快。
而且更夸张的是,你不用对你原来的 TypeScript 仓库代码做任何修改,理论上只用迭代 TS 到对应版本就可以享受到了。
其实就类似我们时常保持项目工具链版本的迭代,有时候就能享受到更快的开发体验或以及更好的性能,例如时常升级 node 版本、更新 Webpack 版本等等。
其次对于开发 TS 项目时的 LSP 性能会有显著提升,举个例子,在开发大型 Monorepo 项目时,我们时常会遇到 TS Server 卡死导致语言服务崩掉的情况,以前我们可能会通过各种黑科技配置去处理这类问题(例如禁用掉软连接之类的操作),但现在我们只用升级 TS 版本即可享受到了。
这里只要是使用了 TS 语言服务的代码编辑器都会得到提升,例如 VSCode、Cursor、Windsurf 等等。
为什么选择 Go 开发?
TypeScript 官方开发团队在 FAQ 中已经发布了关于这部分内容: github.com/microsoft/t... 。
里面也提到了他们调研了目前社区里面一些优秀的用原生语言开发的项目,例如 swc、oxc 、esbuild。最终出于两个代码仓库需要同步维护的主要原因,选择了使用 Go,因为 TypeScript 和 Go 两个语言在语义以及代码结构上都极其类似,相比较之下,这会让移植到 Go 的工作很更简单:
参考 Anders 的 Youtube 演讲(原地址: www.youtube.com/watch?v=pNl...%25E6%2588%25AA%25E5%259B%25BE%25EF%25BC%258C%25E5%25B7%25A6%25E8%25BE%25B9%25E6%2598%25AF "https://www.youtube.com/watch?v=pNlq-EVld70)%E6%88%AA%E5%9B%BE%EF%BC%8C%E5%B7%A6%E8%BE%B9%E6%98%AF") go 语言,右边是 TypeScript。如果用 Github Compilot 来开发,可能很快就补全完了 :)。
至于同样作为 C# 之父,为啥不用 C# 去开发 Andres,可以参考视频这段关于 Andres 的采访: www.youtube.com/watch?v=10q... ,其实主要还是 C# 在老爷子看来并不算一个全平台的语言,还有一部分原因是因为 C# 主要是 OOP 范式语言,目前 TS 仓库的代码主要是通过 FP 风格的代码来完成编写,这同样会让移植工作变得更加困难。
怎么去体验新的 TypeScript?
直接访问 github.com/microsoft/t... 参考 RADME 说明即可。
为什么要用 native languange 去重写?
主要因为目前 JavaScript 是单线程的,一次只能在一个 CPU 核心上跑,例如 Rust 和 Go 之类的语言有内置的多线程支持,这意味着它们可以使用多个 CPU 核心上去并行处理更多的工作,这也是为啥 ESBuild 、SWC 之类工具快的主要原因。