我正在尝试编译gulp并观看TypeScript文件。这是我到目前为止所得到的
var tsProject = plugins.typescript.createProject(
{
removeComments: false,
target: 'ES5',
module: 'amd',
noExternalResolve: false,
noImplicitAny: false,
});
var typescriptGlob = [
presentationScriptsDir + '**/*.ts',
definitelyTypedDefinitions
];
gulp.task("compile-typescript", function () {
return gulp.src(typescriptGlob)
.pipe(plugins.typescript(tsProject))
.pipe(gulp.dest(presentationScriptsDir));
});
gulp.task("watch-typescript", function() {
return gulp.watch(typescriptGlob, ["compile-typescript"]);
});
我正在使用gulp-typescript。
但是,由于我们有数百个TypeScript文件,所以每次其中一个文件发生更改时我都不想重新编译它们。上面的代码就是这样(我可以说,因为watch-typescript
至少花费的时间与compile-typescript
相同
我尝试使用gulp-changed,就像这样
gulp.task("compile-typescript", function () {
return gulp.src(typescriptGlob)
.pipe(plugins.changed(presentationScriptsDir, {extension: '.js'}))
.pipe(plugins.typescript(tsProject))
.pipe(gulp.dest(presentationScriptsDir));
});
确实过滤掉了未更改的文件。但是后来打字稿编译器报告错误,因为它只获得一个文件,它缺少通常从其他文件获取的类型声明。
我不想将noExternalResolve
标志设置为true,因为那时很多类型检查都不会完成,这首先打败了使用TypeScript的很多原因。
如何更好地编写这个gulpfile?
答案 0 :(得分:7)
TypeScript编译器不像大多数语言编译器那样经历单独的编译和链接阶段。所以,它实际上无法完成增量编译。
就像你说的,为了获得类型检查,编译器需要加载并至少重新解析可能被引用的所有文件。
我们在项目中所做的是使用Visual Studio对“编译保存”的支持,这将在我们开发和调试时为我们生成.js文件。 (显然该机制使用noExternalResolve功能)。然后我们依靠单元测试过程和持续集成服务器来运行常规的TypeScript编译,以获得所有语法和输入错误。
因此我建议使用noExternalResolve标志运行您的手表,但也要在工作流程中包含一个步骤,以便在重要点运行完整的TypeScript编译。也许您可以指定某个“根”文件,该文件在更改时启动完整编译,或者您可以找到一些不常发生的事件,您可以使用它来触发常规编译。