Kla*_*urn 5 javascript typescript gulp gulp-watch gulp-changed
我正在努力使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"]);
});
Run Code Online (Sandbox Code Playgroud)
我正在使用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));
});
Run Code Online (Sandbox Code Playgroud)
这确实过滤掉了未更改的文件.然后,打字稿编译器会报告错误,因为它只获取单个文件,该文件缺少通常从其他文件获取的类型声明.
我不想将noExternalResolve标志设置为true,因为那时很多类型检查都不会完成,这首先打败了使用TypeScript的很多原因.
我怎样才能更好地编写这个gulpfile?
TypeScript编译器不像大多数语言编译器那样经历单独的编译和链接阶段.所以,它实际上无法完成增量编译.
就像你说的,为了获得类型检查,编译器需要加载并至少重新解析可能被引用的所有文件.
我们在项目中所做的是使用Visual Studio对"编译保存"的支持,这将在我们开发和调试时为我们生成.js文件.(显然该机制使用noExternalResolve功能).然后我们依靠单元测试过程和持续集成服务器来运行常规的TypeScript编译来获取所有语法和输入错误.
因此,我建议使用noExternalResolve标志运行您的手表,但也要在工作流程中包含一个步骤,以便在重要点运行完整的TypeScript编译.也许您可以指定某个"根"文件,该文件在更改时启动完整编译,或者您可以找到一些不常发生的事件,您可以使用它来触发常规编译.