javascript,gulp,watch,changed

我无法理解这一点.
这应该是每次修改监视文件时执行的gulp任务.任何人都可以解释为什么需要通过更改的插件管道监视文件?

gulp.task('build-css', function () {
  return gulp.src(paths.css)
  .pipe(changed(paths.output, {extension: '.css'}))
  .pipe(gulp.dest(paths.output));
});

gulp.task('watch', ['serve'], function() { 
  gulp.watch(paths.css, ['build-css']); 
}); 

免责声明:这不是我的代码.只是想了解发生了什么,以便创建我自己的自定义监视任务.

解决方法:

gulp.watch(),gulp-changed和gulp-watch之间的区别似乎引起了很多混乱,所以这是我试图解开这个混乱:

gulp.watch()

这是三个中唯一一个是part of gulp itself而不是插件.这很重要,因为它意味着与其他两个不同,它不会传递给gulp流的pipe()函数.

相反,它通常直接从gulp任务内部调用:

 gulp.task('build-css', function() { 
    return gulp.src('src/**/*.css')
      .pipe(doSomethingHere())
      .pipe(gulp.dest('dist/css'));
 }); 

 gulp.task('watch', function() { 
    gulp.watch('src/**/*.css', ['build-css']); 
 }); 

在上面的gulp.watch()用于监听.css文件的变化.只要gulp.watch()运行,对.css文件的任何更改都会自动导致执行build-css任务.

这就是麻烦开始的地方.请注意,没有关于哪些文件传递给build-css的信息?这意味着即使您只更改一个.css文件,所有.css文件也会再次通过doSomethingHere(). build-css任务不知道哪些更改了.只要你手上没有文件,这可能就好了,但随着文件数量的增加,你的构建速度会变慢.

这就是gulp-changed的用武之地.

吞掉改变的

这个plugin被编写为gulp流中的过滤阶段.其目的是从流中删除自上次构建以来未更改的所有文件.它通过将源目录中的文件与目标目录中的结果文件进行比较来完成此操作:

 gulp.task('build-css', function() { 
    return gulp.src('src/**/*.css')
      .pipe(changed('dist/css'))  //compare with files in dist/css
      .pipe(doSomethingHere())
      .pipe(gulp.dest('dist/css'));
 }); 

 gulp.task('watch', function() { 
    gulp.watch('src/**/*.css', ['build-css']); 
 }); 

在上面,仍然会针对.css文件的每次更改调用build-css任务,并且读入所有.css文件.但是,只有那些实际更改的文件现在才会到达昂贵的doSomethingHere()阶段.其余的由gulp-changed筛选出来.

即使您没有注意文件更改,这种方法也可以加速build-css.您可以在命令行上显式调用gulp build-css,并且只会重建自上次调用build-css以来已更改的那些文件.

一饮而尽手表

这个plugin试图改进内置的gulp.watch().虽然gulp.watch()使用gaze来监听文件更改,但gulp-watch使用chokidar,这通常被认为是两者中更成熟的.

您可以使用gulp-watch来实现与使用gulp.watch()和gulp-changed组合相同的效果:

 gulp.task('watch-css', function() { 
    return gulp.src('src/**/*.css')
      .pipe(watch('src/**/*.css'))
      .pipe(doSomethingHere())
      .pipe(gulp.dest('dist/css'));
 }); 

这再次监视所有.css文件的更改.但是这次只要更改了.css文件,就会再次读入该文件(并且只有该文件)并重新发送到流,它将在通往目标目录的途中通过doSomethingHere().

请注意,此比较以相当宽的笔划描绘了所有三个替代方案,并省略了某些细节和功能(例如,我没有谈到可以传递给gulp.watch()和gulp-watch的回调函数),但是我认为这应该足以让三者之间产生重大差异.

上一篇:javascript – Gulp验证工作流程和es 6


下一篇:javascript – 错误:缺少正面水珠