0

在我的 gulpfile 中,我正在复制多个文件(各种格式),如果这些文件中的任何一个包含我想用gulp-imagemin.

问题是gulp-imagemin只需要图像,否则会在日志中抛出不受支持的图像,所以如果我要传入整个 glob,它会引发很多错误,我想避免这种情况。我试图gulp-if过滤 glob,虽然它可以作为过滤器并防止这些错误,但即使没有图像存在,它似乎总是至少通过一次。例如,即使没有任何 png 文件,它仍然会调用 imagemin() 一次:

gulp.task('test:imagemin', function () {
  return gulp.src('*.nothing')
    .pipe(gulpif('*.png', imagemin({ verbose: true })));
});

这将记录“缩小 0 个图像”,因为在我的真实场景中,我传递了几十个没有图像的球体,所以我的日志被垃圾邮件淹没了。如果我将 gulpif 条件设置为静态假,它根本不会调用 imagemin,所以它一定是这个条件不应该是假的东西?

如果 glob 不包含某种类型的文件,我如何根本不调用 imagemin()?

4

2 回答 2

0

原来问题是gulp-if在条件之前解决操作。条件需要放在乙烯基流之外。所以首先我同步 glob 以获取文件,然后我确定是否有任何受支持的图像并将其保存到布尔值。然后在调用 gulp-if 时,我必须调整这个 bool 并嵌套在另一个 gulp-if 中进行过滤。

function copyFilesPipeline(assetGroup) {
  var containsImages = glob.sync(assetGroup.inputPaths).some(function (inputPath) {
    var ext = path.extname(inputPath).toLowerCase();
    return [".gif", ".jpg", ".png", ".svg"].includes(ext);
  });

  return gulp.src(assetGroup.inputPaths)
    .pipe(makeFilesLowercase())
    .pipe(gulpif(containsImages, gulpif('**/*.{gif,jpg,png,svg}', imagemin({ verbose: true }))))
    .pipe(newer(assetGroup.outputDir))
    .pipe(gulp.dest(assetGroup.outputDir));
}
于 2018-07-02T10:25:23.860 回答
0

gulpif在函数的第一个参数中使用。像这样:

gulpif(function(file) {
    return file.extname.toLowerCase() == '.png';
}, imagemin({ verbose: true }))

或使用正则表达式(未测试):

gulpif(/\.png$/i, imagemin({ verbose: true }))
于 2018-07-01T18:58:46.507 回答