关于我如何在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全局变量的线索。


当前回答

如果你说的是服务器端的NodeJS热加载,假设你希望在服务器上有一个Javascript文件,它有一个描述的快速路由,你希望这个Javascript文件热加载,而不是在文件更改时服务器重新启动,那么razzle可以做到这一点。

basic-server就是一个例子

https://github.com/jaredpalmer/razzle/tree/master/examples/basic-server

如果更改并保存了https://github.com/jaredpalmer/razzle/blob/master/examples/basic-server/src/server.js文件,则该文件将热重新加载,服务器不会重新启动。

这意味着您可以编写一个REST服务器,它可以使用这个razzle进行热重载。

其他回答

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

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

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

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

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

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

在谷歌搜索中,第一个出现的是Nodemon,它似乎奏效了:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

在Node.js 19中,你可以使用——watch选项监视文件更改。文件更改后,进程将自动重新启动,反映新的更改。

node --watch server.js

您可以使用自动重新加载来重新加载模块,而无需关闭服务器。

安装

npm install auto-reload

例子

data.json

{ "name" : "Alan" }

. js

var fs = require('fs');
var reload = require('auto-reload');
var data = reload('./data', 3000); // reload every 3 secs

// print data every sec
setInterval(function() {
    console.log(data);
}, 1000);

// update data.json every 3 secs
setInterval(function() {
    var data = '{ "name":"' + Math.random() + '" }';
    fs.writeFile('./data.json', data);
}, 3000);

结果:

{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }

这个问题的另一个解决方案是永远使用

Forever的另一个有用功能是它可以选择重新启动 当任何源文件发生更改时,您的应用程序。这让你自由 从每次添加功能或修复错误时都必须手动重新启动 bug。要在此模式下启动Forever,使用-w标志:

forever -w start server.js