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 执行任务,在上述范例中任务的执行顺序如下:

  1. 同时执行 task1 和 task3,但是没有先后顺序之分,即无法确定哪个任务会先执行完毕
  2. 在两个任务都执行完毕后才开始执行 task2
  3. 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 时输出的路径结构:

  1. 默认情况下,’web/js/**/*.js’对应的 base 是’web/js’, 即最终会输出到 build/**/*.js 中
  2. 通过 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:清理文件和文件夹