Задача Gulpfile для копирования файлов должна оптимизировать изображения, если они есть - PullRequest
0 голосов
/ 01 июля 2018

В моем файле 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 ]

0 голосов
/ 02 июля 2018

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

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

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

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

gulpif(/\.png$/i, imagemin({ verbose: true }))
...