在运行时重新加载模块

时间:2014-10-29 15:08:00

标签: javascript node.js

我正在考虑使用Socket.IO将一个高度需求(大量流量)基于套接字的架构从.NET移植到Node.JS。

我目前的系统是用.NET开发的,并使用一些在运行时加载的脚本语言,因此如果需要,我可以通过向服务器发出重新加载命令来进行热修复,而无需重新启动不同的服务器/调度程序进程。

我最初以这种方式构建它,就像我说的那样,如果需要我可以做热修复,并且还可以通过透明修复保持系统。

我是Node.JS的新手,但这是我想要完成的事情:

  • 在运行时按需加载javascript文件,将它们存储在某处的变量中并调用脚本函数。

什么是最好的解决方案?如何从运行时加载的javascript文件中调用特定函数作为字符串?我可以加载一个javascript文件,将其存储在变量中并以正常方式调用函数,就像需要一样吗?

谢谢!

2 个答案:

答案 0 :(得分:10)

如果我理解你的问题。您可以查看vm模块。

或者,如果您希望能够重新加载required个文件,则必须清除缓存并重新加载文件,this package可以执行此操作。检查代码,你会明白的。

  

模块在第一次加载后进行缓存。这意味着   (除此之外)每次调用require('foo')都会得到   返回完全相同的对象,如果它将解析为相同   文件。

     

多次调用require('foo')可能不会导致模块代码   多次执行。这是一个重要的特征。用它,   可以返回“部分完成”的对象,从而允许传递   即使它们会导致循环,也要加载依赖项。

可以找到更多信息here

  1. 删除缓存的模块:

    delete require.cache[require.resolve('./mymodule.js')]
    
  2. 再次要求它。 (您可以在函数中调用require

  3. <强>更新

    我认识的人正在实施类似的方法。您可以找到代码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
});