在运行时重新加载模块

Reload module at runtime

本文关键字:加载 模块 运行时 新加载      更新时间:2023-09-26

我正在考虑使用Socket.IO.将一个要求很高(流量很大)的基于套接字的体系结构从.NET移植到Node.JS

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

我最初是这样构建的,所以,正如我所说,如果需要,我可以进行热修复,并通过透明修复保持系统可用。

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

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

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

谢谢!

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

或者,如果你想重新加载required文件,你必须清除缓存并重新加载文件,这是这个包可以做到的。检查代码,你就会明白了。

模块在第一次加载后被缓存。这意味着(除其他外)每个需要('o')的电话都会得到完全相同的对象返回,如果它将解析为文件

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

更多信息可以在这里找到。

  1. 删除缓存模块:

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

更新

我认识的某个人正在实施类似的方法。你可以在这里找到代码。

您可以查看我的模块无效模块,该模块允许您使所需模块无效。然后,模块将在进一步访问时自动重新加载。

示例:

模块./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
});