Grunt-contrib-watch与grunt-contrib-connect

时间:2014-11-27 00:21:55

标签: node.js gruntjs grunt-contrib-watch grunt-contrib-connect

不幸的是,grunt-contrib-watchgrunt-contrib-connect似乎并不好看。

在grunt-contrib-connect readme上,它说:

  

请注意,只要grunt正在运行,此服务器就会运行。一旦grunt的任务完成,Web服务器就会停止。可以使用keepalive选项更改此行为,并且可以通过运行grunt connect :: keepalive等任务来临时启用。

精细。但是,如果我想与连接服务器一起运行我的监视任务呢?像这样:

connect: {
  server: {
    options: {
      port: 8000,
      hostname: 'localhost',
      keepalive: true
    }
  }
},
watch: {
  options: {
    livereload: true
  },
  files: ['**'],
  tasks: ['connect'],
}

此处,connect任务在文件更改时运行。如果我将connect的keepalive选项设置为true,那么grunt-contrib-watch将停止观看,因为技术上尚未完成任务。如果我伪造keepalive选项,则连接服务器在完成任务后就会死亡。

是的,我可以运行命令......

$ grunt connect
$ grunt watch

...在单独的shell中,但是没有办法用一个命令运行它们吗?

2 个答案:

答案 0 :(得分:3)

grunt-contrib-watch 中的Livereload通知下面某个端口的文件更改,您可以看到它位于35729.

另一方面, grunt-contrib-connect 中的livereload侦听端口35729的更改。

所以我们应该将它们配置为 -

connect: {
  server: {
    options: {
      port: 8000,
      hostname: 'localhost',
      livereload: 35729
    }
  }
},
watch: {
  options: {
    livereload: 35729
  },
  files: ['**'],
  tasks: []
}

您无需在此处提供“connect”作为任务。由于重新加载的工作是通过livereload在这里完成的。 现在使用单个命令使这两个命令工作,我们将它们注册为 -

grunt.registerTask("server", ["connect", "watch"]);

现在运行连接,然后运行watch。现在通常registerTasks通过完成第一个任务然后完成第二个任务来工作,依此类推。但是由于你所说的连接行为 -

  

请注意,只要grunt正在运行,此服务器就会运行

Connect只运行一次。但是Watch会继续运行以寻找变化(保持咕噜声运行),从而保持连接服务器的正常运行。

现在尝试

grunt server
事情会像魅力一样发挥作用。

答案 1 :(得分:0)

我使用grunt-nodemon,它将watch和nodejs启动器封装在一个任务中:

nodemon: {
  dev: {
    script: 'app.js',
    options: {
      ignore: [
        'node_modules/**',
        'public/**'
      ],
      ext: 'js'
    }
  }
}

然后执行:

$ grunt nodemon:dev

现在,nodemon只使用nodejs启动app.js脚本,因此您需要一个小的app.js来加载静态静态快速服务器:

var express = require('express');
var server = express(); // better instead
server.configure(function(){
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);