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


当前回答

你可以通过浏览器刷新来实现。您的节点应用程序自动重启,您的结果页面在浏览器也自动刷新。缺点是你必须把js片段生成的页面。下面是工作示例的回购。

const http = require('http');
const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/html; charset=UTF-8');
    res.write('Simple refresh!');
    res.write(`<script src=${process.env.BROWSER_REFRESH_URL}></script>`);
    res.end();
})

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);

    if (process.send) {
        process.send({ event: 'online', url: `http://${hostname}:${port}/` })
    }

});

其他回答

我的应用结构:

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

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

delete require.cache['/home/shimin/test2.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()函数挂钩,只监视实际需要的文件。