我可以将一系列管道功能组合在一起,以便在多个任务中重复使用吗?

时间:2016-04-12 15:49:44

标签: javascript node.js gulp

我有这个gulp任务:

gulp.task('make_prod_fl', ['rename_bundles'], function () {
    gulp.src('index-fl.html')
    // common piped tasks here
    .pipe(rename("index-prod-fl.html"))
    .pipe(gulp.dest('./'));
});

和此:

gulp.task('make_prod_ie', ['rename_bundles'], function () {
    gulp.src('index-ie.html')
    // common piped tasks here
    .pipe(rename("index-prod-ie.html"))
    .pipe(gulp.dest('./'));
});

这些非常相似的任务有很多。

有没有办法可以组合常见任务,以便不必为我运行的每个make_prod_xx任务多次重复相同的公共代码?

1 个答案:

答案 0 :(得分:2)

由于Gulp只是JavaScript,因此在Gulpfile中有许多方法可以保存DRY。您选择哪一个取决于您的特定用例(最终,个人偏好和品味)。

这是一个关于如何抽象出Gulpfile中相似之处的小样本:

  1. 您可以使用返回任务功能的函数:

    function rn(name) {
      return function() {
        return gulp.src('index-' + name + '.html')
          .pipe(rename('index-prod-' + name + '.html'))
          .pipe(gulp.dest('./'));
      }
    }
    
    gulp.task('make_prod_fl', rn('fl'));
    
    gulp.task('make_prod_ie', rn('ie'));
    
  2. 您可以使用lazypipe重用链式pipe()语句:

    function rn(name) {
      return (lazypipe()
        .pipe(rename, 'index-prod-' + name + '.html')
        .pipe(gulp.dest, './'))();
    }
    
    gulp.task('make_prod_fl', function () {
      return gulp.src('index-fl.html').pipe(rn("fl"));
    });
    
    gulp.task('make_prod_ie', function () {
      return gulp.src('index-ie.html').pipe(rn("ie"));
    });
    
  3. 您可以在循环中动态创建任务:

    ['fl', 'ie'].forEach(function(name) {
      gulp.task('make_prod_' + name, function () {
        return gulp.src('index-' + name + '.html')
          .pipe(rename('index-prod-' + name + '.html'))
          .pipe(gulp.dest('./'));
      });
    });