跳到主要内容

增量重建,包括对完整文件集的操作

增量重建的麻烦之处在于,你通常想要对_所有_处理过的文件进行操作,而不仅仅是单个文件。例如,你可能只想对已更改的文件进行代码检查和模块包装,然后将其与所有其他已检查和包装过的文件合并。如果不使用临时文件,这很难实现。

使用 gulp-cachedgulp-remember 可以实现这一目标。

var gulp = require('gulp');
var header = require('gulp-header');
var footer = require('gulp-footer');
var concat = require('gulp-concat');
var jshint = require('gulp-jshint');
var cached = require('gulp-cached');
var remember = require('gulp-remember');

var scriptsGlob = 'src/**/*.js';

gulp.task('scripts', function() {
return gulp.src(scriptsGlob)
.pipe(cached('scripts')) // 仅处理更改过的文件
.pipe(jshint()) // 对更改的文件做特殊处理...
.pipe(header('(function () {')) // 例如 jshinting ^^^
.pipe(footer('})();')) // 以及某种模块包装
.pipe(remember('scripts')) // 将所有文件重新添加到流中
.pipe(concat('app.js')) // 执行需要所有文件的操作
.pipe(gulp.dest('public/'));
});

gulp.task('watch', function () {
var watcher = gulp.watch(scriptsGlob, gulp.series('scripts')); // 监视与脚本任务相同的文件
watcher.on('change', function (event) {
if (event.type === 'deleted') { // 如果文件被删除,忘记它
delete cached.caches.scripts[event.path]; // gulp-cached 移除 API
remember.forget('scripts', event.path); // gulp-remember 移除 API
}
});
});