Перезагрузите BrowserSync только один раз при использовании Jekyll в Gulp при обновлении общего файла

У меня есть сайт Jekyll, который является частью проекта Gulp, и я использую BrowserSync для предварительного просмотра сайта по мере его создания. Один из моих операторов watch ищет изменения в html для автоматического обновления сайта.

gulp.watch('docs/_site/**/*.html').on('change', browserSync.reload);

Работает как задумано.

Однако, когда я обновляю header.html (или любой другой общий файл), браузер обновляется несколько раз, потому что все страницы изменились. Это имеет смысл, так как все статические страницы обновляются. Но я хотел бы предотвратить это при обновлении общего файла.

Есть ли способ сказать Gulp/BrowserSync, чтобы он обновлялся только один раз при обновлении общего файла Jekyll?

ОБНОВЛЕНИЕ

Мой набор часов выглядит следующим образом:

gulp.task('dev:watch', ['browserSync', 'docs:sass', 'docs:lib', 'docs:build'], function () {
  gulp.watch(['scss/**/*.scss', 'docs/assets/**/*.scss'], ['dev:sass']);
  gulp.watch(['docs/**/*.html', 'docs/**/*.md', '!docs/_site/**'], ['docs:build']);
  gulp.watch('docs/_site/**/*.html').on('change', browserSync.reload);
});

Задача docs:build:

gulp.task('docs:build', function () {
  browserSync.notify('Building Jekyll');
  return spawn('jekyll', ['build', '--config', '_config.yml,_config_dev.yml', '--incremental'], {stdio: 'inherit'});
});

person Nicholas Pappas    schedule 28.06.2016    source источник


Ответы (1)


# Изменить после редактирования вашего вопроса:

Изменения в _site являются следствием задач dev:sass или docs:build, поэтому вы можете вызывать browserSync.reload из этих задач. Тогда вы будете уверены, что он добавляется только один раз.

# Завершить редактирование

Итак, вы наблюдаете наблюдаемый процесс.

У вас запущен jekyll serve, который по умолчанию отслеживает любые изменения в корне и запускает генерацию для всех файлов, включая файлы "_includes".

Для изменения файла _include у вас может быть 10 страниц + 10 сообщений + 10 элементов коллекций = 30 обновленных страниц в папке _site, что приводит к запуску 30 обновлений gulp.watch.

Вам лучше посмотреть основные файлы и папку jekyll для изменения с помощью:

gulp.watch(
  ['*.html', '*.md',  '_includes/*.html', '_layouts/*.html', ...other files],
  browserSync.reload()
);

и даже добавить задержку перезагрузки, чтобы позволить jekyll восстановить большой сайт. и перезагрузить после времени спуска:

browserSync.reload({reloadDelay: 5000})
person David Jacquel    schedule 28.06.2016
comment
Привет, Дэвид. Я не запускаю «jekyll serve», это просто сайт на основе Jekyll (моя формулировка, возможно, сбивает с толку). Gulp обрабатывает всю компиляцию (через процесс «сборки»), а сайт обслуживается (во время разработки) с помощью BrowserSync. - person Nicholas Pappas; 29.06.2016
comment
А как происходят изменения в _site? смотреть -> джекил билд ? Можем ли мы увидеть ваш код? - person David Jacquel; 29.06.2016
comment
Я обновил свой вопрос задачами watch и build. Благодарю вас! - person Nicholas Pappas; 29.06.2016
comment
Имеет смысл. Я попробовал, но браузер перезагружается до завершения работы Jekyll. Добавление reloadDelay, кажется, вообще ничего не делает. - person Nicholas Pappas; 30.06.2016