2013-03-08 140 views
2

在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等待初始化。初始化将在加载事件处理程序中完成,因为在事件处理函数中,节点引用是可访问的,并且模块名称是节点属性上的记录(如下所示:<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="./a.js"></script>)。

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

回答

1

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

加载模块js文件后,其内容将被评估(不确定何时,但将按照加载的js文件的顺序进行评估),然后requirejs会将工厂和依赖列表推送到FIFO队列中。浏览器将按照加载的js文件的相同顺序触发节点加载事件,并且requirejs链接模块ID,并在“加载”事件处理程序中将其加入工厂。例如,如果在b.js之前加载了a.js,那么a.js的内容将不晚于b.js的评估,并且a.js的“加载”事件处理程序将不晚于b.js的。那么可以肯定的是,模块的ID映射将他们的工厂和依赖列表。