在 requirejs 中,您可以定义一个模块而无需按字面设置它的名称,例如:
//in a.js
define([/*deplist*/],function(){
/*do something*/
});
//in b.js
define([/*deplist*/],function(){
/*do something*/
});
并且 requirejs 会根据他们的文件名(“a”和“b”)设置他们的模块名。Requirejs 添加<script>
您的应用程序需要的所有标签,它们不是按顺序加载的(正如网络时间线所说)。
当一个模块调用define
来定义自己时,它不知道它的模块名称,然后它将自己置于defQueue
等待初始化的状态。初始化将在加载事件处理程序中完成,因为在事件处理程序函数中,节点引用是可访问的,并且模块名称记录在节点属性上(如:)<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="./a.js"></script>
。
这就是问题所在,我们无法保证模块调用的顺序define
与模块的节点load
事件触发的顺序一致。那么模块名称如何正确映射到模块工厂呢?