Как я могу минимизировать дублирование кода, который иногда требует обратного вызова? - PullRequest
0 голосов
/ 22 января 2019

В моем gulpfile у меня есть задача, которая обрабатывает все мои страницы, и другая задача, которая отслеживает изменения на моих страницах и обрабатывает только измененную страницу. Это выглядит так:

const buildPages = path => cb => {
  gulp.src(path)

    // some lines of piping

    .pipe(gulp.dest(pages.dist));

  cb();
}

const watchPages = () =>
  gulp.watch(pages.src).on('change', path =>
    gulp.src(path)

      // the same piping as above

      .pipe(gulp.dest(pages.dist))
  );

Метод .on() объекта наблюдателя chokidar, возвращаемый gulp.watch(), не получает функцию обратного вызова, в то время как для задачи gulp над ней требуется такая функция. Таким образом, чтобы удалить дублирование кода, я могу сделать это:

const buildPages = path =>
  gulp.src(path)

    // some lines of piping

    .pipe(gulp.dest(pages.dist));

const buildPagesWithCallback = path => cb => {
  buildPages(path)
  cb();
}

const watchPages = () =>
  gulp.watch(pages.src).on('change', path =>
    buildPages(path)
  );

Это правильный путь или есть способ удалить дублирование, не создавая дополнительную функцию (возможно, заставив наблюдателя получить обратный вызов)?

1 Ответ

0 голосов
/ 22 января 2019

Не уверен, каковы ваши другие требования / потребности, но, учитывая ваше описание, у меня обычно будет такая установка (при условии, что вы используете gulp 4):

const src = [ './src/pageA/**/*.js', ...others ];
const dist = './dist';

const buildPages = () => gulp.src(src).pipe(...).pipe(gulp.dest(dist));
const callback = () => { /* do stuff */ };

exports.buildPageWithCallback = gulp.series(buildPages, callback);
exports.watchPages = () => gulp.watch(src, gulp.series(buildPages));
exports.watchPageWithCallback = () => gulp.watch(src, gulp.series(buildPages, callback));

Я бы использовал gulp.series для запуска обратного вызова без явной передачи обратного вызова функции создателя задач и передачи задачи непосредственно в gulp.watch.

Если ваши требования требуют buildPages, чтобы взять path, то я думаю, что вы делаете это правильно, извините, если я неправильно понимаю вопрос

...