【问题标题】:Getting grunt-express to restart on changes让 grunt-express 重新启动更改
【发布时间】:2014-02-26 03:24:18
【问题描述】:

我正在尝试使用 grunt-express 和 grunt-watch。我希望服务器重新加载,我更改了我的服务器文件。

这是我得到的。

Gruntfile.js

var path = require('path');
module.exports = function(grunt) {
  grunt.initConfig({
    express: {
      options: {
        port: 8000
      },
      load: {
        server: path.resolve('./app')
      }
    },
    watch: {
      express: {
        files: ['app.js'],
        tasks: ['express:load']

      }
    }
  });
  grunt.loadNpmTasks('grunt-karma');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-express');

  grunt.registerTask('server', ['express:load', 'express-keepalive', 'watch']);
};

app.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);

app.get('/', function(req, res) {
  res.sendfile(__dirname + '/public/index.html');
});
exports = module.exports = server;
exports.use = function() {
  app.use.apply(app, arguments);
};

当我在控制台中输入 grunt server 时,我得到:

Running "express:load" (express) task

Running "express-server:load" (express-server) task
Web server started on port:8000, no hostname specified [pid: 21115]

Running "express-keepalive" task

服务器启动正常,我可以去 localhost:8000 查看我的页面。监视任务似乎没有开始,当我对 app.js 进行更改时,它不会重新启动。我基本上想要输入 grunt server 然后当 app.js 发生任何更改时,我希望服务器重新启动。我试过使用 serverreload 选项,但我似乎也无法让它工作。我也试过在 watch:express 任务中使用 express-restart(代替 express:livereload),但它说

Warning: path must be a string Use --force to continue.

【问题讨论】:

  • 您在 package.json 文件中指定了哪个 grunt-express 版本?如果是v1.0,看起来 express 任务会占用所有配置,而 watch 任务是不必要的。
  • 我使用的是 1.2.1。所以现在我的问题是如何设置我的 Gruntfile 以在 app.js 发生更改时运行重新加载快速服务器。
  • 我发现了另一个名为 grunt-express-server 的 grunt 插件,我可以设置它并开始工作。但是我仍然想知道如何让 serverreload 选项在 grunt-express 插件中正常工作。

标签: javascript node.js express gruntjs grunt-express


【解决方案1】:

在玩了一些之后,我能够让它工作,但有一个烦人的问题。这是 Gruntfile 的核心:

var path = require('path');

module.exports = function (grunt) {
  grunt.initConfig({
    express: {
      options: {
        port: 8000,
        hostname: '*'
      },
      livereload: {
        options: {
          server: path.resolve('./app.js'),
          livereload: true,
          serverreload: true,
          bases: [path.resolve('./public')]
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-express');

  grunt.registerTask('default', ['express', 'express-keepalive']);
};

但是似乎有一个issue where a different port is used every other save。如果其他服务器重新加载选项正在工作,我会暂时坚持下去。

附带说明一下,这个 grunt 插件似乎也在侦听端口,这意味着启动 app.js 应该以 module.exports = app; 而不是默认的 express http.createServer 返回自身。只要指定不同的端口,两者似乎都会同时运行。

【讨论】:

  • 谢谢你,我用同样的方式设置它,当它在每个其他保存时使用不同的端口时,我认为我做错了。 :D
  • @JoelV 知道在浏览器中自动打开它吗?以下代码不起作用open: { all: { path: 'http://localhost:<%= express.options.port%>' } } 然后grunt.registerTask('default', ['express', 'express-keepalive','open']);
  • @Devo 不,我开始使用 gulp 作为我的任务运行器。我相信有一个 livereload grunt 插件。