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


当前回答

这是一篇关于Node热重载的博文。它提供了一个github节点分支,您可以使用它来替换节点的安装,以启用热重新加载。

来自博客:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

现在,每当你修改myRequestHandler.js时,上面的代码将不再生效,并用新代码重新放置本地的re-questHandler。任何已存在的请求将继续使用旧代码,而任何新的请求将使用新代码。所有这些都不需要关闭服务器,不需要反弹任何请求,不需要提前终止任何请求,甚至不需要依赖内置的负载均衡器。

其他回答

这里有一个在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”。

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

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

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

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

你可以通过浏览器刷新来实现。您的节点应用程序自动重启,您的结果页面在浏览器也自动刷新。缺点是你必须把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}/` })
    }

});

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

npm install supervisor

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