Функция gulp webp не соблюдает команду просмотра

Итак, я использую типичный процесс минимизации изображения. У меня есть функции для jpg, png, и у меня есть отдельная функция для преобразования их в webp.

У меня есть следующий gulpfile (здесь только соответствующие части):

    function clean(done) {
      rimraf(folder.public_img, done);
    }

    function images() {
      return gulp.src([folder.preimages+'/**/*.{gif,png,jpg,svg}'])
        .pipe(cache(imagemin([
          imageminPngquant({
              speed: 1,
              quality: [0.95, 1]
          }),
          imageminZopfli({
              more: true
          }),
          imageminMozjpeg({
              quality: 65
          }),
        ])))
        .pipe(gulp.dest(folder.public_img));
    }

    gulp.task('webp', () =>
        gulp.src([folder.preimages+'/**/*.{gif,png,jpg}'])
            .pipe(webp({
                quality: 65,
                method: 6
            }))
            .pipe(gulp.dest(folder.public_img))
    );

    function serve() {
        gulp.watch(folder.preimages+"/**/*.{gif,png,jpg,svg}", images);
        gulp.watch(folder.preimages+"/**/*.{gif,png,jpg}", webp);
    }

    gulp.task('clean', clean);
    gulp.task('images', images);
    gulp.task('serve', gulp.series('clean', 'images', 'webp', serve));
    gulp.task('default', gulp.series('clean', 'images', 'webp', serve));

Итак, в основном, когда я запускаю gulp в первый раз, все процессы работают нормально, и создаются изображения webp. НО, если я добавляю новое изображение, то функция images() запускается, а вот функция webp() почему-то не выполняется, она как бы не видит изменений, а у меня она настроена так же, как и изображения.

Я попробовал два варианта:

  1. Я добавил процесс webp непосредственно в функцию images(), но таким образом мои файлы JPG и PNG были напрямую преобразованы в webp, и у меня не было резервных изображений.
  2. Я попытался создать функцию webp в том же формате, что и остальные function webp() { ... }, но когда я попытался запустить gulp, она показала эту ошибку:

    Следующие задачи не были выполнены: по умолчанию, вы забыли сигнализировать о завершении асинхронного выполнения?

Итак, я обнаружил, что могу использовать формат выше gulp.task('webp', () =>..., и это работает, но не учитывает функцию часов. Я думаю, что это может быть связано с функцией присвоения имени в конце файла, но я не очень хорошо знаком с синтаксисом.

Что нужно изменить, чтобы он смотрел корректно?


person Mihail Minkov    schedule 20.06.2019    source источник


Ответы (1)


Я смог воссоздать ваш код и заставить его работать следующим образом:

Кажется, что при создании задач gulp происходит что-то дурацкое, потому что вы создали серию задач для запуска с помощью gulp.task('serve'). Вместо этого вы можете записать свои задачи следующим образом:

gulp.task(clean);
gulp.task(images);
gulp.task(serve);
gulp.task('default', gulp.series(clean, images, webp, serve));

Вы можете назвать свою функцию webp как-то иначе - у меня возник конфликт из-за того, что я также импортировал gulp-webp как const = webp. Вам также не нужно заключать в кавычки имя функции в задаче, а затем снова ссылаться на нее в задаче. Так что gulp.task(clean) работает нормально. Вам не нужно gulp.task('clean', clean).

Вероятно, вы также можете написать свою задачу по умолчанию следующим образом:

gulp.task('default', gulp.series(clean, serve);

Это имело для меня тот же эффект, что и включение изображений и веб-задач в серию. Эта установка работала для меня. Запустив gulp, он сначала запустил функцию очистки для удаления папки public_img, затем запустил images, а затем webp. Это сработало при первом запуске, а также при добавлении нового изображения в папку preimages.

Обновить

Вот полный gulpfile, с которым мне пришлось работать:

const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const rimraf = require('rimraf');
const webp = require('gulp-webp');

const folder = {
  preimages: 'src/images',
  public_img: 'src/public_img',
};

function clean(done) {
  rimraf(folder.public_img, done);
}

function images() {
  return gulp
    .src([folder.preimages + '/**/*.{gif,png,jpg,svg}'])
    .pipe(imagemin())
    .pipe(gulp.dest(folder.public_img));
}

function webpTask() {
  return gulp
    .src([folder.preimages + '/**/*.{gif,png,jpg}'])
    .pipe(webp())
    .pipe(gulp.dest(folder.public_img));
}

function serve() {
  gulp.watch(folder.preimages + '/**/*.{gif,png,jpg,svg}', images);
  gulp.watch(folder.preimages + '/**/*.{gif,png,jpg}', webpTask);
}

gulp.task('clean', clean);
gulp.task('images', images);
gulp.task('default', gulp.series('clean', 'images', webpTask, serve));

Примечания: я удалил задачу gulp serve. Я не мог заставить это работать ни при каких конфигурациях. Я думаю, что вы столкнулись с конфликтом, назвав и задачу, и функцию serve, хотя я не уверен на 100%. Я изменил имя задачи webp на webpTask, так как возник конфликт, назвав импорт webp и функцию webp webp. Я не включил какие-либо параметры конфигурации webp() или imagemin(), но это не должно иметь значения.

Вы также должны иметь возможность удалить вызовы функций images и webpTask в задаче gulp default, так как запуск функции serve должен вызывать обе из них.

Эта настройка работала для меня как при добавлении новых изображений в мою папку preimages во время выполнения задачи gulp default, так и при перезапуске задачи gulp default.

К вашему сведению: я использую gulp версии 4.0.1., но я не думаю, что это должно иметь значение для этого.

person Dan Buda    schedule 20.06.2019
comment
Я не уверен, как работает ваш пример, не могли бы вы обновить его с помощью полного gulpfile? Чтобы добавить немного информации, исходный gulpfile был создан с помощью Foundation-Cli, и таким образом ребята из Foundation подготовили функции serve и default. Когда я попытался изменить свой gulpfile с помощью ваших предложений, как только он застрял в ожидании при подаче, но не выполнил ни одного из процессов в подаче, я думаю, что он просто наблюдал за изменениями, но ничего не генерировал, поэтому мне нужно чтобы выполнить его, когда я запускаю gulp, а затем мне нужно, чтобы он смотрел. Все остальное работает, мне просто нужно починить часы webp. - person Mihail Minkov; 21.06.2019
comment
Я добавил свой полный gulpfile выше. Надеюсь, поможет. У меня все работало нормально с этой настройкой. - person Dan Buda; 21.06.2019
comment
Я изменил ваш код на свой, и он сработал, я думаю, проблема была в смеси между переменной webp и функцией serve. Теперь это работает! - person Mihail Minkov; 21.06.2019
comment
Кстати, у меня также есть еще один вопрос, связанный с gulp, вы можете проверить его, если у вас есть какая-либо информация, связанная с stackoverflow.com/questions/56677452/ - person Mihail Minkov; 22.06.2019