1

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

例如

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

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

   return module;
});

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

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

4

1 回答 1

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) 中包含的一个层之外,层必须以与任何其他模块相同的方式加载 - 即使用requireor define而不是通过包含<script>层模块的标签。
于 2013-10-19T06:20:36.957 回答