4

我有一个 gulp 脚本来操作主 html 文件并将其重命名为基于数组的多个名称。这是脚本。

    gulp.task('default', function () {
      var data = ['name1','name2'];
      for(var name in data){              
         gulp.src('src/master.html')
           .pipe(*dosomething...*)
           .pipe(rename(function(path) {
              path.basename = name;
              path.extname = '.html';
          }))
         .pipe(gulp.dest('dist'));
      }
    });

但是只生成了name2.html。谁能告诉我我的代码有什么问题。

4

2 回答 2

2

不要在循环中创建函数

您的循环创建多个您传递给的函数rename。这些函数中的每一个都引用同一个变量name。但是,这些函数不会立即执行,而是在所有这些函数都已创建之后才执行。这意味着您的所有函数都引用name循环中的最后一个值。

您需要name通过用循环构造替换for循环来创建多个变量,该循环构造为每个值创建一个新的函数范围,例如Array.forEach.

您还在循环中创建多个流。您应该在将它们合并后返回这些流,merge-stream以便 gulp可以确定您的任务何时完成

var gulp = require('gulp');
var rename = require('gulp-rename');
var merge = require('merge-stream');

gulp.task('default', function () {
  var data = ['name1','name2'];
  var streams = [];
  data.forEach(function(name) {
    var stream = gulp.src('src/master.html')
      .pipe(rename(function(path) {
        path.basename = name;
        path.extname = '.html';
      }))
      .pipe(gulp.dest('dist'));
    streams.push(stream);
  });
  return merge(streams);
});
于 2016-05-05T07:40:58.130 回答
0

for ... in旨在循环遍历对象的键。对于数组,键是索引值(0 和 1),所以我很惊讶name2.html正在生成 - 也许它已经在之前的运行中出现了。

更改为索引 for 循环for (var i = 0; i < data.length; i++) { ...或使用从数组中获取名称path.basename = data[name];

于 2016-05-05T05:48:59.373 回答