Функция 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', () =>..., и он работает, но не учитывает функцию часов. Я думаю, что это может быть связано с функцией присвоения имени в конце файла, но я не очень хорошо знаком с синтаксисом.

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

Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
0
0
515
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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., но я не думаю, что это должно иметь значение для этого.

Я не уверен, как работает ваш пример, не могли бы вы обновить его с помощью полного gulpfile? Чтобы добавить немного информации, исходный gulpfile был создан с помощью Foundation-Cli, и таким образом ребята из Foundation подготовили функции serve и default. Когда я попытался изменить свой gulpfile с вашими предложениями, как только он застрял в ожидании при подаче, но не выполнил ни одного из процессов в подаче, я думаю, что он просто наблюдал за изменениями, но ничего не генерировал, поэтому мне нужно чтобы выполнить его, когда я запускаю gulp, а затем мне нужно, чтобы он смотрел. Все остальное работает, мне просто нужно починить часы webp.

Mihail Minkov 21.06.2019 02:00

Я добавил свой полный gulpfile выше. Надеюсь, поможет. У меня все работало нормально с этой настройкой.

Dan Buda 21.06.2019 18:21

Я изменил ваш код на свой, и он сработал, я думаю, проблема была в смеси между переменной webp и функцией serve. Теперь это работает!

Mihail Minkov 21.06.2019 21:05

Кстати, у меня также есть еще один вопрос, связанный с глотком, вы можете проверить его, если у вас есть какая-либо информация, связанная с stackoverflow.com/questions/56677452/…

Mihail Minkov 21.06.2019 23:37

Другие вопросы по теме