2013-10-19 91 views
1

在我们的应用程序中,我们使用dojo来处理一些小部件,包括几个定制小部件,并使用AMD格式处理多个模块。如何从Dojo层加载AMD模块

例如

define("foo.bar.module", ["dojo/_base/declare"], function(declare) { 

    var module = declare("foo.bar.module", [], { 
     // Do Stuff 
    } 

    return module; 
}); 

由于每个模块都是单独请求,所以目前工作正常。但是,我们已经确定使用dojo层将它合并为一个请求将是一个很好的优化。

问题是,我们先加载图层,然后尝试要求图层中定义的模块,但dojo加载程序无法找到模块。在构建配置文件中是否有特别需要的东西来完成这项工作?一些帮助,或链接到文档将不胜感激。

回答

3

模块ID是路径,而不是对象标识符。 define的第一个参数是错误的;如果它存在,它应该是foo/bar/module。但是,您不应该将第一个字符串参数提供给define,因为这会破坏可移植性。除非有意尝试在全局范围内创建构造函数,否则您也不应将第一个字符串参数提供给declare

总之,你的模块定义应该是:

define(["dojo/_base/declare"], function(declare) { 

    var module = declare([], { 
     // Do Stuff 
    } 

    return module; 
}); 

最后,还有一些需要注意内置层中的两个重要的事情:

  1. 图层刚刚建好还包含其他模块的模块。它们只能在构建之前使用应用程序中已存在的模块创建。例如,如果您有一个用于加载整个应用程序的app/main模块,那么这将是一个很好的图层模块。为新层创建一个新的app/layerA模块将是错误的。
  2. 加载器无法知道图层包含哪些模块,直到图层加载完成。如果使用模块“a”“b”和“c”构建图层“a”,则require([ "a", "b", "c" ]),所有三个模块将作为单独的请求加载,因为加载程序无法知道“a”包含“b”和“c ”。在这种情况下,您必须首先加载“a”,然后加载“b”和“c”,此时它们将只从图层加载而不是单独加载。
  3. 随着一个层,在您的建造轮廓(dojo/dojo)具有boot: true外,层必须通过包括用于一个<script>标签被加载的方式与任何其他模块,也就是说,使用requiredefine相同图层模块。
+0

好吧,够公平的。但是,即使发生这些变化,问题仍未解决。加载器在包含在图层中时仍然找不到该模块。它似乎试图提出请求,并获得了一个404 – ekj

+0

我添加了更多信息。如果更多信息不足以让您获得答案,那是因为您尚未提供HTML引导程序,Dojo配置或任何其他有关您的应用程序的信息,或者您如何尝试加载图层模块。 –

+0

第3点可能是问题所在。该图层正在加载一个脚本标记。你知道一些解释如何正确加载图层的文档吗? – ekj