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


当前回答

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

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

自述:

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

其他回答

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

安装

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' }

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

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

这里有一个在Windows中使用的低技术方法。把它放在一个名为server .bat的批处理文件中:

@echo off

:serve
start /wait node.exe %*
goto :serve

现在,不是从cmd shell运行node app.js,而是运行serve app.js。

这将打开一个运行服务器的新shell窗口。批处理文件将阻塞(因为/wait),直到您关闭shell窗口,此时原始的cmd shell将询问“终止批处理作业(Y/N)?”如果您回答“N”,则服务器将重新启动。

每次要重新启动服务器时,关闭服务器窗口并在cmd shell中回答“N”。

我尝试过pm2:安装简单,使用也很方便;结果令人满意。但是,我们必须考虑我们想要哪个版本的pm2。PM 2运行时是免费版,而pm2 plus和pm2 enterprise则不是免费的。

至于Strongloop,我的安装失败或没有完成,所以我不能使用它。

一个好的、最新的替代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": "..."
}