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


当前回答

我的应用结构:

NodeAPP (folder)
   |-- app (folder)
      |-- all other file is here
   |-- node_modules (folder)
   |-- package.json
   |-- server.js (my server file)

首先使用以下命令安装reload:

npm install [-g] [--save-dev] reload

然后修改package.json:

"scripts": {
    "start": "nodemon -e css,ejs,js,json --watch app"
}

现在你必须在你的服务器文件中使用reload:

var express = require('express');
var reload = require('reload');
var app = express();

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    console.log( 'server is running on port ' + app.get('port'));
});

reload(server, app);

对于最后一次更改,在您的响应结束时发送以下脚本:

<script src="/reload/reload.js"></script>

现在用下面的代码启动你的应用程序:

npm start

其他回答

最近(2009年)在node.js邮件列表中有一个关于这个主题的帖子。简短的回答是否定的,目前还不可能自动重载所需的文件,但一些人已经开发了添加此功能的补丁。

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

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

forever -w start server.js

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

node --watch index.js

没有一个恶魔是伟大的。我只是为调试和监视选项添加了更多参数。

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

执行命令:nodemon——watch server——inspect ./server/server.js

而:

当更改server文件夹(包括子文件夹)中的.js, .mjs, .coffee, .litcoffee和.json文件时重新启动应用程序。

——inspect开启远程调试。

./server/server.js入口。

然后添加以下配置以启动。json (VS Code)和开始调试随时。

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}

注意,最好将nodemon安装为项目的开发依赖项。所以你的团队成员不需要安装它或记住命令参数,他们只需要npm运行dev并开始黑客。

查看更多关于nodemon文档的信息:https://github.com/remy/nodemon#monitoring-multiple-directories

如果有人仍然遇到这个问题,并希望仅使用标准模块来解决它,我做了一个简单的例子:

var process = require('process');
var cp = require('child_process');
var fs = require('fs');

var server = cp.fork('server.js');
console.log('Server started');

fs.watchFile('server.js', function (event, filename) {
    server.kill();
    console.log('Server stopped');
    server = cp.fork('server.js');
    console.log('Server started');
});

process.on('SIGINT', function () {
    server.kill();
    fs.unwatchFile('server.js');
    process.exit();
});

这个例子只针对一个文件(server.js),但是可以使用一个文件数组,一个for循环来获取所有文件名,或者通过监视目录来适应多个文件:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})

这段代码是为Node.js 0.8 API制作的,它不适合一些特定的需求,但可以在一些简单的应用程序中工作。

更新: 这个函数是在我的模块simple, GitHub repo中实现的