如何在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));
为什么这样能生效?
- 自动读取build info:第一次运行时,因为没有
my-build-info.tsbuildinfo文件,它会执行全量编译,然后自动将编译状态写入该文件。 - 增量编译复用:第二次运行时,它会读取已有的build info文件,对比文件变化,只编译修改过的部分,速度会明显提升。
- 路径有效性校验:如果你设置一个无效的路径(比如
"@@@@@@"),TypeScript在尝试写入build info时会抛出错误,你就能立刻发现路径问题了。
额外注意事项
- 确保
tsBuildInfoFile的路径是可写的,避免权限问题。 - 如果需要更精细的控制(比如自定义build info的读取/写入逻辑),可以实现
IncrementalProgramHost接口,传递给ts.createIncrementalProgram的host参数。 - 当你修改了编译器选项或项目结构(比如新增/删除文件),TypeScript会自动触发全量编译,无需手动删除build info文件。
内容的提问来源于stack exchange,提问作者Max Heiber
相关产品推荐
相关产品推荐

