我正在考虑使用Socket.IO将一个高度需求(大量流量)基于套接字的架构从.NET移植到Node.JS。
我目前的系统是用.NET开发的,并使用一些在运行时加载的脚本语言,因此如果需要,我可以通过向服务器发出重新加载命令来进行热修复,而无需重新启动不同的服务器/调度程序进程。
我最初以这种方式构建它,就像我说的那样,如果需要我可以做热修复,并且还可以通过透明修复保持系统。
我是Node.JS的新手,但这是我想要完成的事情:
什么是最好的解决方案?如何从运行时加载的javascript文件中调用特定函数作为字符串?我可以加载一个javascript文件,将其存储在变量中并以正常方式调用函数,就像需要一样吗?
谢谢!
答案 0 :(得分:10)
如果我理解你的问题。您可以查看vm模块。
或者,如果您希望能够重新加载required
个文件,则必须清除缓存并重新加载文件,this package可以执行此操作。检查代码,你会明白的。
模块在第一次加载后进行缓存。这意味着 (除此之外)每次调用require('foo')都会得到 返回完全相同的对象,如果它将解析为相同 文件。
多次调用require('foo')可能不会导致模块代码 多次执行。这是一个重要的特征。用它, 可以返回“部分完成”的对象,从而允许传递 即使它们会导致循环,也要加载依赖项。
可以找到更多信息here。
删除缓存的模块:
delete require.cache[require.resolve('./mymodule.js')]
再次要求它。 (您可以在函数中调用require
)
<强>更新强>
我认识的人正在实施类似的方法。您可以找到代码here。
答案 1 :(得分:0)
您可以查看我的module-invalidate模块,该模块允许您使所需模块无效。然后,模块将在进一步访问时自动重新加载。
示例:
模块./myModule.js
module.invalidable = true;
var count = 0;
exports.count = function() {
return count++;
}
主要模块./index.js
require('module-invalidate');
var myModule = require('./myModule.js');
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
mySystem.on('hot-reload-requested', function() {
module.invalidateByPath('./myModule.js'); // or module.constructor.invalidateByExports(myModule);
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
});