2014-10-29 133 views
3

我正在考虑使用Socket.IO将一个高度需求(大量流量)基于套接字的体系结构从.NET移植到Node.JS。在运行时重新加载模块

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

我原来是这样构建的,就像我说的那样,如果需要,我可以做修补程序,并且还可以通过透明修复来保持系统可用。

我是新来的node.js,但是这是我想要完成的任务:

  • 加载JavaScript文件在运行时的需求,将它们存储在某个变量和调用脚本函数。

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

谢谢!

+0

对不起 - 我不知道我理解的问题 - 什么是你想做?你在问自己的自定义脚本如何使用'require'?因为[它就像你想的](http://stackoverflow.com/questions/4481058/load-and-execute-external-js-file-in-node-js-with-access-to-local-variables) – yuvi 2014-10-29 15:21:59

+0

你问你如何重新加载导入的脚本到你的主? – majidarif 2014-10-29 15:23:25

+0

实际上,我想在运行时加载外部JavaScript文件,能够修改这些文件及其功能并重新加载它们,而不必杀死并重新启动Node.JS进程。 – SlashJ 2014-10-29 15:25:22

回答

5

如果我正确理解你的问题。你可以检查vm模块了。

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

模块是他们第一次加载后缓存。这意味着 (其中包括)每次调用require('foo')将返回完全相同的对象 (如果它将解析为相同的 文件)。

多次调用要求(“富”)可能不会导致模块代码是 执行多次。这是一个重要的功能。通过它,可以返回 “部分完成”的对象,从而允许即使在它们会导致循环时也加载依附关系。

更多相关信息,请登录here

  1. 删除缓存模块:

    delete require.cache[require.resolve('./mymodule.js')] 
    
  2. 再次需要它。 (也许require函数里面,你可以调用)

更新

我认识正在实施类似的方法。你可以找到代码here

+0

正是我需要的,谢谢! – SlashJ 2014-10-29 15:35:52

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 
}); 
+0

请不要在多个问题上发布相同的答案。发布一个很好的答案,然后投票/标记以重复关闭其他问题。如果问题不是重复的,*定制你对问题的答案。* – 2017-03-02 14:51:16

+0

好的,现在我的答案更适合于这个问题 – 2017-03-02 15:25:03