Grunt 启动 Node Server 然后打开浏览器

Grunt start Node Server and then open browser

我有启动服务器的 grunt 任务:

module.exports = function(grunt){ 
  grunt.registerMultiTask('connect', 'Run a simple Node Server', function(){
    var options = this.options();
    // Tell Grunt this task is asynchronous.
    var done = this.async();
    var server = connect();
    server.use(function(request, response, nxt){
      ...
    });
    server.listen(port);
  });
};

现在想先用grunt启动这个节点服务器,然后用grunt-open插件打开浏览器

grunt.task.run(['startServer', 'open']);

但是 startServer 任务在服务器继续侦听时阻止打开任务。我应该怎么做才能保留此节点服务器运行并在服务器启动后打开浏览器?

两件事:

  1. 您的 'connect' 任务当前在等待时阻塞,您必须告诉它让 g运行t 异步处理 运行:调用 done() 最后

    ...
        server.listen(port);
        done();
    });
    
  2. 现在您的构建将在任务列表的末尾结束,并随之关闭您的服务器。因此,您必须添加一个任务以使其保持活动状态。我建议使用grunt-contrib-watch,但你可以选择任何你喜欢的,只要它是一个阻塞任务:

    grunt.task.run(['startServer', 'open', 'watch]);
    

顺便问一下,你为什么调用 grunt.task.run 而不是定义你自己的任务序列 grunt.registerTask('default', ['startServer', 'open', 'watch]);

我遇到了和你一样的问题,我在 Windows 环境中工作。我的解决方案是将 Web 服务器代码放在一个文件中,例如 myServer.js,并在 grunt-exec 设置中使用 cmd: "start node \"path\to\myServer.js"

示例:

假设我的服务器文件位于以下路径:D:\SourceCodes\WebServer\myServer.js

我服务器的ip地址和端口是192.168.1.1:8080,

我的网页是 index.html

那么 Gruntfile.js 将是:

module.exports = function (grunt) {
    grunt.initConfig({
       exec: {
           run_server:{
               cwd: "D:/SourceCodes/WebServer/",
               cmd: "start node \"D:/SourceCodes/WebServer/myServer.js\""
           },
           open_web:{                
               cmd: "start chrome http://192.168.1.1:8080/index.html"
           }
    });

    grunt.loadNpmTasks('grunt-exec');
    grunt.registerTask('default', ['exec']);
}