← 返回信息流
AI 资讯Hacker News·3 小时前

TypeScript 7 RC 编译器重写为 Go 语言,速度提升约 10 倍

原标题:TypeScript 7 RC: the compiler rewritten in Go, around 10x faster

速览

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: es5
  • moduleResolution: node
  • baseUrl
  • module: amd/umd/systemjs

默认值变更:

  • strict 现在默认为 true
  • module 默认为 esnext

两个容易让人措手不及的变化:

  1. rootDir 现在默认为 ./(通常需要将指向改回 ./src)。
  2. 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 默认为 truemodule 默认为 esnextrootDir 默认为 ./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,微软不仅解决了长期存在的性能瓶颈

查看原文 →jatniel.dev