【问题标题】:Why would Browsersync live reload for one compilation task but not another?为什么 Browsersync 会为一个编译任务而不是另一个编译任务实时重新加载?
【发布时间】:2016-08-11 05:28:59
【问题描述】:

我正在运行一个 gulpfile 来编译 Sass、CoffeeScript 并通过 Browsersync 实时重新加载:

var gulp = require('gulp');
var plumber = require('gulp-plumber');
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
var cssmin = require('gulp-cssmin');
var coffee = require('gulp-coffee');
var uglify = require('gulp-uglify');
var browserSync = require('browser-sync');

gulp.task('sass', function() {
  return gulp.src('./src/scss/**/*.scss')
    .pipe(plumber())
    .pipe(sass({
      style: 'expanded',
      precision: 10
    }))
    .pipe(autoprefixer({browsers: ['> 1%', 'last 2 versions',   'Firefox ESR']}))
    .pipe(cssmin())
    .pipe(gulp.dest('./dist'))
    .pipe(browserSync.stream());
});


gulp.task('coffee', function() {
  return gulp.src('./src/coffee/**/*.coffee')
    .pipe(plumber())
    .pipe(coffee())
    .pipe(uglify())
    .pipe(gulp.dest('./dist'))
    .pipe(browserSync.stream());
});


gulp.task('serve', function() {
  browserSync.init({
    proxy: 'http://mamp-site.dev'
  });
  gulp.watch('./src/scss/**/*.scss', ['sass']);
  gulp.watch('./src/coffee/**/*.coffee', ['coffee']);
});

每次我进行更改时,Browsersync 都会成功重新加载我编译的 JS,但不会重新加载我编译的 CSS。我知道在gulp.dest() 之后放置browserSync.stream() 是正确的,因为Browsersync 说它only cares about your CSS when it's finished compiling。我还验证了我的 Sass 正在编译。

为什么 Browsersync 可以用于我的 'coffee' 任务而不是我的 'sass' 任务?这是我第一次尝试 gulp,所以我希望它是简单的。

编辑:仅在 'serve' 任务中观看 'sass' 有效,但不适用于 'sass''coffee'

【问题讨论】:

  • 恕我直言:你应该尝试 webpack 并离开 gulp..
  • @Hardy,对于这样的事情,webpack 不是矫枉过正吗?我只做了很少的研究。是什么让 webpack(或任何其他模块打包器)比 gulp 甚至 grunt 之类的任务运行器更好?
  • @Hardy,FWIW 我在 Drupal 主题上使用它
  • 我不认为 webpack 对于这种东西是“矫枉过正”。 Gulp 总是比 grunt 好,因为 gulp 是关于流和构建复杂管道的。它使用 node.js 的流,执行速度更快,因为它不会像 grunt 那样打开/关闭文件,也不会一直创建中间副本。

标签: javascript coffeescript gulp browser-sync


【解决方案1】:

我不知道为什么您的 sass 没有重新加载,但您不应该将 browserSync.stream 用于您的 javascript。也许溪流混在一起了。你的手表应该是

gulp.watch('./src/coffee/**/*.coffee', ['coffee-watch']);

应该有

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

从您的咖啡任务中删除 .pipe(browserSync.stream());

【讨论】:

  • 谢谢,但你能解释一下为什么这样更好吗?如果browserSync.stream()错了,为什么Browsersync会推荐呢? browsersync.io/docs/gulp#gulp-sass-css。如果正在运行 Browsersync 实例,则使用 Stream 注入更改。而您的done() 函数意味着 Browsersync 正在异步运行,但它不与 gulp 管道同步运行吗?
  • 嗨 - 流对于 css 更改是正确的,但对于 js/coffee 更改不正确。 Node.js 更改需要一个完整的页面重新加载(刷新),这是由 browserSync.reload 完成的。 css 更改可以直接注入您的页面,而无需刷新整个页面,并且您这样做的方式是正确的。 browserSync 文档显示了这两种方法,一种用于 sass,一种用于 js。 browsersync.io/docs/gulp#gulp-reload
  • 啊,用 JS 更改重新加载整个窗口现在听起来很明显。我也刚刚注意到您的答案是 Browsersync 在 CSS 注入部分下方推荐的内容:browsersync.io/docs/gulp#gulp-reload。所以我尝试了您的解决方案,'sass''coffee' 都正确重新加载!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多