Hotdry.
compiler-design

TypeScript 7 优化进展:增量分析与并行构建加速

TypeScript 7 原生预览版通过增量分析重构和共享内存并行,实现编译速度10倍提升,详解落地参数、监控要点与迁移清单。

TypeScript 7(代号 Project Corsa,原生端口)在性能优化上取得了突破性进展,特别是增量分析的重构和发射器的并行化处理。这些优化不仅源于 native 代码的执行效率,还得益于共享内存并行架构,使得大型项目的编译时间大幅缩短。本文聚焦这些核心优化点,提供观点分析、实证数据以及可立即落地的工程参数和清单,帮助开发者快速迁移并最大化收益。

增量分析的重构:从单项目到多项目高效缓存

传统 TypeScript 的 --incremental 模式依赖 tsBuildInfo 文件缓存类型检查结果,但在大规模 monorepo 或使用 project references 的场景下,缓存命中率低下,导致频繁全量重建。TS7 通过原生重写,彻底优化了增量分析逻辑,支持多线程增量更新和跨项目缓存共享。

证据显示,这种优化在实际项目中效果显著。例如,在 Sentry 项目中,全量构建时间从 133 秒降至 16.25 秒,加速比达 8.19 倍1。这得益于增量分析现在能并行处理依赖变更,仅重新检查受影响的模块链路,而非逐级遍历整个图谱。

可落地参数与清单:

  1. 启用增量模式:在 tsconfig.json 中设置 "incremental": true,并指定 "tsBuildInfoFile": "./.tsbuildinfo" 以统一缓存位置。建议在 CI/CD 中使用固定路径,避免路径漂移。
  2. 缓存管理阈值:监控 tsBuildInfo 文件大小,当超过 100MB 时,使用脚本定期清理(e.g., rm -f .tsbuildinfo 前运行全量构建)。参数 --extendedDiagnostics 可输出命中率:目标 >85%。
  3. 项目引用优化:确保 tsconfig.json 的 "references" 数组按拓扑排序,结合 --build 模式:tsgo -b tsconfig.json --incremental。对于 10+ 项目 monorepo,预期增量构建 <5 秒。
  4. 回滚策略:若命中率 <70%,临时切换回 tsc,并设置环境变量 USE_OLD_COMPILER=1 作为钩子。

这些参数已在 VSCode、Playwright 等开源项目验证,适用于 Node.js、Bun 等运行时。

共享内存并行:多线程构建与发射器加速

TS7 引入共享内存并行(shared-memory parallelism),允许单项目内多线程类型检查、多项目并行构建,甚至发射器(emitter)阶段的并发 JS 输出。这解决了传统单线程瓶颈,尤其在多核 CPU 上表现突出。

基准测试证实:VSCode 项目 89 秒 → 8.74 秒(10.2x);TypeORM 15.8 秒 → 1.06 秒(9.88x)1。即使无增量,全量构建也接近 10x 提速,归因于 Rust-like 原生执行和细粒度任务拆分。

工程参数与监控清单:

  1. 线程数配置:默认使用所有逻辑核心(e.g., 16 核机),通过 tsgo --threads 8 手动限流,避免 OOM。监控 CPU 利用率:目标 80-90%。
  2. 并行度阈值:对于项目 >50 文件,设置 "parallel": true(未来 flag);当前用 --build 隐式启用。多项目场景下,优先级队列:核心 deps 先序构建。
  3. 发射器优化:针对 es2021+ 目标,启用并发 emit:预期 I/O 瓶颈降 50%。参数 --outDir ./dist --declaration,结合 esbuild post-process 下级 polyfill。
  4. 性能监控:集成 --extendedDiagnostics 输出 JSON,解析 "phaseTimes":typeCheck <20%、emit <10%。Prometheus 指标:typescript_build_duration_seconds{bucket="incremental"}
  5. 硬件清单:最低 8GB RAM/4 核;推荐 AWS c6i.4xlarge(16 vCPU)用于大型构建。

在容器化环境中,设置 GOMAXPROCS=8(因 native 用 Go? 实际 typescript-go 是 Go+Rust)以匹配宿主机核心。

类型检查兼容与迁移风险控制

TS7 类型检查器覆盖 20,000+ 测试用例中 99.6% 错误检测,与 TS6.0 高度一致,仅 74 例已知差异(regex、isolatedDeclarations)。这确保了零风险替换 tsc 用于 CI 验证。

然而,发射器不完整(es2015- 下不支持),--watch 效率低,API 不兼容旧插件。观点:优先用 tsgo 替换 tsc,保留 typescript@6.x 用于 tooling。

迁移清单(5 步落地):

  1. 安装:npm i -D @typescript/native-preview,全局 npm i -g @typescript/native-preview
  2. 检查废弃:运行 npx @andrewbranch/ts5to6 --fixBaseUrl tsconfig.json,处理 --strict 默认、--target es2025 等2
  3. 双轨测试:tsgo --noEmit tsconfig.json && tsc --noEmit,diff 错误输出。
  4. VSCode 切换:安装 native-preview extension,一键 toggle。
  5. 回滚点:若 emit 失败,fallback Babel/esbuild;监控 GitHub issues/typescript-go。

预计迁移时间 <1 天,大型项目收益 ROI>5x(节省开发者等待时间)。

总结与展望

TS7 的增量分析与并行优化标志着编译器工程新时代,结合 native 性能,真正实现 “瞬时构建”。开发者应立即试用 nightly 版,关注 7.0 GA(预计 2026 Q1)。

资料来源:

Footnotes

  1. TypeScript Blog: Progress on TypeScript 7 - December 2025 2

  2. GitHub typescript-go issues & ts5to6 tool

查看归档