Задача Gulpfile для копирования файлов должна оптимизировать изображения, если они есть

В моем gulpfile я копирую несколько глобусов файлов (различных форматов), и если какой-либо из этих глобусов содержит изображение, я хотел бы оптимизировать его с gulp-imagemin,

Проблема в gulp-imagemin ожидает только изображения, в противном случае выбрасывает неподдерживаемое изображение в журнале, поэтому, если бы я передал весь глобус, это привело бы к множеству ошибок, и я хочу избежать этого. я пробовал gulp-if чтобы отфильтровать глобус, хотя он работает как фильтр и предотвращает эти ошибки, он, кажется, всегда проходит хотя бы один раз, даже если нет изображений. Например, это по-прежнему будет вызывать imagemin() один раз, даже если png-файлов нет вообще:

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

При этом будет отображаться "Minified 0 images", и, поскольку в моем реальном сценарии я передаю десятки глобусов без изображений, мой журнал спамится им. Если я установлю условие gulpif на статическое false, оно вообще не будет вызывать imagemin, поэтому должно быть что-то с этим условием, которое не является ложным, когда это должно быть?

Как мне вообще не вызывать imagemin(), если glob не содержит файл определенного типа?

2 ответа

Решение

Оказывается, проблема была gulp-if разрешающее действие до условия. Условие должно быть помещено вне потока винила. Итак, сначала я синхронизировал глобус, чтобы получить файлы, затем я определил, есть ли какие-либо поддерживаемые изображения, и сохранил это в bool. Затем при вызове gulp, если мне нужно было обработать этот 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));
}

Использование gulpif с функцией в первом параметре. Как это:

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

Или с регулярным выражением (не проверено):

gulpif(/\.png$/i, imagemin({ verbose: true }))
Другие вопросы по тегам