requirejs如何确保为匿名模块正确设置模块名称?

时间:2013-03-08 08:05:41

标签: javascript requirejs

在requirejs中,您可以定义一个模块而不必按字面意思设置它,例如:

//in a.js
define([/*deplist*/],function(){
    /*do something*/
});

//in b.js
define([/*deplist*/],function(){
    /*do something*/
});

requirejs将根据文件名(“a”和“b”)设置模块名称。 Requirejs添加您的应用程序所需的所有<script>标记,它们不会按顺序加载(如网络时间轴所示)。

js file loading timeline

当一个名为define的模块定义自己时,它不知道它的模块名称,然后它将自己置于defQueue等待初始化。初始化将在load事件处理程序中完成,因为在事件处理程序函数中,可以访问节点引用,并且模块名称在节点属性上记录(如下所示:<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="./a.js"></script>)。

问题在于,我们无法确保模块调用define的顺序与模块的节点load事件触发相同。那么模块名称如何正确映射到模块工厂呢?

1 个答案:

答案 0 :(得分:1)

事实证明,js评估及其引用节点“加载”事件触发顺序是巧合的。

加载模块js文件后,将评估其中的内容(不确定何时,但将按照加载的js文件的顺序进行评估),然后requirejs将工厂和依赖项列表推送到FIFO队列中。浏览器将按照加载的js文件的相同顺序触发节点加载事件,并且requirejs链接模块id并将其出厂在“load”事件处理程序中。

例如,如果在b.js之前加载a.js,那么a.js的内容将不迟于b.js进行评估,并且a.js的“load”事件处理程序将在不晚于b调用.js文件的。然后可以确定模块的id映射到它们的工厂和依赖列表。