在 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
相同事件触发。那么模块名如何正确映射到模块工厂呢?
最佳答案
原来js求值和引用节点“load”事件的触发顺序是巧合。
模块js文件加载后,会对其里面的内容进行求值(具体时间不确定,但会按照js文件加载的先后顺序进行求值),然后requirejs会将工厂和依赖列表压入一个先进先出的队列中。浏览器会按照 js 文件加载的相同顺序触发节点加载事件,并且 requirejs 在“加载”事件处理程序中链接模块 id 和它的工厂。
例如,如果 a.js 在 b.js 之前加载,那么 a.js 的内容将不晚于 b.js 的内容被评估,并且 a.js 的“加载”事件处理程序将不迟于 b 被调用.js的。然后可以确定模块的 id 映射到它们的工厂和依赖列表。
关于javascript - requirejs 如何确保为匿名模块正确设置模块名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15289364/