前端进阶之路

gulp 4.0 升级指南

2017-10-01  本文已影响129人  苏星河
gulp.task(‘a’, function(done){
    //sync task…
    done()
})

如果任务是异步的,有多个方法可以标记任务完成。

  1. 回调
gulp.task('clean', function(done) {
    del(‘app/*')
        .then(function() {
            done()
        })
        .catch(function(err) {
            throw err
        })
})
  1. 返回流(Stream)
    通常可以通过返回 gulp.src 实现。一个 Stream 在完成或者发生错误后会调用 end of stream 模块,该模块会执行一个回调来标记是否完成。这里说的 Stream 仅包括 readable/writable/duplex stream 等真实流,因此类似 event-stream 的伪流是不被支持的。
  2. 返回 Promise
    把异步任务包装成一个 Promise 并返回。Promise 在完成后调用 onFulfilled 方法来标记任务的完成。
  3. 返回子进程
    子进程同样也会在完成后调用 end of stream 模块。
var spawn = require('child_process').spawn
gulp.task('clean', function() { 
    return spawn('rm', ['-rf', path.join(__dirname, 'build')])
});

事实上,所有符合 asyncDone API 的任务函数,都可以用于 gulp task 中。

gulp.task('img', function images() {
    return gulp.src(Path.img.src, {since: gulp.lastRun('img')})
        .pipe(plumber())
        .pipe(imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 1}),
            imagemin.svgo({
                plugins: [
                    {removeViewBox: true}
                ]
            })
        ]))
        .pipe(gulp.dest(Path[env]))
})
gulp.task('local', gulp.series(clean, gulp.parallel(php, js), watch))

function clean() {
    return spawn('rm', ['-rf', Path[env]])
}

function php() {
    return gulp.src(Path.php.src, {since: gulp.lastRun(php)})
        .pipe(plumber())
        .pipe(gulp.dest(Path[env]))
        .pipe(livereload())
}

function js() {
    return gulp.src(Path.js.src, {since: gulp.lastRun(js)})
        .pipe(plumber())
        .pipe(gulp.dest(Path[env]))
        .pipe(livereload())
}

function watch(done) {
    livereload.listen()
    gulp.watch('app/php/**/*.php', gulp.series(php))
    gulp.watch('app/js/**/*.js',  gulp.series(js))
    done()
}

利用 js 函数的提升特性,我们可以在文件开头定义 task。而在 gulp 3.0,主 task 必须在所有子 task 定义完成后才能定义。另外,这里的 clean, php 等任务实际上变成了私有的了。

上一篇 下一篇

猜你喜欢

热点阅读