1

我问这个是因为我现在没有工具或时间来测试这个,但这个想法让我很困扰。当我有时间玩它时,我会自己回答这个问题。

在 node.js 中,require() 是如何工作的?它是否将所需的功能保留在内存中?还是它重新读取文件?

示例:

启动器.js

var cluster = require('cluster');

if (cluster.isMaster) {
    cluster.fork();
    cluster.on('exit', function () {
        cluster.fork();
    }
}
if (cluster.isWorker) {
    var self = require('self_modifying.js');
    self.start()
}

只要 self_modifying.js 有一个 start() 函数,它是 'main' 方法,它就可以通过修改它自己的源文件和 process.exit(0) 来自我更新,然后用它重新启动新代码?

4

2 回答 2

3

回答:

在 node.js 中,require() 是如何工作的?它是否将所需的功能保留在内存中?还是它重新读取文件?

在 node.js 中,当执行 require 时,它​​将缓存正在加载的模块,因此每个进一步的 require 调用都会从内存中加载它,而不是从磁盘中加载。请参阅:http ://nodejs.org/api/modules.html#modules_caching

于 2013-11-29T16:19:25.877 回答
1

正如@Tom Grant 所指出的,模块被缓存。所以你需要在重新开始之前尊重你的应用程序,就像解释这里

这项工作,但需要 self_modifying.js 导出函数启动

var cluster = require('cluster');

if (cluster.isMaster) {
    cluster.fork();
    cluster.on('exit', function () {
        delete require.cache[require.resolve('/full/path/to/self_modifying.js')];
        cluster.fork();
    }
}
if (cluster.isWorker) {
    var self = require('self_modifying.js');
    self.start()
}
于 2013-11-29T16:52:48.520 回答