【问题标题】:Does anyone know of a way to dynamically load a qooxdoo module?有谁知道动态加载 qooxdoo 模块的方法?
【发布时间】:2014-02-18 00:46:45
【问题描述】:

我正在使用最新的 qooxdoo SDK (3.5) 并试图找到一种动态加载模块的方法。每个模块都将实现一个“init”函数,该函数在应用程序中创建一个窗口,并且从那时起,它是自包含的。

我需要的是在事先不知道模块存在的情况下调用任意 init 函数的能力。例如,有人上传了一个自定义模块并尝试运行它——我只需要调用该模块的 init 函数(如果调用失败则报错)。

有什么想法吗?

编辑:

类似:

function loadModule(modName) {
  var mod = new qx.something.loadModule(modName);
  mod.init();
}

【问题讨论】:

  • 您想如何检测它已上传?
  • 没关系,如果不存在,我只是显示错误。
  • 我不清楚您要做什么。您想接受一个新模块然后立即动态加载它吗?或者你想要某种插件机制,人们可以上传新插件,每次你的应用程序启动时都会加载所有这些插件?还是有什么不同?
  • 这基本上是我必须编写代码来加载我拥有的每个模块的捷径。例如,如果我以正常方式执行此操作,对于每个模块,我必须有几行调用每个模块的 init 函数。我想要的是一个函数,我可以将模块名称传递给它并加载模块(没有大量的 if-else 块)。
  • 更重要的是,当有人上传模块时,您是否有一些代码被调用(最好是模块名称)?

标签: javascript dynamic qooxdoo


【解决方案1】:

我发现 Qooxdoo 必须通过 3 种方式运行动态代码。第一种方法是通过内置的零件加载器。 “部件”基本上是应用程序的一部分,当您真正需要它们时,qooxdoo 将“即时”加载它们——例如,操作很少使用的表单或对话框的类。这种方法并不是真正动态的(在我看来),因为它需要将代码包含在 Qooxdoo 提供的构建过程中。准确解释它是如何工作的超出了这个答案的范围,坦率地说,我自己还不是很熟悉。

第二种方法是通过 qx.Class.getByName() 函数调用。它是这样工作的:

qx.Class.define("Bacon", { 
  extend: qx.core.Object, 
  construct: function(foo, bar) { 
    this.foo = foo; 
    this.bar = bar; 
  } 
}); 

var klass = qx.Class.getByName("Bacon"); 
var obj = new klass("foo", "bar"); 
this.debug(obj.foo);

这个方法是在 Qooxdoo 邮件列表here 上找到的。此方法适用于构建过程中包含的代码 适用于动态引入的代码,但在我看来,它被第三种方法胜过,原因很简单,如果您要动态引入一个新类,您'无论如何都必须使用第三种方法。

我找到的最终方法实际上是通过研究Qooxdoo playground的源代码向我揭示的。 (源代码作为桌面下载的一部分提供。)

操场从编辑器中读取代码并从中创建一个匿名函数,然后执行该函数。围绕以下代码有一堆设置和拆卸操场,但为了简洁和清晰起见,我已将其删除。如果您有兴趣自己做类似的事情,我强烈建议您查看 Playground 应用程序的源代码。动态代码执行包含在从第 810 行开始的 __updatePlayground 函数中(Qooxdoo v3.5)。

var fun;
try {
  fun = qx.event.GlobalError.observeMethod(new Function(code));
} catch(ex) {
  //do something with the exception
}

try {
  fun.call();
} catch(ex) {
  //do something with the exception
}

代码很简单,使用built-in Javascript function“调用”来执行匿名函数。

【讨论】:

    【解决方案2】:

    请定义模块。

    Qooxdoo 源代码使用与 Java 相同的约定 - 每个文件一个类。你真的想单独加载类并处理依赖关系吗?如果不是,您对模块的定义是什么?

    除此之外,qooxdoo 有一个包的概念,包是类、接口和 mixin、框架、contribs 的组,包括框架本身,由生成器以优化的方式打包,以便加载之前使用的类早些时候。使用 qooxdoo 自己的打包机制只需要使用自定义参数运行构建或自定义 config.json - 所有这些都在手册中进行了详细描述。

    如果您对模块的想法是一种子应用程序,主要与大型应用程序中的所有其他内容解耦,我不确定在不显着修改生成器代码(./generate.py 调用的内容)的情况下是否可以实现或接受一些大小开销。

    我不会详细介绍修改生成器的细节 - 如果你走这条路,无论如何你都需要深入挖掘,你会学到比我了解的更多的生成器。

    在 qooxdoo 允许的范围内,您可以做的是为每个模块创建一个单独的岛应用程序,通过附加到顶部窗口的 JavaScript 构建您自己的模块间通信基础架构,并在主页内运行模块,使用一些手动添加的魔法来使各种模块表现得像选项卡窗格或 qooxdoo 窗口。除了一些笨拙的自定义、非 qooxdoo 代码之外,您必须承担的开销是所有模块都将重新加载 qooxdoo 框架代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-29
      • 2022-12-20
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多