【问题标题】:If adding a new component to master.scss, browser-sync doesnt reload如果向 master.css 添加新组件,浏览器同步不会重新加载
【发布时间】:2016-12-16 02:56:47
【问题描述】:

如果我将一个新组件 (_example.scss) 添加到我的 master.scss 并保护它,我的浏览器同步会自动重新加载并显示来自“_example.scss”的样式更改。如果我更改此文件中的其他内容并确保其安全,我的浏览器不会重新加载...有什么想法吗?如果我重新启动 gulp,它会完美运行。是否可以重新初始化通过浏览器同步进行的文件?

这是我的 gulpfile.js:

var gulp = require('gulp');  
var sass = require('gulp-sass');
var rename = require('gulp-rename');
var notify = require('gulp-notify');
var cssmin = require('gulp-cssmin');
var plumber = require('gulp-plumber');
var browserSync = require('browser-sync').create();
var changed = require('gulp-changed');
var autoprefixer = require('gulp-autoprefixer');
var reload = browserSync.reload;

// Compile
gulp.task('sass-master', function () {  
    gulp.src('./files/layout/scss/master.scss')
        .pipe(plumber())
        .pipe(sass({}).on('error', function(err) {
            return notify().write(err);
        }))
        .pipe(rename({suffix: '.min'}))
        .pipe(cssmin())
        .pipe(autoprefixer('last 2 version', '> 1%', 'ie 7', 'ie 8'))
        .pipe(gulp.dest('./files/layout/css'))
        .pipe(notify('sass-master-task done, ready!'));
});
gulp.task('sass-ieframe', function () {  
    gulp.src('./files/layout/scss/base/ieframe.scss')
        .pipe(plumber())
        .pipe(sass({}).on('error', function(err) {
            return notify().write(err);
        }))
        .pipe(rename({suffix: '.min'}))
        .pipe(cssmin())
        .pipe(gulp.dest('./files/layout/css'))
        .pipe(autoprefixer('last 2 version', '> 1%', 'ie 7', 'ie 8'))
        .pipe(notify('sass-ieframe-task done, ready!'));
});
gulp.task('sass-fonts', function () {  
    gulp.src('./files/layout/scss/base/fonts.scss')
        .pipe(plumber())
        .pipe(sass({}).on('error', function(err) {
            return notify().write(err);
        }))
        .pipe(rename({suffix: '.min'}))
        .pipe(cssmin())
        .pipe(gulp.dest('./files/layout/css'))
        .pipe(autoprefixer('last 2 version', '> 1%', 'ie 7', 'ie 8'))
        .pipe(notify('sass-fonts-task done, ready!'));
});

// Serve
gulp.task('browser-sync', function() {
    browserSync.init(['./files/layout/css/*.css'], {
        proxy: 'dumb-test'
    });
});

// Reload Task
gulp.task('bs-reload', function () {
    browserSync.reload();
});


// Watch Task
gulp.task('default', ['sass-master', 'sass-fonts', 'sass-ieframe', 'browser-sync'], function () {
    gulp.watch(['./files/layout/scss/**/*.scss', './files/layout/scss/master.scss', '!./files/layout/scss/base/ieframe.scss', '!./files/layout/scss/base/fonts.scss'], ['sass-master', 'bs-reload'])
    gulp.watch(['./files/layout/scss/base/ieframe.scss'], ['sass-ieframe', 'bs-reload'])
    gulp.watch(['./files/layout/scss/base/fonts.scss'], ['sass-fonts', 'bs-reload'])
    gulp.watch(['./templates/**/*'], ['bs-reload'])
    gulp.watch(['./files/**/*.+(png|jpg|gif|svg)'], ['bs-reload'])
});

【问题讨论】:

    标签: gulp gulp-watch browser-sync gulp-sass


    【解决方案1】:

    我会说这是一个时间问题。 Gulp 并行运行任务,并且您的重新加载任务应该真正等到构建完成之后。例如而不是

    gulp.watch(['./files/layout/scss/base/ieframe.scss'], ['sass-ieframe', 'bs-reload'])
    

    应该是

    gulp.watch(['./files/layout/scss/base/ieframe.scss'], ['sass-ieframe-watch'] 
    

    有一个单独的任务

    gulp.task('sass-ieframe-watch', ['sass-ieframe'], function(done) {
      browserSync.reload();
      done();
    });
    

    更好的是让您的 sass 任务使用流选项重新加载任务本身。上述样式用于除 sass 之外的所有内容。这样 browserSync 无需重新加载整个页面即可注入新的 css,但 js 和 html 仍然需要重新加载。见https://www.browsersync.io/docs/gulp

    【讨论】:

    • 感谢您的回答,仍然无法正常工作:( – 我需要重新启动 gulp..suckz
    • 除了@peterorum 所说的——这是正确的——在你的所有任务中加入return 语句,看看是否有帮助。还要查看 peterorum 提到的 {stream:true} 选项,并将 reload 调用移动到各个任务的末尾..
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2023-04-09
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2015-09-11
    相关资源
    最近更新 更多