Внедрение SASS + CSS с помощью Gulp и BrowserSync

Я только начинаю работать с BrowserSync, и у меня есть вопрос относительно распространенных вариантов использования конфигурации для внедрения SASS + CSS.

Что меня немного смущает, так это то, что я могу дать свойству server собственное имя.

В документации здесь используется "./app". Могу ли я использовать другое имя, например "./site", или мне разрешено использовать только "./app"?

Вот код

// task 
gulp.task('serve',['sass'], function (){

    // static server 
    browserSync.init({
        server: "./app"
    });

    // watching html and scss files for changes then reloading browser
    gulp.watch("app/scss/*.scss", ['sass']);
    gulp.watch("app/*.html").on('change', browserSync.reload);

});

person brent_white    schedule 27.08.2015    source источник


Ответы (1)


ОБНОВЛЕНО

Если вы хотите настроить browserSync как статический сервер с перезагрузкой в ​​реальном времени, вы в значительной степени правы со своим подходом. Вы можете указать браузерной синхронизации любую папку в вашем репозитории, используя опцию baseDir. Вы также можете использовать несколько каталогов. Для получения дополнительной информации ознакомьтесь с документацией.

Первый. Я хотел бы разделить задачи, которые у вас есть.

Лично я бы предпочел, чтобы моя серверная задача была примерно такой;

gulp.task('serve', ['build'], function(event) {
  var server = browsersync.create();
  server.init({
    baseDir: 'app/'
  });
  return server.watch('app/**', function(evt, file) {
    server.reload();
  });
});

Обратите внимание, что build является зависимостью. Это гарантирует, что все наши обслуживаемые файлы будут на месте, когда мы инициируем BrowserSync.

Сохраняя его общим, мы можем затем разделить задачи, связанные со SCSS, на их собственные задачи, такие как scss:compile и scss:watch.

gulp.task('scss:compile', function(){
    return gulp.src('src/scss/**/*.scss')
        .pipe(plumber())
        .pipe(scss())
        .pipe(gulp.dest('app/css/');
});

а также

gulp.task('scss:watch', function() {
    gulp.watch('src/scss/**/*.scss', ['scss:compile']);
});

Для внедрения CSS. Есть два варианта сделать это

Помните, что инъекция отличается от перезагрузки. В то время как перезагрузка сбросит состояние страницы, внедрение не повлияет на текущее состояние страницы и просто введет стили.

Первый вариант — вызвать browsersync.stream() с переданным по конвейеру содержимым вашей компиляции SASS, как показано ниже;

gulp.task('scss:compile', function() {
  return gulp.src('src/scss/**/*.scss')
    .pipe(plumber())
    .pipe(scss())
    .pipe(gulp.dest('app/css')
    .pipe(browsersync.stream());
});

Обратите внимание, что последний канал вводит изменения. Это также требует проверки типа файла в часах BrowserSync, чтобы перезагружаться только при изменении файла, отличного от CSS.

Этот вариант подходит. Тем не менее, я думаю, что неясно, чтобы он был просто связан в конце и отделен от кода установки BrowserSync.

Второй вариант (лично предпочтительнее) – отслеживать изменения с помощью BrowserSync, и если изменяется файл CSS, используйте vinyl для потоковой передачи этих изменений в BrowserSync.

Что-то вроде следующего имеет тенденцию работать;

var gulp      = require('gulp'),
  browsersync = require('browser-sync'),
  vss         = require('vinyl-source-stream'),
  vb          = require('vinyl-buffer'),
  vf          = require('vinyl-file');

gulp.task('serve', ['build'], function() {
  var server = browsersync.create();
  server.init({ baseDir: 'app/' });
  return server.watch('app/**', function(evt, file) {
    if (evt === 'change' && file.indexOf('.css') === -1)
      server.reload();
    if (evt === 'change' && file.indexOf('.css') !== -1)
      vf.readSync(file)
        .pipe(vss(file))
        .pipe(vb())
        .pipe(server.stream());
  });
});

Надеюсь, это поможет вам!

person jh3y    schedule 27.08.2015
comment
Большое спасибо за вашу помощь здесь @jh3y Я вижу, как вы все настраиваете, и я буду следовать вашему общему подходу к этому. - person brent_white; 27.08.2015
comment
не могли бы вы объяснить эту строку return gulp.watch('app/**/*.*).on('change', browserSync.reload); Кажется, я не могу понять, как эта строка будет работать с моей текущей настройкой файла gulp. - person brent_white; 27.08.2015
comment
Я тоже новичок в Gulp :) - person brent_white; 27.08.2015
comment
Эта строка return gulp.watch('app/**/*.*).on ... следит за изменением любых файлов в выходной папке и после изменения перезагружает сервер. Если мы предположим, что в вашей выходной папке есть только css, js и html, вы можете изменить glob на что-то вроде app/**/*.{html,css,js}. - person jh3y; 27.08.2015
comment
Спасибо! Получил Browsersync для работы, но я не могу увидеть, как мои изменения автоматически перезагружаются в браузере (обновление в реальном времени), проверьте сообщение, которое я только что сделал. - person brent_white; 29.08.2015
comment
stackoverflow .com/questions/32279766/ - person brent_white; 29.08.2015
comment
Эй, Брент, нет проблем, я посмотрю. - person jh3y; 29.08.2015