gulp-typescript增量编译如何工作?

Max*_*ber 7 incremental-build typescript gulp-typescript

gulp-typescript的README说它支持渐进式编译,但没有解释在这种情况下该术语的含义.

有一个问题讨论gulp-typescript增量编译比tsc慢,但它没有解释原因,或者有什么区别.

什么是gulp-typescript在进行"增量编译"时所做的事情?

我尝试了什么

我正在查看gulp-typescript的源代码,看起来gulp-typescript根本没有进行任何增量编译.当Project被创建时,它关闭在的一个实例ProjectInfo,它有一个input构件,其是一个FileCache.FileCache几乎是从文件名到源字符串的映射.在gulp-typescript中维护的其他状态并不多Project.

为了使用TS编译器API进行实际的增量编译(在后续版本中重用编译过程的产品),我希望看到以下之一:

但我没有看到源头中的任何一个.

小智 6

Gulp-typescript 有两种不同的方式来编译你的文件。默认方法编译整个项目并进行类型检查。这是ProjectCompilerlib/compiler.ts. 另一个单独编译每个文件,并在您设置isolatedModules: true. 该方法FileCompilerlib/compiler.ts.

FileCompiler 只需要编译改变的文件。未更改的文件被缓存,就像 Achmedzhanov 在他的回答中描述的那样。

然而,大多数用户使用 ProjectCompiler,因为类型检查可能是他们使用 TypeScript 的原因。我认为您的问题与此 ProjectCompiler 有关。增量编译由ts.createProgramTypeScript API 导出的调用处理。通过传递旧程序,TypeScript API 将重用之前编译的一些信息。你可以在这里找到源代码:

https://github.com/ivogabe/gulp-typescript/blob/ea22fb7fe4295979e32a9d07b007e3f7473be8b5/lib/compiler.ts#L80

这曾经足以进行增量编译,但在较新版本的 TypeScript 中已经发生了变化。我们将需要切换到新的 API,可能使用您提到的 API 之一,但我不熟悉这些。

在您的问题中,您提到了 FileCache。这用于存储在输入流中传递的所有文件。gulp API 即提供流中的所有文件,而 TypeScript API 是同步的。因此,我们需要等到我们拥有所有输入文件。此外,我们使用 FileCompiler 中的 FileCache 来检测文件是否已更改,从而是否需要重新编译它。