为每个文件夹生成一个文件
如果你有一组文件夹,并希望对每个文件夹执行一组任务,例如...
/scripts
/scripts/jquery/*.js
/scripts/angularjs/*.js
...并希望最终得到...
/scripts
/scripts/jquery.min.js
/scripts/angularjs.min.js
...你需要执行类似以下的操作...
var fs = require('fs');
var path = require('path');
var merge = require('merge-stream');
var gulp = require('gulp');
var concat = require('gulp-concat');
var rename = require('gulp-rename');
var uglify = require('gulp-uglify');
var scriptsPath = 'src/scripts';
function getFolders(dir) {
return fs.readdirSync(dir)
.filter(function(file) {
return fs.statSync(path.join(dir, file)).isDirectory();
});
}
gulp.task('scripts', function(done) {
var folders = getFolders(scriptsPath);
if (folders.length === 0) return done(); // 没有任务要做!
var tasks = folders.map(function(folder) {
return gulp.src(path.join(scriptsPath, folder, '/**/*.js'))
// 合并成 foldername.js
.pipe(concat(folder + '.js'))
// 写入输出
.pipe(gulp.dest(scriptsPath))
// 压缩
.pipe(uglify())
// 重命名为 folder.min.js
.pipe(rename(folder + '.min.js'))
// 再次写入输出
.pipe(gulp.dest(scriptsPath));
});
// 将 scriptsPath 根目录中的所有剩余文件处理成 main.js 和 main.min.js 文件
var root = gulp.src(path.join(scriptsPath, '/*.js'))
.pipe(concat('main.js'))
.pipe(gulp.dest(scriptsPath))
.pipe(uglify())
.pipe(rename('main.min.js'))
.pipe(gulp.dest(scriptsPath));
return merge(tasks, root);
});
几点说明:
folders.map
- 对每个文件夹执行一次函数,并返回异步流merge
- 合并流,仅在所有发出的流结束时才结束