关于我如何在Node.js中实现文件的自动重载有什么想法吗?我厌倦了每次更改文件时重新启动服务器。 显然,Node.js的require()函数不会重新加载文件,如果他们已经被要求,所以我需要做这样的事情:

var sys     = require('sys'), 
    http    = require('http'),
    posix   = require('posix'),
    json    = require('./json');

var script_name = '/some/path/to/app.js';
this.app = require('./app').app;

process.watchFile(script_name, function(curr, prev){
    posix.cat(script_name).addCallback(function(content){
        process.compile( content, script_name );
    });
});

http.createServer(this.app).listen( 8080 );

在app.js文件中,我有:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

但这也不能工作-我在process.compile()语句中得到一个错误,说'require'没有定义。Process.compile正在计算app.js,但没有关于node.js全局变量的线索。


当前回答

我找到了一个简单的方法:

delete require.cache['/home/shimin/test2.js']

其他回答

解决方案: http://github.com/shimondoodkin/node-hot-reload

注意,您必须自己注意所使用的引用。

这意味着如果你这样做:var x=require('foo');y = x, z = x.bar;然后热装 它。

这意味着你必须在热reaload回调函数中替换存储在x、y和z中的引用。

有些人混淆了热重载和自动重启 我的nodejs-autorestart模块也有upstart集成,可以在引导时自动启动。 如果你有一个小的应用程序自动重启是可以的,但当你有一个大的应用程序热重载是更合适的。很简单,因为热重载更快。

我也喜欢我的节点流入模块。

这是一篇关于Node热重载的博文。它提供了一个github节点分支,您可以使用它来替换节点的安装,以启用热重新加载。

来自博客:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

现在,每当你修改myRequestHandler.js时,上面的代码将不再生效,并用新代码重新放置本地的re-questHandler。任何已存在的请求将继续使用旧代码,而任何新的请求将使用新代码。所有这些都不需要关闭服务器,不需要反弹任何请求,不需要提前终止任何请求,甚至不需要依赖内置的负载均衡器。

我找到了一个简单的方法:

delete require.cache['/home/shimin/test2.js']

一个好的、最新的替代supervisor的方法是nodemon:

监视node.js应用程序中的任何更改并自动重新启动服务器-非常适合开发

在没有npx的Node版本下使用nodemon(不建议使用v8.1及以下版本):

$ npm install nodemon -g
$ nodemon app.js

或者对捆绑了npx的Node版本使用nodemon (v8.2+):

$ npm install nodemon
$ npx nodemon app.js

或者在package.json中作为一个npm脚本中的devDependency:

"scripts": {
  "start": "nodemon app.js"
},
"devDependencies": {
  "nodemon": "..."
}

节点开发工作得很好。NPM安装node-dev

当服务器重新加载时,它甚至会给出桌面通知,并在消息中给出成功或错误。

在命令行启动你的应用程序:

node-dev app.js