You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript编译器API中正确使用--incremental编译选项?

如何在TypeScript编译器API中正确使用--incremental编译选项

我看到你遇到的问题了——用ts.createProgram搭配incremental: true和tsBuildInfoFile选项时,既没生成build info文件,第二次运行速度也没提升,甚至设置无效路径都没反应。这是因为**ts.createProgram本身不会自动处理增量编译的状态持久化**,你需要改用专门为增量编译设计的API来实现这个功能。

问题根源

ts.createProgram是TypeScript编译器API的基础入口,但它默认不会读取或写入.tsbuildinfo文件——即使你设置了incremental和tsBuildInfoFile选项。它只会在内存中处理增量逻辑,但不会将状态持久化到磁盘,所以每次运行都是从头开始编译,自然看不到速度提升,也不会生成build info文件(或者生成了也不会被复用)。

正确解决方案:使用ts.createIncrementalProgram

TypeScript提供了ts.createIncrementalProgram方法,它封装了增量编译所需的状态读取、追踪和写入逻辑,会自动处理.tsbuildinfo文件的加载和更新。修改你的代码如下:

import * as ts from "typescript";

// 使用createIncrementalProgram替代createProgram
const program = ts.createIncrementalProgram({
  rootNames: ["./src/foo.ts"],
  options: { 
    incremental: true, 
    tsBuildInfoFile: "./my-build-info.tsbuildinfo" // 建议使用.tsbuildinfo后缀,更清晰
  },
});

const emitResult = program.emit();
console.log('Emitted result:', JSON.stringify(emitResult));

为什么这样能生效?

  1. 自动读取build info:第一次运行时,因为没有my-build-info.tsbuildinfo文件,它会执行全量编译,然后自动将编译状态写入该文件。
  2. 增量编译复用:第二次运行时,它会读取已有的build info文件,对比文件变化,只编译修改过的部分,速度会明显提升。
  3. 路径有效性校验:如果你设置一个无效的路径(比如"@@@@@@"),TypeScript在尝试写入build info时会抛出错误,你就能立刻发现路径问题了。

额外注意事项

  • 确保tsBuildInfoFile的路径是可写的,避免权限问题。
  • 如果需要更精细的控制(比如自定义build info的读取/写入逻辑),可以实现IncrementalProgramHost接口,传递给ts.createIncrementalProgram的host参数。
  • 当你修改了编译器选项或项目结构(比如新增/删除文件),TypeScript会自动触发全量编译,无需手动删除build info文件。

内容的提问来源于stack exchange,提问作者Max Heiber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:03:03