【问题标题】:Live Reload not Working with express, connect-livereload, tiny-lr, gulp-embedlr and gulp-livereloadLive Reload 不适用于 express、connect-livereload、tiny-lr、gulp-embedlr 和 gulp-livereload
【发布时间】:2015-07-12 20:59:17
【问题描述】:

我关注this tutorial 为我正在进行的一个小项目设置了一个 Gruntfile。一切似乎都很好,除了实时重新加载部分。我没有收到任何错误,但也没有实时重新加载。代码如下:

var browserify = require('browserify'),
    buffer = require('vinyl-buffer'),
    concat = require('gulp-concat'),
    del = require('del'),
    embedlr = require('gulp-embedlr'),
    express = require('express'),
    gulp = require('gulp'),
    gutil = require('gulp-util'),
    jshint = require('gulp-jshint'),
    livereload = require('connect-livereload'),
    lrserver = require('tiny-lr')(),
    refresh = require('gulp-livereload'),
    replace = require('gulp-replace'),
    source = require('vinyl-source-stream'),
    sourcemaps = require('gulp-sourcemaps'),
    uglify = require('gulp-uglify');

// clean
gulp.task('clean', function(callback) {
  del('./dist/*', callback);
});

// img
gulp.task('img', function() {
  return gulp.src('./src/img/*')
        .pipe(gulp.dest('./dist/img/'));
});

// index
gulp.task('index', function() {
  return gulp.src('./src/index.html')
        .pipe(replace('__now__', new Date().toDateString()))
        .pipe(gulp.dest('./dist/'));
});

gulp.task('index-dev', function() {
  return gulp.src('./src/index.html')
        .pipe(replace('__now__', new Date().toDateString()))
        .pipe(gulp.dest('./dist/'))
        .pipe(refresh(lrserver));
});

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

gulp.task('script', [ 'lint' ], function() {
  browserify({ entries: './src/script/dforbes.js', debug: true })
  .bundle()
  .pipe(source('dforbes.js'))
  .pipe(buffer())
  .pipe(uglify({ mangle: false }))
  .on('error', gutil.log)
  .pipe(gulp.dest('./dist/script/'));
});

gulp.task('script-dev', [ 'lint' ], function() {
  browserify({ entries: './src/script/dforbes.js', debug: true })
  .bundle()
  .pipe(source('dforbes.js'))
  .pipe(buffer())
  .pipe(sourcemaps.init({ loadMaps: true }))
  .pipe(uglify({ mangle: false }))
  .on('error', gutil.log)
  .pipe(sourcemaps.write('./'))
  .pipe(gulp.dest('./dist/script/'));
});

// style
gulp.task('style', function() {
  return gulp.src('./src/style/*')
        .pipe(gulp.dest('./dist/style/'));
});

// tmp
gulp.task('tmp', function() {
  return gulp.src('./src/tmp/*')
        .pipe(gulp.dest('./dist/tmp/'));
});

gulp.task('tmp-dev', function() {
  return gulp.src('./src/tmp/*')
        .pipe(gulp.dest('./dist/tmp/'))
        .pipe(refresh(lrserver));
});

// watch
gulp.task('watch', function() {
  gulp.watch([ './src/img/*' ], [ 'img' ]);
  gulp.watch([ './src/index.html' ], [ 'index-dev' ]);
  gulp.watch([ './src/script/*' ], [ 'script-dev' ]);
  gulp.watch([ './src/style/*' ], [ 'style' ]);
  gulp.watch([ './src/tmp/*' ], [ 'tmp-dev' ]);
});

// dev
gulp.task('dev', [ 'clean' ], function() {
  gulp.start([ 'img', 'index', 'script-dev', 'style', 'tmp' ]);

  var livereloadPort = 35729;
  var serverPort = 8080;

  var server = express();
  server.use(livereload({ port: livereloadPort, start: true }));
  server.use(express.static('./dist'));
  server.all('/*', function(req, res) {
    res.sendFile('index.html', { root: 'dist' });
  });

  server.listen(serverPort);
  lrserver.listen(livereloadPort);

  gulp.start('watch');
});

// default
gulp.task('default', [ 'clean' ], function() {
  gulp.start([ 'img', 'index', 'script', 'style', 'tmp' ]);
});

【问题讨论】:

    标签: express gulp livereload


    【解决方案1】:

    你错过了refresh 的电话,让 LiveReload 知道某些部分发生了变化。这是您的 style 任务的更改:

    gulp.task('style', function() {
       return gulp.src('./src/style/*')
           .pipe(gulp.dest('./dist/style/'))
           .pipe(refresh());
    });
    

    只需在您希望refresh 发生的任何地方添加最后一个pipe

    更新

    此外,您的 Gulpfile 中存在一些问题。请返回您找到的每个gulp.src 语句,如果您不合并它们,也不要将两个gulp.src 语句合并为一个gulp.task

    // wrong
    gulp.task('tmp-dev', function() {
      gulp.src('./src/index.html')
      .pipe(gulp.dest('./dist/'))
      .pipe(refresh(lrserver));
    
      gulp.src('./src/tmp/*')
      .pipe(gulp.dest('./dist/tmp/'))
      .pipe(refresh(lrserver));
    });
    
    // correct
    gulp.task('tmp-dev', function() {
      return gulp.src(['./src/index.html','./src/tmp/*'])
        .pipe(gulp.dest('./dist/'))
        .pipe(refresh(lrserver));
    });
    

    另一种解决方案是创建一个指向 dist 目录的观察程序,每当那里发生变化时刷新:

     gulp.watch('./dist/**/*', refresh);
    

    不过,另一种方式会更好,因为它可以让您拥有更多控制权 编辑:这个是假的

    【讨论】:

    • 现在,我只是尝试通过 tmp-dev 任务调用它,该任务有两个对 refresh(lrserver) 的调用。我滥用了吗?
    • 我不知道 tmp 文件夹里面有什么,但是,实际上这只会在 index.html 文件更改时触发重新加载,它不会监听您的资产(脚本、样式, 图片 ...)。这个调用必须放在所有你想要刷新的东西被创建的地方
    • 对,所以,根据您上面的评论,我现在只是想让它来处理我的 HTML 文件的更改......一旦我开始工作,我会移动这个功能转到其他复制任务。为什么我需要从我的 gulp 任务中返回?当我这样做时,我没有注意到任何区别。我尝试了您的两个建议,但实时重新加载仍然无法正常工作。
    • 您必须返回该流以让 Gulp 知道此任务何时完成。否则,您只是开始任务,而没有让任务管理器知道发生了什么。有关更多详细信息和文档,请参阅stackoverflow.com/questions/21699146/gulp-js-task-return-on-src。最后一个解决方案对我也不起作用,我用github.com/Hyra/angular-gulp-browserify-livereload-boilerplate/… 尝试过——似乎还有其他问题。你的tmp-dev 任务现在看起来如何?
    • 我已经更新了我的问题以反映我的 Gruntfile.js 的当前状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多