gulp.watch()
、gulp-changed
和 gulp-watch
之间的区别似乎引起了很多混淆,所以我试图梳理一下这个问题:
gulp.watch()
这是三者中唯一一个
gulp
本身的一部分 而不是插件。这很重要,因为它意味着与其他两个不同,它不会被传递到 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
派上用场的地方。
gulp-changed
这个插件被编写成gulp流中的过滤器阶段。它的目的是从流中删除自上次构建以来未更改的所有文件。它通过将源目录中的文件与目标目录中的结果文件进行比较来实现此目的:
gulp.task('build-css', function() {
return gulp.src('src/**/*.css')
.pipe(changed('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
以来仅重建那些已更改的文件。
gulp-watch
This
插件 is an attempt to improve on the built-in
gulp.watch()
. While
gulp.watch()
uses
gaze
to listen for file changes,
gulp-watch
uses
chokidar
, which is generally considered to be the more mature of the two.
You can use
gulp-watch
to achieve the same effect as using
gulp.watch()
and
gulp-changed
in combination.
gulp.task('watch-css', function() {
return gulp.src('src/**/*.css')
.pipe(watch('src/**/*.css'))
.pipe(doSomethingHere())
.pipe(gulp.dest('dist/css'));
});
这个程序会监视所有的.css文件,一旦有变化就重新读取该文件(仅限于该文件),然后重新发射到数据流中,在到达目标目录之前经过doSomethingHere()处理。请注意,html标签应保留。
请注意,这种比较是笼统的,并且忽略了某些细节和功能(例如,我没有讨论您可以传递给
gulp.watch()
和
gulp-watch
的回调函数),但我认为这应该足以突出三者之间的主要区别。