手动包括在网页上的脚本标签中的每个层。
<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允许您编写可在任一环境(使用内置文件或单个文件)中运行而无需进行修改的代码。
我必须错过一些东西。如果我需要预先加载我的脚本,AMD有什么意义?我的页面有两种模式(表单或图表),我的假设是,当我需要dijit模块时,dojo会加载dijit.js。 – Christophe
增强我的答案,以解决您的问题 –
谢谢格雷格,这是非常有益的。如果我理解正确,这意味着为了进一步优化,我需要一个额外的层,然后才会加载我需要的特定模式的js包。此外,建议将单个文件放在服务器上作为安全网是一个很好的接触。 – Christophe