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

Javascript 如何在运行时发现和加载js文件?,javascript,node.js,dynamic,runtime,Javascript,Node.js,Dynamic,Runtime,我正在编写一个基于node.js的服务器,用于管理一系列设备。基于node.js的服务器告诉连接的客户端它的能力。这些能力由单独的js文件定义,这些文件通过util.inherits()定义使用继承的对象 我现在的问题是,我必须为新的能力定义一个新的js,然后将主js程序更新为require新的js,更改代码以发布该能力可用,然后在客户要求时使用新的能力 我想让主代码更通用,这样它就可以 发现新的能力 自动包含它们 通知客户,以及 使用代码 我可以通过支持树浏览的各种npm模块进行检测,我可以为

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

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

我想让主代码更通用,这样它就可以

  • 发现新的能力
  • 自动包含它们
  • 通知客户,以及
  • 使用代码
  • 我可以通过支持树浏览的各种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;
       }
    }
    
    在客户端,我有硬编码逻辑,它假定什么是可用的。我可以通过让服务器向客户机发送一个功能数组来消除这种情况,然后客户机可以选择数组中的一个元素,并将其作为执行逻辑的请求传回。这不是我的问题

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


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

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

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

    虽然有一些硬编码,但它仅限于与协议位于同一目录中的register类

    因此,在寄存器中,我具有以下功能:

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

    本质上,
    getProtocol()
    只是适当地执行
    要求('./.js')

    它不像自动发现那样优雅,但它允许对注册内容进行更严格的控制,而无需强制自定义文件等