Search code examples
javascriptnode.jsgruntjs

Grunt start Node Server and then open browser


I have grunt task that starts the server:

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);
  });
};

Now I want to use grunt to start this node server first and then open the browser using grunt-open plugin.

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

But startServer task in blocking the open task as the server keeps on listening. What should I do to keep this node server running and open the browser once the server starts?


Solution

  • Two things:

    1. your 'connect' task currently blocks while waiting, you have to tell it to let the grunt process run asynchronously: call done() at the end

      ...
          server.listen(port);
          done();
      });
      
    2. now your build will end at the end of your task list, and take down your server with it. So you have to add a task to keep it alive. I suggest using grunt-contrib-watch, but you may choose any one you like, as long as it's a blocking task:

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

    By the way, why are you calling grunt.task.run instead of defining your own task sequence grunt.registerTask('default', ['startServer', 'open', 'watch]); ?