Gulp 吞下手表-返回还是不返回

Gulp 吞下手表-返回还是不返回,gulp,Gulp,gulpjs/gulp的官方文档中有一个示例gulpfile.js,它提供了一个watch任务,该任务没有return语句: gulp.task('watch',function(){ gulp.watch(path.scripts,['scripts']); 大口大口地看(path.images,['images']); }); 这种方法适合我的需要,因为我想监视多组文件,每个文件都有不同的任务 但我在社区中发现了一些大胆的说法,说应该返回gulp.watch,例如,建议使用以下代码: gul

gulpjs/gulp
的官方文档中有一个示例
gulpfile.js
,它提供了一个
watch
任务,该任务没有
return
语句:

gulp.task('watch',function(){
gulp.watch(path.scripts,['scripts']);
大口大口地看(path.images,['images']);
});

这种方法适合我的需要,因为我想监视多组文件,每个文件都有不同的任务

但我在社区中发现了一些大胆的说法,说应该返回
gulp.watch
,例如,建议使用以下代码:

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

我知道任务应该返回,以便其他将其作为其工作流一部分的任务能够根据其异步性质采取相应的行动,但是对于
监视
任务的特殊情况,它始终是任务列表中的最后一个任务,不返回它可能是有意义的,这样就可以有多个监视


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

我认为您可以省略watch任务的返回。我也不支持有多个手表的结构。更详细地说,您只打算在开发环境中使用watch任务,所以继续并忽略watch任务的return。

我更喜欢所有任务都有return语句。否则,您可以读取一个虚假的“成品手表”。 当任务复杂时,不可能为多个模式的文件创建单个监视。在这种情况下,我的解决方案基于创建一个名为“watch”的超组任务,该任务依赖于带有返回语句的单个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"]);
});

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

gulp.task('watch:images',gulp.parallel(
函数(){return gulp.watch(SRC_DIR+'/*',gulp.task('images:copy');},
函数(){return gulp.watch(SRC_DIR+'/svg/***',gulp.task('images:svg');},
函数(){return gulp.watch(SRC_DIR+'/backgrounds/***',gulp.task('images:backgrounds');},
函数(){return gulp.watch(SRC_DIR+'/heads/***',gulp.task('images:heads');}
));
但是,
gulp.parallel
中的匿名函数将在gulp输出中报告为

您可以给出函数名,它们将显示在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')); }
));
然而,似乎
返回一口。watch(/*…*/)
并不理想。当你按下CTRL-C键观看时,你会发现一个关于那些没有完成的观看任务的错误

似乎如果你有一条流,你应该返回该流

e、 g.
return gulp.src(…).pipe()

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

我很高兴被指向相关的文档(返回vs回调),因为我没有在我阅读的gulp文档中看到明确的解释。我尝试去所有回调(没有返回流),并遇到其他问题…但可能是因为其他原因

在一个任务中处理多个手表时,以下方法不会报告
,也不会在观看时按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();
});

你为什么说你不喜欢有多个手表的任务?嗯。。我试图想象一个场景,我需要开始两个或更多的手表,但两者都可以在一个完成。你能给我一个现实生活中的例子,因为两个手表运行,都是异步的;生成的日志有时会更难阅读吗?我的场景是同时观察前端web开发中结构(html)、样式(css)和行为(js)的变化。关于异步stdout日志,这可能不是问题,因为开发人员知道触发任何监视事件的内容(例如,将更改保存到Sass文件)。确定。但是您可以创建一个手表来查找这些文件中的任何更改。不只是为html、css和js创建单独的手表,而且您必须从CLI启动它们。请参阅npm官方gulp页面上写的
观察
任务。一个观察任务,听变化,没有回报。这里有一个误解。我从官方文件中看到了这个例子,甚至在我的问题中也被复制了。我不是说有多个任务,每个任务都有一块手表。我的意思是有一个单一的任务,里面有多个手表,并且没有返回,就像文档中提到的例子一样。整个问题都是关于这种情况下缺少
return
语句的问题,因为我在很多地方都读到有人说任务必须返回。因此,我们都倾向于使用相同的方法(官方文件中的方法),但我的问题是,不返回该方法是否合适。它只是“完成();”而不是“返回完成();”请参见。