如何在运行时发现和加载js文件?

时间:2013-01-25 23:51:10

标签: javascript node.js dynamic runtime

我正在编写一个基于node.js的服务器来管理一系列设备。基于node.js的服务器告诉连接的客户端它的能力。这些功能由单独的js文件定义,这些文件定义了通过util.inherits()使用继承的对象。

我遇到的问题是,现在,我必须为新能力定义一个新的js,然后将主要的js程序更新为require新的js,更改代码以发布该能力可用,如果客户要求,则使用新功能。

我想使主代码更通用,因为它可以

  1. 检测新能力,
  2. 自动包含它们,
  3. 通知客户,
  4. 利用代码。
  5. 我可以通过支持树浏览的各种npm模块进行检测,我可以为所有功能指定一个子目录,并发现那里有哪些文件。我认为我可以使用require作为第2步(尽管不是100%确定),但是我不知道如何执行第3步和第4步,或者使用第2步和步骤3和4中的结果。

    我会重视有关如何解决此问题的任何反馈。


    澄清我的问题。现在我的逻辑如下:

    var logicA = requires('./capabilities/a.js');
    var logicB = requires('./capabilities/b.js');
    var logicC = requires('./capabilities/c.js');
    
    var Comms.CAPABILITY_A = 'a';
    var Comms.CAPABILITY_B = 'b';
    var Comms.CAPABILITY_C = 'c';
    
    var Comms.MSG_CAPABILITY = 0;
    var Comms.MSG_DO_LOGIC = 1;
    
    function onMessageReceived(comms, msgId, body) {
        switch (msgId) {
            case(MSG_DO_LOGIC):
               doLogic(body);
               break;
            ...
        }
    }
    
    function doLogic(flag) {
       switch(flag) {
          case(Comms.CAPABILITY_A):
              logicA.doLogic();
              break;
    
          case(Comms.CAPABILITY_B):
              logicB.doLogic();
              break;
    
          case(Comms.CAPABILITY_C):
              logicC.doLogic();
              break;
       }
    }
    

    在客户端,我有硬编码逻辑,假设可用的东西。我可以通过让服务器向客户端发送一组功能来删除它,然后客户端可以选择数组中的一个元素并将其作为执行逻辑的请求传回。这不是我的问题。

    我的问题是理解如何使主机程序动态加载所有逻辑,然后评估在动态加载的逻辑上执行哪个逻辑。

    我应该声明,当我说动态时,我的意思是可用的代码是在运行时确定的。但是,只有在首次启动服务器时才会执行评估。

1 个答案:

答案 0 :(得分:0)

我通过创建一个保存所有协议的register.js解决了这个问题。每次我创建一个新协议时,我都会将它添加到寄存器中。

通过寄存器,我可以获得所有注册协议的数组。我可以将它们传递回客户端,客户端可以选择协议,我可以通过寄存器类请求协议实例。

虽然存在一些硬编码,但它仅限于与协议位于同一目录中的寄存器类。

所以在寄存器中我有以下功能:

getList()
getText()
validateProtocolId()
getProtocol()

我使用getList()返回已注册的协议ID数组。我使用getText()来提供可读的受支持协议列表。我使用validateProtocolId()验证从客户端返回的id以确认id表示已注册的协议,然后使用getProtocol()生成注册协议的实例。

从本质上讲,getProtocol()只会根据需要执行require('./<protocol file>.js')

它不像自动发现那么优雅,但它允许在不强制自定义文件等的情况下对注册的内容进行更严格的控制。