【问题标题】:How to load an AMD Module from a Dojo Layer如何从 Dojo 层加载 AMD 模块
【发布时间】:2013-10-28 00:02:02
【问题描述】:

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

例如

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

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

   return module;
});

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

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

【问题讨论】:

    标签: javascript build dojo layer amd


    【解决方案1】:

    模块 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>标签。

    【讨论】:

    • 好的,很公平。但是,即使进行了这些更改,问题也没有得到解决。加载器在包含在层中时仍然找不到模块。它似乎试图发出请求并获得 404
    • 我添加了更多信息。如果更多信息不足以让您得到答案,那是因为您没有提供 HTML 引导程序、Dojo 配置或有关您的应用程序或您尝试加载层模块的方式的任何其他信息。
    • 第 3 点可能是问题所在。该图层正在加载一个脚本标签。你知道一些解释如何正确加载图层的文档吗?
    • 加载层的方式与加载任何其他 AMD 模块的方式相同,这就是为什么它们只能从已经存在的模块中创建。
    • 这么好的答案。至少对我而言,这些说明在 dojo 文档中并不明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多