gulp.watch - 返回或不返回

时间:2015-11-17 13:59:19

标签: gulp

gulpjs/gulp的官方文档包含示例gulpfile.js,其中提供的watch任务没有return声明:

gulp.task('watch', function() { gulp.watch(paths.scripts, ['scripts']); gulp.watch(paths.images, ['images']); });

这种方法符合我的需要,因为我想观察多组文件,每组文件都有不同的任务。

但我在社区中发现了一些大胆的陈述,说明应该返回gulp.watch,例如this one,提出以下代码:

gulp.task('watch', function() { return gulp.watch('./public/resources/jsx/project/*.js',['application']) });

我理解任务应该返回,因此使用它们作为其工作流程一部分的其他任务能够根据其异步性质采取相应行动,但对于watch任务的特殊情况,这始终是最后一项在任务列表中,可能有意义不返回它,使得可以有多个手表。

这有意义吗?我可以安全地省略watch任务的返回,以便能够在其中包含多个gulp.watch个实例吗?

3 个答案:

答案 0 :(得分:3)

我更喜欢所有任务都有return语句。否则你可以阅读一个虚假的“完成手表”。 当任务很复杂时,无法为多个文件模式创建单个监视。在这种情况下,我的解决方案基于创建一个名为“watch”的超级组任务,该任务依赖于单个手表及其返回语句。

gulp.task("watch", [
    "watch-css",
    "watch-js",
    "watch-inject-html"
]);

gulp.task("watch-css", function() {
  return gulp.watch(sources.css, ["css"]);
});

gulp.task("watch-js", function() {
  return gulp.watch(sources.js, ["js"]);
});

gulp.task("watch-inject-html", function() {
  return gulp.watch(sources.inject, ["inject-html"]);
});

答案 1 :(得分:0)

我认为你可以省略看守任务的回报。我也不支持有多个手表的结构。更多的是你只会在开发环境中使用watch任务,所以继续并忽略return for watch任务。

答案 2 :(得分:0)

对于gulp4,您可以执行以下操作:

gulp.task('watch:images', gulp.parallel(
    function () { return gulp.watch(SRC_DIR+'/*', gulp.task('images:copy')); },
    function () { return gulp.watch(SRC_DIR+'/svg/**/*', gulp.task('images:svg')); },
    function () { return gulp.watch(SRC_DIR+'/backgrounds/**/*', gulp.task('images:backgrounds')); },
    function () { return gulp.watch(SRC_DIR+'/heads/**/*', gulp.task('images:heads')); }
));

然而,gulp.parallel中的匿名函数将在gulp输出中报告为<anonymous>

您可以给函数命名,它们将显示在gulp输出中,而不是匿名显示。

gulp.task('watch:images', gulp.parallel(
    function foobar1 () { return gulp.watch(SRC_DIR+'/*', gulp.task('images:copy')); },
    function foobar2 () { return gulp.watch(SRC_DIR+'/svg/**/*', gulp.task('images:svg')); },
    function foobar3 () { return gulp.watch(SRC_DIR+'/backgrounds/**/*', gulp.task('images:backgrounds')); },
    function foobar4 () { return gulp.watch(SRC_DIR+'/heads/**/*', gulp.task('images:heads')); }
));

但是,return gulp.watch(/* ... */)似乎并不理想。观看是否按CTRL-C时,您会看到一个很大的错误,关于那些观看任务未完成。

似乎如果您有流,应该返回该流。

例如return gulp.src(...).pipe()

...但是,如果您正在执行异步操作或没有流,则应该调用回调而不是返回任何内容。

很高兴为您指出相关的文档(返回与回调),因为我在阅读的gulp文档中没有看到明确的解释。我尝试进行所有回调(不返回流)并遇到其他问题...但是可能是其他原因引起的。

以以下方式在一个任务中处理多个手表不会报告<anonymous>,并且在观看时按住CTRL-C时也不会抱怨。我的理解是,由于监视任务是开放式的,因此我们只是告知gulp,只要gulp关心确保事物按特定顺序运行,它们就会启动,并且gulp可以继续前进。

gulp.task('watch:images', function (done) {
    gulp.watch(SRC_DIR+'/*', gulp.task('images:copy'));
    gulp.watch(SRC_DIR+'/svg/**/*', gulp.task('images:svg'));
    gulp.watch(SRC_DIR+'/backgrounds/**/*', gulp.task('images:backgrounds'));
    gulp.watch(SRC_DIR+'/heads/**/*', gulp.task('images:heads'));
    return done();
});