gulp 自动化构建工具
2016, Oct 06
1.gulp 任务定义和执行顺序
// name(string): 任务名称
// deps(array): 依赖的其他任务数组
// fn(function): 任务执行函数
gulp.task(name[, deps], fn)
范例:
// 创建了 task1 任务, 该任务没有依赖
gulp.task('task1',function() {
// task1 的任务执行代码
});
// 创建了 task3 任务, 该任务没有依赖
gulp.task('task3',function() {
// task3 的任务执行代码
});
// 创建了 task2 任务, 该任务依赖于 task1,task3
gulp.task('task2', ['task1', 'task3'], function() {
// task2 的任务执行代码
});
// 创建了 newTask 任务, 该任务依赖于 task1,task2,task3
gulp.task('newTask', ['task1', 'task2', 'task3'], function() {
// newTask 的任务执行代码
});
在范例的演示中:task1 和 task3 没有依赖其他任务,task2 依赖于 task1 和 taks3,newTask 依赖于 task1,task2,task3。
在 shell 或 cmd 中使用命令 gulp newTask 执行任务,在上述范例中任务的执行顺序如下:
- 同时执行 task1 和 task3,但是没有先后顺序之分,即无法确定哪个任务会先执行完毕
- 在两个任务都执行完毕后才开始执行 task2
- task2 执行完毕后才会执行 newTask
2. 文件监控
// glob(string|array): 单个文件路径或文件夹路径字符串或者数组, 使用 ** 表示多级的路径匹配,* 表示任意长度的字符串的匹配
// opts(object): 传递给 gaze 的选项对象, 参考: https://github.com/shama/gaze
// tasks(array): 监测到文件变更的时候执行的任务列表
gulp.watch(glob[, opts], tasks)
// cb(function): 监测到文件变更的时候执行该回调函数
gulp.watch(glob [, opts, cb])
范例:
// 第一种 watch
var watcher = gulp.watch('js/**/*.js', ['uglify','reload']);
// 可以通过 on 方法进行事件监听
watcher.on('change', function(event) {
// 监听文件变化事件并做一些处理
});
// 第二种 watch
gulp.watch(['js/**/*.js','css/*.css'], function(event) {
// 做一些处理或执行任务
});
3.gulp 流
// glob(string|array): 单个文件路径或文件夹路径字符串或者数组, 使用 ** 表示多级的路径匹配,* 表示任意长度的字符串的匹配
// options(object):
// options.buffer(boolean): 如果该项被设置为 false, 那么将会以 stream 方式返回 file.contents 而不是文件 buffer 的形式 (stream 在处理一些大文件的时候将会很有用, 但是要插件未必会支持 stream)
// options.read(boolean): 如果该项被设置为 false, 那么 file.contents 会返回空值 (null), 这种情况适合于只需要知道文件路径而不需要文件内容的时候
// options.base(string): 改变 globs 中的文件路径的 base 路径, 默认情况下 base 是从第一个通配符出现之前的路径部分, 对应 gulp.dest 的输出
gulp.src(globs[, options])
// path(string): 输出路径
// options(object):
// options.cwd(string):Change Working Directory, 用于设置 path 工作目录, 只有 path 是相对路径时有效
// options.mode(string): 用于设置目录权限, 默认 "0777"
gulp.dest(path[, options])
范例:
// 定义任务并执行
gulp.task('task1', function() {
// 获取 js 目录和子目录下所有的 js 文件, 使用 pipe 可以将文件传递到各种插件中执行操作, 最后用 dest 输出
return gulp.src('web/js/**/*.js',{base:'web'})
.pipe(gulp.dest('build')); // 将文件输出到 dest/js/**/*.js
});
上面使用了 base 属性,展示了当设置 base 时输出的路径结构:
- 默认情况下,’web/js/**/*.js’对应的 base 是’web/js’, 即最终会输出到 build/**/*.js 中
- 通过 base 改变了目录后, 输出到 build/js/**/*.js 中
4. 单 task 多 stream
有时候需要实现在同一个任务中执行多个流,并且等待所有流完成才表示任务完成,此时可以引入 Q 包。
var Q = require('q')
gulp.task('task1', function () {
// 要处理的文件或其他内容
var srcs = {...}
//defer 数组
var ds = []
for (var file in srcs) {
// 创建并添加 defer 对象
var d = Q.defer()
ds.push(d.promise)
// 处理任务
var f = srcs[file]
gulp.src(f)
.pipe(...)// 执行相关插件
.on("end", d.resolve)// 结束时执行 d.resolve() 表示完成
}
// 返回一个合并的 promise
return Q.all(ds)
})
常用插件:
- gulp-html-replace:用于替换 html 中的内容
- gulp-concat:合并文件
- gulp-uglify:代码丑化(混淆)
- gulp-md5-plus:文件加 md5 后缀,防止浏览器缓存
- gulp-clean-css:压缩 CSS
- gulp-rename:文件重命名
- gulp-clean:清理文件和文件夹