2012-12-10 29 views
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

回答

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将调用该函数并将结果用作传入回调的对象。同样,后续要求为dijit/form/TextBox也将使用此对象。

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

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

+0

我必须错过一些东西。如果我需要预先加载我的脚本,AMD有什么意义?我的页面有两种模式(表单或图表),我的假设是,当我需要dijit模块时,dojo会加载dijit.js。 – Christophe

+0

增强我的答案,以解决您的问题 –

+0

谢谢格雷格,这是非常有益的。如果我理解正确,这意味着为了进一步优化,我需要一个额外的层,然后才会加载我需要的特定模式的js包。此外,建议将单个文件放在服务器上作为安全网是一个很好的接触。 – Christophe