如何从Dojo层加载AMD模块

时间:2013-10-19 02:12:09

标签: javascript build dojo layer amd

在我们的应用程序中,我们使用dojo作为一些小部件,包括几个自定义小部件,并将AMD格式用于多个模块。

e.g。

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

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

   return module;
});

目前工作正常,因为每个模块都是单独请求的。但是,我们已经确定使用dojo层将其折叠为一个请求将是一个很好的优化。

问题是,我们先加载图层,然后尝试要求图层中定义的模块,但是dojo加载器找不到模块。在构建配置文件中是否需要特别需要的东西才能使其工作?一些帮助或文档链接将不胜感激。

1 个答案:

答案 0 :(得分: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. 除了构建配置文件中boot: true的一个图层(dojo/dojo)之外,图层必须以与任何其他模块相同的方式加载 - 即使用requiredefine,为图层模块添加<script>标记。