Gulpfile可以有效地编译已更改的TypeScript文件

时间:2014-11-17 08:15:40

标签: 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"]);
});

我正在使用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?

1 个答案:

答案 0 :(得分:7)

TypeScript编译器不像大多数语言编译器那样经历单独的编译和链接阶段。所以,它实际上无法完成增量编译。

就像你说的,为了获得类型检查,编译器需要加载并至少重新解析可能被引用的所有文件。

我们在项目中所做的是使用Visual Studio对“编译保存”的支持,这将在我们开发和调试时为我们生成.js文件。 (显然该机制使用noExternalResolve功能)。然后我们依靠单元测试过程和持续集成服务器来运行常规的TypeScript编译,以获得所有语法和输入错误。

因此我建议使用noExternalResolve标志运行您的手表,但也要在工作流程中包含一个步骤,以便在重要点运行完整的TypeScript编译。也许您可以指定某个“根”文件,该文件在更改时启动完整编译,或者您可以找到一些不常发生的事件,您可以使用它来触发常规编译。