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

时间:2015-06-01 23:55:50

标签: javascript node.js gruntjs connect

我有启动服务器的繁琐任务:

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任务阻止打开任务。如何在服务器启动后保持此节点服务器运行并打开浏览器?

2 个答案:

答案 0 :(得分:1)

我和你的问题一样,我在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']);
}

答案 1 :(得分:0)

两件事:

  1. 你的'connect'任务当前在等待时阻塞,你必须告诉它让grunt进程异步运行:在最后调用done()

    ...
        server.listen(port);
        done();
    });
    
  2. 现在您的构建将在任务列表的末尾结束,并使用它取下您的服务器。所以你必须添加一个任务来保持它的活力。我建议使用grunt-contrib-watch,但您可以选择任何您喜欢的,只要它是阻止任务:

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