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


当前回答

用这个:

function reload_config(file) {
  if (!(this instanceof reload_config))
    return new reload_config(file);
  var self = this;

  self.path = path.resolve(file);

  fs.watchFile(file, function(curr, prev) {
    delete require.cache[self.path];
    _.extend(self, require(file));
  });

  _.extend(self, require(file));
}

你现在要做的就是:

var config = reload_config("./config");

配置将自动被重新加载:)

其他回答

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

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

我最近提出了这个问题,因为通常的怀疑对象没有使用链接包。如果你像我一样,在开发过程中利用npm link来有效地处理一个由许多包组成的项目,那么在依赖关系中发生的更改也会触发重载,这一点很重要。

在尝试node-mon和pm2之后,即使按照指示额外监视node_modules文件夹,他们仍然没有发现变化。虽然这里的答案中有一些自定义解决方案,但对于这样的问题,单独的包更干净。我今天遇到了node-dev,它工作得很完美,没有任何选项或配置。

自述:

与supervisor或nodemon等工具相反,它不扫描文件系统以查找要监视的文件。相反,它与Node的require()函数挂钩,只监视实际需要的文件。

长期以来,Nodemon一直是重新启动服务器进行文件更改的首选。现在在Node.js 19中,他们引入了一个——watch标志,它做同样的[实验]。文档

node --watch index.js

您可以通过Node-Supervisor进行安装

npm install supervisor

参见http://github.com/isaacs/node-supervisor

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

node --watch server.js