TypeScript 7 RC 编译器重写为 Go 语言,速度提升约 10 倍
速览
TypeScript 7 候选版本(RC)正式发布,其编译器核心已完全重写为 Go 语言。这一重大架构变更使得编译速度提升了约 10 倍,显著改善了开发体验。此举旨在解决 TypeScript 长期存在的性能瓶颈,为大型项目提供更高效的构建支持。
AI 深度解读
TypeScript 7 RC:编译器重写为 Go,速度提升约 10 倍
微软刚刚发布了 TypeScript 7 的候选版本(Release Candidate, RC),预计稳定版将于下个月推出。这一次的重磅新闻并非新增语法或配置标志,而是整个编译器已完全使用 Go 语言重写。
背景
在过去的一年中,TypeScript 团队系统地将其现有的代码库(此前是编译为 JavaScript 的 TypeScript)移植到了 Go 语言。这一过程并非从零开始重写,而是基于当前实现进行的逐步移植,因此类型检查逻辑在结构上与 TypeScript 6 保持完全一致。这意味着开发者无需改变编写 TypeScript 代码的方式,即可获得显著的性能提升。
TypeScript 6 作为过渡版本,并未引入重大新功能,而是为 TypeScript 7 铺平道路。它通过警告那些将在 TypeScript 7 中变为硬错误(hard error)的选项和语法,帮助项目提前适应变化。
核心内容
为什么速度提升如此显著?
这种速度提升并非魔法,而是源于 Go 语言本身的特性。Go 编译为原生代码,并通过共享内存充分利用并行处理能力。微软报告称,构建速度通常比 TypeScript 6 快约 10 倍。这一数据来自微软自身的测量,以及 Figma、Bloomberg、Vercel、Notion 和 Slack 等公司的测试反馈,这些公司在过去一年中一直测试预发布版本,并报告了类似的性能增益。
不仅仅是 tsc 命令行
语言服务器协议(Language Server Protocol, LSP)——即驱动编辑器中自动补全、类型悬停提示和实时错误检查的核心组件——也运行在同一基础架构之上。因此,编辑器响应速度大幅加快,这将是大型项目日常开发中最直观的感受。
该代码库已开源(采用 Apache 2.0 许可证,GitHub 星标超过 25,000),其中约 85% 的代码为 Go 语言。对于一个体量如此庞大且来自微软的项目而言,押注 Go 语言并非显而易见的选择。
TypeScript 6:不可跳过的步骤
TypeScript 7 继承了 TypeScript 6 的默认设置,而 TypeScript 6 中已弃用的内容现在将变为硬错误。由于 TypeScript 6 发布不久,许多项目需要进行适配。
变为硬错误的示例:
target: es5moduleResolution: nodebaseUrlmodule: amd/umd/systemjs
默认值变更:
strict现在默认为truemodule默认为esnext
两个容易让人措手不及的变化:
rootDir现在默认为./(通常需要将指向改回./src)。types默认为[],因此必须显式列出你的@types包。
并行运行 TypeScript 6 和 7
并非所有工具都能一夜之间兼容 TypeScript 7。例如,typescript-eslint 直接导入 typescript 包,而稳定的编程式 API 要等到 TypeScript 7.1(几个月后)才会落地。
为此,微软设计了让两个版本共存而不冲突的机制。兼容性包 @typescript/typescript6 提供了 tsc6 二进制文件并重新导出了 6 版本的 API。通过在 package.json 中使用 npm 别名,可以实现并行运行:
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.0",
"typescript-7": "npm:typescript@rc"
}
}
在此配置中,linting 工具查找的 typescript 包实际上指向稳定的版本 6,而 npx tsc 则使用版本 7 编译项目的其余部分。这是一种标准的并行变更策略:版本 6 保持 linting 整洁,版本 7 加速其他所有操作。工具兼容性预计将在 TypeScript 7.1 左右趋于稳定。
并行化、检查器和 Watch 模式
TypeScript 7 对多个步骤进行了并行化处理:解析、类型检查和代码生成(emit)。解析和代码生成可以轻松地跨文件拆分。类型检查则更为复杂,因为文件之间存在依赖关系,因此团队启动固定数量的工作进程,以确定性方式共享工作:相同的输入文件产生相同的输出结果。
- 默认工作进程数:4 个,可通过
--checkers调整。 - 多核优化:如果拥有更多核心,可以提高此数值,但代价是内存占用增加。在资源受限的 CI 环境中,则应降低此数值。
- Monorepo 支持:
--builders允许同时构建 monorepo 中的多个项目。注意,该选项与--checkers的效果是相乘的:使用--checkers 4 --builders 4时,最多可同时运行 16 个类型检查器。 - 单线程模式:
--singleThreaded强制使用单线程,便于调试或与版本 6 进行对比。
Watch 模式也是基于 Parcel 的文件监视器重建的,并同样移植到了 Go 语言中。不再需要对庞大的 node_modules 文件夹进行昂贵的轮询,文件监视变得更加轻量。
试用命令
安装 RC 版本:
npm install -D typescript@rc
检查版本:
npx tsc --version
# Version 7.0.1-rc
像往常一样编译,只是速度更快:
npx tsc
调整类型检查工作进程数量:
npx tsc --checkers 8
强制单线程以与版本 6 对比:
npx tsc --singleThreaded
使用别名同时安装版本 6 和 7:
npm install -D typescript@npm:@typescript/typescript6
npm install -D typescript-7@npm:typescript@rc
体验夜间构建版本(Nightlies):
npm install -D @typescript/native-preview
npx tsgo --version
注意:夜间构建的二进制文件仍称为 tsgo。一旦 TypeScript 7 正式发布稳定版,所有内容将移回 typescript 包。
关键要点
- 编译器重写:TypeScript 7 编译器完全使用 Go 语言重写,代码库约 85% 为 Go。
- 性能飞跃:构建速度提升约 10 倍,得益于 Go 的原生编译和共享内存并行处理。
- 编辑器体验:LSP 底层同样重写,自动补全和实时错误检查响应更快。
- 向后兼容:类型检查逻辑与 TypeScript 6 结构一致,无需修改代码即可享受速度红利。
- 默认值变更:
strict默认为true,module默认为esnext,rootDir默认为./,types默认为[]。 - 弃用项变硬错误:TypeScript 6 中弃用的选项(如
target: es5,moduleResolution: node等)在 TypeScript 7 中将导致编译错误。 - 并行运行策略:通过
@typescript/typescript6包和 npm 别名,可在同一项目中并行使用 TypeScript 6(用于 linting)和 TypeScript 7(用于编译)。 - 配置优化:新增
--checkers和--builders参数以控制并行度,--singleThreaded用于调试。 - Watch 模式改进:基于 Go 实现的 Parcel 文件监视器,消除了对
node_modules的轮询开销。 - 过渡建议:建议先迁移至 TypeScript 6 清除警告,再测试 TypeScript 7 RC,稳定版预计下月发布。
意义与影响
TypeScript 7 的发布标志着 TypeScript 生态系统的重大技术转型。通过将编译器核心从 JavaScript/TypeScript 移植到 Go,微软不仅解决了长期存在的性能瓶颈
