【问题标题】:How do requirejs ensure module name set properly for anonymous module?requirejs如何确保为匿名模块正确设置模块名称?
【发布时间】:2013-03-08 08:05:40
【问题描述】:

在 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事件触发的顺序一致。那么模块名如何正确映射到模块工厂呢?

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    原来js的求值和它的引用节点“load”事件触发顺序是巧合。

    一个模块的js文件加载后,里面的内容会被评估(不知道什么时候,但是会按照js文件加载的顺序评估),然后requirejs会将工厂和依赖列表推入FIFO队列。浏览器会按照 js 文件加载的顺序触发节点加载事件,requirejs 在“load”事件处理函数中链接模块 id 和它的工厂。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多