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

标签 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等待初始化。初始化将在加载事件处理程序中完成,因为在事件处理程序函数中,节点引用是可访问的,并且模块名称记录在节点属性上(如:<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/

相关文章:

php - 正则表达式转换器(从 PHP 到 JavaScript)

javascript - 获取数组中的差异

javascript - Webpack - 复制图像文件

javascript - 为什么我的 Handlebars 没有编译方法?

javascript - 为什么使用 requirejs 定义模块时需要返回?

javascript - 一个在javascript中找到数组最大值的函数?

javascript - 日期循环增量和增长变量 ( mootools )

javascript - Knockout Nested Bindings——在DOM中可见但不显示

javascript - 无法使用 requirejs 加载我的代码所需的 js 文件

javascript - RequireJS 和 Dojo 冲突