Очень медленный запуск сервера BrowserSync с Gulp

Я использую BrowserSync в режиме сервера (используя встроенный статический сервер) с GulpJS в локальном проекте, и все, кажется, работает правильно, за исключением того, что сервер BrowserSync запускается очень медленно. Кажется, что сам BrowserSync инициализируется сразу, когда я запускаю Gulp, но для запуска сервера и для возврата URL-адресов доступа требуется около 4-5 минут (а иногда и больше). В течение этого периода все продолжает работать, и BrowserSync отвечает на вызовы reload() и тому подобное, но доступ через обычные URL-адреса недоступен (в данном случае localhost:3000 и localhost:3001). Как только URL-адреса доступа возвращены, сервер, по-видимому, запустился, и обновления страницы BrowserSync работают нормально и на самом деле очень быстро.

Я пробовал несколько разных конфигураций моего gulpfile.js, пробовал разные способы инициализации BrowserSync, разные подходы к вызову методов stream() и reload() (включая пробу основного рецепта Gulp/SASS BrowserSync) и разные номера портов, но все конфигурации имели одну и ту же проблему. Я даже пытался отключить брандмауэр и программное обеспечение AV (Avast), но ничего не вышло.

Я использую Windows 8.1, если это актуально. BrowserSync заново устанавливается локально в проект через NPM, и при новой локальной установке в другие каталоги возникает та же проблема. NPM, Ruby, Gulp и все модули выглядят современными. Что бы это ни стоило, весь мой другой опыт работы с Ruby, Gulp и Node.js был очень плавным и без проблем.

Я не могу найти другие посты, упоминающие эту проблему, и начинаю думать, что это нормальное поведение. Это нормально, и если нет, у кого-нибудь есть идеи, что можно попробовать? Эта задержка - не конец света, поскольку сервер BrowserSync всегда запускается (в конце концов), но это все же излом в моем рабочем процессе, который я предпочел бы исправить, а не просто разобраться.

Наконец, вот мой gulpfile.js: /* Файл: gulpfile.js */

var gulp  = require('gulp'),
    gutil = require('gulp-util');
    jshint = require('gulp-jshint');
    sass   = require('gulp-sass');
    concat = require('gulp-concat');
    uglify = require('gulp-uglify');
    sourcemaps = require('gulp-sourcemaps');
    imagemin = require('gulp-imagemin');
    browserSync = require('browser-sync').create();

gulp.task('default', ['watch'], browserSync.reload);

// JSHint
gulp.task('jshint', function() {
  return gulp.src('src/js/**/*.js')
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'));
});

// Build JS
gulp.task('build-js', function() {
  return gulp.src('src/js/**/*.js')
    .pipe(sourcemaps.init())
      .pipe(concat('main.js'))
      //only uglify if gulp is ran with '--type production'
      .pipe(gutil.env.type === 'production' ? uglify() : gutil.noop()) 
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('public/www/js/core'));
});

// Build CSS
gulp.task('build-css', function() {
    return gulp.src('src/sass/**/*.{sass,scss}')
        .pipe(sourcemaps.init())
            .pipe(sass()).on('error', handleError)
        .pipe(sourcemaps.write()) // Add the map to modified source.
        .pipe(gulp.dest('public/www/css/core'))
        .pipe(browserSync.stream({match: '**/*.css'}));
});

// ImageMin
gulp.task('imagemin', function () {
    return gulp.src('src/img/*')
        .pipe(imagemin({
            progressive: true,
            svgoPlugins: [{removeViewBox: false}]
        }))
        .pipe(gulp.dest('public/www/img'));
});

// Handle errors
function handleError(err) {
  console.log(err.toString());
  this.emit('end');
}

// Watch function
gulp.task('watch', function() {
    browserSync.init({
      server: "./public/www",
      //port: 3002
    });

    gulp.watch('src/js/**/*.js', ['jshint']);
    gulp.watch('src/sass/**/*.{sass,scss}', ['build-css']);
    gulp.watch('src/js/**/*.js', ['build-js']);
    gulp.watch('src/img/*', ['imagemin']);
    gulp.watch("public/www/css/**/*.css").on('change', browserSync.reload);
})

2 ответа

Аккаунт BrowserSync в Twitter предложил установить для параметра "онлайн" значение true, и... похоже, это сработало!

Я установил его в init BrowserSync следующим образом:

browserSync.init({
  server: "./public/www",
  online: true
});

... и задержка прошла!

Если обратиться к документам BrowserSync ( http://www.browsersync.io/docs/options/), то кажется, что при установке для параметра "онлайн" значения "true" пропуск онлайн-проверки пропускается. Итак, я думаю, что проверка как-то вызвала задержку? Мне это кажется странным, но сейчас это работает лучше.

В моем случае у меня был этот код в gulpfile, который задерживает запуск примерно на 50 секунд.

gulp.watch('./**/*.{js,html}').on('change', browserSync.reload);

и проблема была в строке glob. Он проверяет даже папку node_modules. И я сделал некоторые изменения

gulp.watch(['./scripts/**/*.{js,html}', './index.html'])
  .on('change', browserSync.reload);

Я думаю, что это особенность производительности, что мы должны более точно указать glob.

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