Gulp监听Node应用程序何时调用app.listen()或端口(livereload,nodejs和gulp)

4
我正在尝试让gulp-livereload与我的nodejs服务器一起工作。我使用gulp-nodemon在文件更改后重新启动服务器,这个功能是OK的。但在正确时间调用livereload.reload()有困难。 目前我在我的gulpfile.js中的.on('start'...处调用livereload.reload()(每当我的nodemon启动脚本时)。这种方法可以实现刷新效果,但需要等待几秒钟。原因是当nodemon开始运行nodejs脚本时,它会在脚本调用app.listen(port)之前调用livereload.listen(),所以在服务器未准备好之前浏览器就已经刷新了。 有没有办法监听nodejs nodemon脚本是否已调用app.listen(port),或者如何监听特定端口是否正在使用呢? 我已经通过使用一个小睡眠来解决了这个问题,但这样做感觉很不妥和肮脏。
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
使用可读事件来监控子进程的标准输出。 示例:
nodemon({script: 'app.js',
         nodeArgs: ['--harmony'],
         stdout: false})
    .on('readable', function(data) {
        this.stdout.on('data', function(chunk) {
            if (/koa server listening/.test(chunk)) {
                console.log('livereload');
                livereload.reload();
            }
            process.stdout.write(chunk);
        });
        this.stderr.pipe(process.stderr);
    });

app.js

app.listen(3000, function(err) {
    console.log('koa server listening');
});

这就是我一直在寻找的!非常感谢! - Guido Tarsia

1
这是一个基于connect服务器、connect-livereloadgulp-livereload插件的简单且< strong>经过测试的livereload解决方案示例,如果有帮助的话。请注意保留HTML标签。

var gulp = require('gulp');
var connect = require('connect');
var connectLivereload = require('connect-livereload');
var opn = require('opn');
var gulpLivereload = require('gulp-livereload');

var config = {
    rootDir: __dirname, // 根目录
    servingPort: 8080, // 服务端口

    // 监听文件变化以进行实时刷新的文件
    filesToWatch: ['*.{html,css,js}', '!Gulpfile.js']
}

// 默认任务 - 在命令行中运行`gulp`时调用
gulp.task('default', ['watch', 'serve']);

gulp.task('watch', ['connect'], function () {
  gulpLivereload.listen(); // 启动实时刷新监听
  gulp.watch(config.filesToWatch, function(file) {
    gulp.src(file.path)
      .pipe(gulpLivereload());
  });
});

gulp.task('serve', ['connect'], function () {
  return opn('http://localhost:' + config.servingPort); // 打开浏览器并访问指定地址
});

gulp.task('connect', function(){
  return connect()
    .use(connectLivereload()) // 使用livereload中间件
    .use(connect.static(config.rootDir)) // 指定静态资源目录
    .listen(config.servingPort); // 监听指定端口
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,