首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gulp浏览器-同步只起一次作用

Gulp浏览器-同步只起一次作用
EN

Stack Overflow用户
提问于 2015-04-22 22:41:34
回答 6查看 6.6K关注 0票数 12

我正在我的一个项目上试用Gulp,我想像以前使用Grunt watch那样运行它。这意味着,一旦所有这些都完成了,它就需要查看更少的文件和js文件,编译、合并、编译和刷新浏览器。

我设法让它与gulp-browser-sync一起工作,但由于某种原因,它只能工作一次。我对.less文件进行了更改,浏览器将重新加载。然后,第二次更改,它会编译,但不会发生重新加载。

日志如下:

代码语言:javascript
复制
[BS] Serving files from: ./
[09:47:26] Starting 'css-clean'...
[09:47:26] Finished 'css-clean' after 16 ms
[09:47:26] Starting 'styles'...
[BS] 1 file changed (styles.min.css)
[09:47:27] Finished 'styles' after 624 ms
[09:47:27] Starting 'styles-watch'...
[BS] Reloading Browsers...

当我第二次点击保存时:

代码语言:javascript
复制
[09:47:31] Starting 'css-clean'...
[09:47:31] Finished 'css-clean' after 3.39 ms
[09:47:31] Starting 'styles'...
[BS] 1 file changed (styles.min.css)
[09:47:32] Finished 'styles' after 362 ms

至于JS,它一直都在工作。没有任何问题,即使在样式任务完成之后,JS更改仍然会正确地触发重新加载。真正有问题的只是风格。

这是gulpfile.js

代码语言:javascript
复制
var gulp = require('gulp'),
    autoprefixer = require('gulp-autoprefixer'),
    less = require('gulp-less'),
    minifycss = require('gulp-minify-css'),
    concat = require('gulp-concat'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    rename = require('gulp-rename'),
    notify = require('gulp-notify'),
    path = require('path'),
    streamqueue = require('streamqueue'),
    clean = require('gulp-clean'),
    browserSync = require('browser-sync').create(),
    reload = browserSync.reload;


// Clean the CSS folder
gulp.task('css-clean', function () {
    return gulp.src(['dist/css'], {read: false})
        .pipe(clean());
});

// Clean the CSS folder
gulp.task('js-clean', function () {
    return gulp.src(['dist/js'], {read: false})
        .pipe(clean());
});


// Generate the CSS styles, clean before hand
gulp.task('styles', ['css-clean'], function() {
  return streamqueue({ objectMode: true },
            gulp.src(['./bower_components/uikit/less/uikit.less']),
            gulp.src(['./src/less/main.less'])
        )
    .pipe(concat('styles.less'))
    .pipe(less({
      paths: [ path.join(__dirname, 'less', 'includes') ]
    }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('dist/css'))
    .pipe(rename({suffix: '.min'}))
    .pipe(minifycss())
    .pipe(gulp.dest('dist/css'))
    .pipe(browserSync.reload({stream:true}));
});

// create a task that ensures the `styles` task is complete before
// reloading browsers
gulp.task('styles-watch', ['styles'], browserSync.reload);



// Lint Task
gulp.task('lint', function() {
    return gulp.src('src/js/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('default'));
});


// Generate the scripts, clean before hand
gulp.task('scripts', ['js-clean', 'lint'], function() {
  return streamqueue({ objectMode: true },
            gulp.src(['./bower_components/jquery/dist/jquery.js']),
            gulp.src(['./bower_components/modernizer/modernizr.js']),
            gulp.src(['./bower_components/uikit/js/uikit.js']),
            gulp.src(['./src/js/plugin.js']),
            gulp.src(['./src/js/main.js'])
        )
    .pipe(concat('scripts.js'))
    .pipe(gulp.dest('dist/js'))
    .pipe(rename({suffix: '.min'}))
    .pipe(uglify())
    .pipe(gulp.dest('dist/js'))
    .pipe(browserSync.reload({stream:true}));
});

// create a task that ensures the `scripts` task is complete before
// reloading browsers
gulp.task('scripts-watch', ['scripts'], browserSync.reload);


// Lint Task
gulp.task('alldone', ['scripts'], function() {
    return gulp.src('src/js/*.js')
               .pipe(notify({ message: 'Gulp tasks are completed!!' }));
});


// Static server
gulp.task('browsersync', function() {
    browserSync.init({
        server: {
            baseDir: "./"
        }
    });

    gulp.watch("src/less/*.less", ['styles-watch']);
    gulp.watch('src/js/*.js', ['lint', 'scripts-watch']);
    gulp.watch("*.html").on('change', reload);
});


// Default Task
gulp.task('default', ['css-clean', 'js-clean', 'styles', 'lint', 'scripts', 'alldone']);

// Build Task
gulp.task('build',   ['css-clean', 'js-clean', 'styles', 'lint', 'scripts', 'alldone']);

谢谢你的帮忙!

EN

回答 6

Stack Overflow用户

发布于 2016-07-07 16:55:02

对于我在Gulp4中,匿名函数没有解决这个问题,我所做的是将browserSync.reload()包装在一个带有完成回调的函数中:

代码语言:javascript
复制
function reload(done) {
  browserSync.reload();
  done();
}

gulp.watch(['scripts/**/*.js','!scripts/main.min.js'], gulp.series(buildScripts, reload));
票数 24
EN

Stack Overflow用户

发布于 2015-05-25 20:27:51

直接使用怎么样?

代码语言:javascript
复制
.pipe(browserSync.stream())

我曾经在更改'.jade‘文件时遇到过同样的问题,它只重新加载了一次。然后我将browserSync.reload包装在一个匿名函数中,比如

代码语言:javascript
复制
gulp.task('templates-watch', ['templates'], function() {
    browserSync.reload();
});

这对我很管用。我不知道browserSync.reload.有没有什么特别之处试试看怎么样?:)

票数 23
EN

Stack Overflow用户

发布于 2020-05-04 16:47:23

我知道这不是正确的做法,但经过反复试验,我发现在browserSync.reload()之后使用未定义的函数

代码语言:javascript
复制
gulp.watch("./**/*.php", function () {
    browserSync.reload();
    done();
});

导致我的日志中出现引用错误,从而触发重新加载浏览器:

代码语言:javascript
复制
ReferenceError: done is not defined 
    at ...
    at ...
    at asyncRunner (...)
    at processTicksAndRejections (...)
[Browsersync] Reloading Browsers...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29801070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档