代码在错误的地方寻找模块

时间:2012-12-10 18:16:22

标签: module dojo amd

我使用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

1 个答案:

答案 0 :(得分: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找到定义模块的代码。它调用此define函数,结果是传递给回调的对象。 dijit/form/TextBox的后续要求也将使用此对象,如上所述。

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

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

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