【问题标题】:browsersync + gulp not injecting css - only reloadingbrowsersync + gulp 不注入 css - 仅重新加载
【发布时间】:2017-11-29 16:28:47
【问题描述】:

我最近开始使用 BrowserSync,我关注了他们的 gulp guide 并调整了一些东西来解决我遇到的一些问题,但是现在虽然它工作了,但它似乎每次都重新加载页面而不是注入 CSS。

我的 gulp 文件:

var gulp = require('gulp');
var browserSync = require('browser-sync').create();
var concat = require('gulp-concat');
var rename = require('gulp-rename');
var sass = require('gulp-sass');
var postcss = require('gulp-postcss');
var cleanCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var sourcemaps = require('gulp-sourcemaps');
var autoprefixer = require('autoprefixer');

gulp.task('scripts', function() {
    return gulp.src([
        'js/dev/main/**/*.js',
        // We have to set the bootstrap lines separately as some need to go before others
        'js/dev/bootstrap/alert.js',
        'js/dev/bootstrap/collapse.js',
        'js/dev/bootstrap/tooltip.js',
        'js/dev/bootstrap/popover.js',
        'js/dev/bootstrap/tab.js',
        'js/dev/bootstrap/transition.js',
    ])
        .pipe(sourcemaps.init())
            .pipe(concat('scripts.js'))
        .pipe(sourcemaps.write('../maps'))
        .pipe(gulp.dest('./js'));
});

gulp.task('uglify', ['scripts'], function() {
    return gulp.src('js/scripts.js')
        .pipe(rename({suffix: '.min'}))
        .pipe(uglify({
            mangle: false
        }))
        .pipe(gulp.dest('./js'));
});

// create a task that ensures the `uglify` task is complete before
// reloading browsers
gulp.task('js-watch', ['uglify'], function (done) {
    browserSync.reload();
    done();
});

/* Creates the standard version */

gulp.task('styles', function() {
    return gulp.src('scss/**/*.scss')
        .pipe(sourcemaps.init())
            .pipe(sass().on('error', sass.logError))
            .pipe(postcss([
                autoprefixer({
                    browsers: [
                        'last 4 Chrome versions',
                        'last 4 Firefox versions',
                        'last 4 Edge versions',
                        'last 2 Safari versions',
                        'ie >= 10',
                        '> 1.49%',
                        'not ie <= 9'
                    ],
                    cascade: false
                }),
            ]))
        .pipe(sourcemaps.write('../maps'))
        .pipe(gulp.dest('./css/'))
        .pipe(browserSync.stream(({match: 'css/**/*.css'})));
});

/* Creates the minified version */

gulp.task('css-minify', ['styles'], function() {
    return gulp.src('scss/**/*.scss')
        .pipe(sourcemaps.init())
            .pipe(sass({
                outputStyle: 'compact' // Options: nested, expanded, compact, compressed
            }).on('error', sass.logError))
            .pipe(postcss([
                autoprefixer({
                    browsers: [
                        'last 4 Chrome versions',
                        'last 4 Firefox versions',
                        'last 4 Edge versions',
                        'last 2 Safari versions',
                        'ie >= 10',
                        '> 1.49%',
                        'not ie <= 9'
                    ],
                    cascade: false
                }),
            ]))
            .pipe(cleanCSS({
                advanced: false,
                aggressiveMerging: false
            }))
            .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.write('../maps'))
        .pipe(gulp.dest('./css/'));
});

gulp.task('browser-sync', function() {
    browserSync.init({
        open: 'external',
        proxy: "bmmedia.dev",
        host: 'bmmedia.dev',
        // port: 5000,
        browser: "chrome",
    });
});

gulp.task('watch', ['browser-sync', 'js-watch', 'css-minify'], function() {
    gulp.watch(['scss/**/*.scss', 'js/dev/**/*.js'], ['js-watch', 'css-minify']);
});

gulp.task('default', ['js-watch', 'css-minify']);

注意我的watch 任务,这是我最近所做的更改,因为我遇到了指定的问题here,我用this answer 解决了它,但是现在虽然它工作正常,但它似乎只能重新加载,而不是注入。

我能做些什么来解决这个问题吗?

编辑:

我刚刚意识到它每次都在重新加载,因为每次发生更改时我都在运行 js-watch,甚至是 .scss 文件,所以我将其更改为:

gulp.task('watch', ['browser-sync', 'js-watch', 'css-minify'], function() {
    gulp.watch(['scss/**/*.scss'], ['css-minify']);
    gulp.watch(['js/dev/**/*.js'], ['js-watch']);
});

但是现在它不会在 .scss 文件更改时注入或重新加载。

【问题讨论】:

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


    【解决方案1】:

    我相信我已经修好了...

    我的watch任务我改成了:

    gulp.task('watch', ['browser-sync'], function() {
        gulp.watch(['scss/**/*.scss'], ['css-minify']);
        gulp.watch(['js/dev/**/*.js'], ['js-watch']);
    });
    

    然后在我的styles 任务中我更改了这一行:

    .pipe(browserSync.stream(({match: 'css/**/*.css'})));
    

    到:

    .pipe(browserSync.stream());
    

    不知道为什么它没有找到 CSS 更改,我只知道它现在似乎可以工作。

    【讨论】:

      【解决方案2】:

      您也可以尝试只查看已编译的输出文件。

      Dest/css/styles.css
      Dest/js/my.js
      

      对 sass / js 模块的任何更改都会反映在最终的 css / js 输出文件中。浏览器重新加载只会在 css/js 编译完成时触发,而不是在 sass /js 包编译时尝试重新加载。

      另外,看看 Gulp-newer。如果最终输出文件 (dest/css/styles.css) 相对于生成它的文件 (src/sass/**.scss) 已更改,则它可用于检查/触发任务。

      这对于图像也非常方便(不需要在每次构建时缩小它们,只有在更新时)也可以添加任何其他只有在某些内容发生更改时才需要执行的检查。

      【讨论】:

      • 您的意思是从watch 任务中分离browser-sync 任务,这样它就不会在捆绑包完成时尝试运行?另外,感谢关​​于gulp-newer 的提示,看起来是一个不错的插件。 :)
      • .pipe(reload({stream:true}));应放置在您要确保刷新浏览器的每个脚本进程的末尾,因此无需在主监视任务 fn 期间“监视”浏览器重新加载任务。
      • 好吧,我不是在“监视”任务——它只是在 watch 运行时运行;但由于watch 任务是一个空闲等待更改的进程,我不确定,但我假设它只运行一次,然后在发生更改时运行请求的任务,其中不包括@ 987654327@ 任务,因为只有在 watch 任务本身运行时才应该运行(启动)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2018-11-30
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多