@TemperOK
Чем больше учишь, тем меньше знаешь.

Почему Browser-sync зависает при изменении кода?

Добрый день.
Изучаю возможности gulp, для более автоматизированной верстки и столкнулся с проблемой.
Есть вот такой gulpfile.js:
Полный файл
const gulp = require('gulp');
const plumber = require('gulp-plumber');
const notify = require('gulp-notify');
const sass = require('gulp-sass')(require('sass'));
const postcss = require('gulp-postcss');
const csso = require('postcss-csso');
const postcssUrl = require('postcss-url');
const postcssImport = require('postcss-import');
const postScss = require('postcss-scss');
const autoprefixer = require('autoprefixer');
const sync = require('browser-sync').create();
const htmlmin = require('gulp-htmlmin');
const squoosh = require('gulp-libsquoosh');
const terser = require('gulp-terser');
const rename = require('gulp-rename');
const webp = require('gulp-webp');
const svgSprite = require('gulp-svg-sprite');
const del = require('del');

// Styles

const styles = () => {
  return gulp
    .src('source/sass/*.scss', { sourcemaps: true })
    .pipe(plumber())
    .pipe(postcss([postcssImport(), postcssUrl()], { syntax: postScss }))
    .pipe(sass())
    .pipe(postcss([autoprefixer(), csso()]))
    .pipe(
      rename({
        extname: '.min.css',
      }),
    )
    .pipe(gulp.dest('build/css', { sourcemaps: '.' }))
    .pipe(sync.stream());
};

exports.styles = styles;

// HTML

const html = () => {
  return gulp
    .src('source/*.html')
    .pipe(htmlmin({ collapseWhitespace: true }))
    .pipe(gulp.dest('build'));
};

exports.html = html;

// Scripts

const scripts = () => {
  return gulp
    .src('source/js/*.js')
    .pipe(terser())
    .pipe(
      rename({
        extname: '.min.js',
      }),
    )
    .pipe(gulp.dest('build/js'))
    .pipe(sync.stream());
};

exports.scripts = scripts;

// Images

const optimizeImages = () => {
  return gulp.src('source/img/**/*.{png,jpg}').pipe(squoosh()).pipe(gulp.dest('build/img'));
};

exports.optimizeImages = optimizeImages;

const copyImages = () => {
  return gulp.src('source/img/**/*.{png,jpg}').pipe(gulp.dest('build/img'));
};

exports.images = copyImages;

// WebP

const createWebp = () => {
  return gulp
    .src('source/img/**/*.{jpg,png}')
    .pipe(webp({ quality: 90 }))
    .pipe(gulp.dest('build/img'));
};

exports.createWebp = createWebp;

// Sprite

const sprite = () => {
  return gulp
    .src('source/icons/*.svg')
    .pipe(
      svgSprite({
        mode: {
          stack: {
            sprite: '../sprite.svg',
          },
        },
      }),
    )
    .pipe(gulp.dest('build/icons'));
};

exports.sprite = sprite;

// Copy

const copy = (done) => {
  gulp
    .src(
      [
        'source/fonts/*.{woff2,woff}',
        'source/*.ico',
        'source/img/**/*.svg',
        'source/favicons/*',
      ],
      {
        base: 'source',
      },
    )
    .pipe(gulp.dest('build'));
  done();
};

exports.copy = copy;

// Clean

const clean = () => {
  return del('build');
};

exports.clean = clean;

// Server

const server = (done) => {
  sync.init({
    server: {
      baseDir: 'build',
    },
    cors: true,
    notify: false,
    ui: false,
  });
  done();
};

exports.server = server;

// Reload

const reload = (done) => {
  sync.reload();
  done();
};

// Watcher

const watcher = () => {
  gulp.watch('source/sass/**/*.scss', styles);
  gulp.watch('source/js/*.js', gulp.series(scripts, reload));
  gulp.watch('source/*.html', gulp.series(html, reload));
  gulp.watch('source/icons/**/*.svg', gulp.series(sprite, reload));
};

// Build

const build = gulp.series(clean, copy, optimizeImages, gulp.parallel(styles, html, scripts, sprite, createWebp));

exports.build = build;

// Default

exports.default = gulp.series(
  clean,
  copy,
  copyImages,
  gulp.parallel(styles, html, createWebp, scripts),
  gulp.series(server, watcher),
);

Вырезка styles, server, watcher, default
// Styles

const styles = () => {
  return gulp
    .src('source/sass/*.scss', { sourcemaps: true })
    .pipe(plumber())
    .pipe(postcss([postcssImport(), postcssUrl()], { syntax: postScss }))
    .pipe(sass())
    .pipe(postcss([autoprefixer(), csso()]))
    .pipe(
      rename({
        extname: '.min.css',
      }),
    )
    .pipe(gulp.dest('build/css', { sourcemaps: '.' }))
    .pipe(sync.stream());
};

exports.styles = styles;

// Server

const server = (done) => {
  sync.init({
    server: {
      baseDir: 'build',
    },
    cors: true,
    notify: false,
    ui: false,
  });
  done();
};

exports.server = server;

// Watcher

const watcher = () => {
  gulp.watch('source/sass/**/*.scss', styles);
  gulp.watch('source/js/*.js', gulp.series(scripts, reload));
  gulp.watch('source/*.html', gulp.series(html, reload));
  gulp.watch('source/icons/**/*.svg', gulp.series(sprite, reload));
};

// Default

exports.default = gulp.series(
  clean,
  copy,
  copyImages,
  gulp.parallel(styles, html, createWebp, scripts),
  gulp.series(server, watcher),
);

При запуске (npm run start) всё ок, style.min.css собирается как и положено.

Но дальше если я начинаю добавлять какое-то свойство в .scss файлы, то сервер выводит ошибку....

Скриншот ошибки
61f39f9fa80e3058880177.png

... и зависает в таком состоянии. Задачу он не заканчивает и если я продолжаю писать, то он уже заново задачу не запускает, соответственно когда я свойство до конца допишу (условно "color: red;"), он не отработает.
Приходится ручками его останавливать через Ctrl+C и запускать заново. Получается при любом изменении сервер приходится перезапускать. Подскажите, где может быть проблема?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы