【问题标题】:Reload module at runtime在运行时重新加载模块
【发布时间】:2014-10-29 15:08:00
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 对不起 - 我不确定我是否理解这个问题 - 你想做什么?您是否在问如何将require 与您自己的自定义脚本一起使用?因为it's just like you think
  • 您是在问如何将导入的脚本重新加载到您的主目录?
  • 实际上,我想在运行时加载外部 javascript 文件,能够修改这些文件及其功能并重新加载它们,而无需终止并重新启动 Node.JS 进程。

标签: javascript node.js


【解决方案1】:

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

或者如果您希望能够重新加载required 文件,则必须清除缓存并重新加载文件,this package 可以做到这一点。检查代码,你会明白的。

模块在第一次加载后被缓存。这表示 (除其他外)每次调用 require('foo') 都会得到 返回完全相同的对象,如果它会解析为相同的 文件。

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

更多信息可以在here找到。

  1. 删除缓存的模块:

    delete require.cache[require.resolve('./mymodule.js')]
    
  2. 再次需要它。 (可能是一个 require 在你可以调用的函数中)

更新

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

【讨论】:

    【解决方案2】:

    您可以查看我的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
    });
    

    【讨论】:

    • 请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。
    猜你喜欢
    • 2017-04-18
    • 2020-05-11
    • 2010-10-19
    • 1970-01-01
    • 2018-11-05
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多