2

我使用 build.dojotoolkit.org(我的第一次尝试)创建了一个具有 3 层的多层构建:dojo.js、dojox.js、dijit.js。每个 js 文件都上传到自己的文件夹中(dojo、dojox、dijit)。

当我运行代码时,我希望它在 dijit.js 中查找以获取像 dijit.form.TextBox 这样的表单模块。但相反,它会尝试加载 dijit/form/TextBox.js,当然最终会出现 404 错误。

我究竟做错了什么?

如果有帮助,文件就在这里:http: //usermanagedsolutions.com/Demos/Pages

4

1 回答 1

1

手动将每个图层包含在页面上的脚本标记中。

<script src="path/to/dojo.js" />
<script src="path/to/dojox.js" />
<script src="path/to/dijit.js" />

这将使您在构建中定义的所有模块可用。当您需要该文本框时,Dojo 将看到它有代码并且不会进行 XHR 调用。

即使您不打算使用单个文件,您也可能希望将它们放在服务器上。这样,如果有人忘记将文件添加到构建中,则产生的惩罚是 xhr 请求,而不是 javascript 错误。


回复:AMD

当您以我上面描述的方式包含层时,您并没有加载包含构建的所有模块 - 您只是使定义函数可用,而无需发出 xhr 请求。

如果您查看构建输出的 js 文件,该文件包含模块路径到函数的映射,该函数在调用时将定义模块。

所以当你写下面的代码

require(["dijit/form/TextBox"], function(TextBox){
  ...
});

AMD 将首先确定是否dijit/form/TextBox已经定义。如果是这样,它将只获取对象并执行回调。

如果模块尚未定义,则 AMD 将在其缓存中查看定义代码是否可用。当您包含脚本文件时,您将提供定义函数的缓存。AMD 找到定义模块的代码。它调用这个定义函数,结果是传递给回调的对象。后续的要求dijit/form/TextBox也将如上所述使用此对象。

如果模块尚未定义且 AMD 未在其缓存中找到定义函数,则 AMD 将向服务器发出 XHR 请求以尝试定位特定模块代码。XHR 调用的结果应该提供定义函数。AMD 将调用该函数并将结果作为对象传递给回调。同样,后续的 requiresdijit/form/TextBox也将使用此对象。

Dojo 构建提供了 1) 缩小代码和 2) 将其组合成需要从服务器请求的更少文件的能力。

AMD 允许您编写可在任一环境(使用构建文件或单个文件)中运行的代码,而无需进行修改。

于 2012-12-10T20:03:29.720 回答