我想知道有人知道Requirejs的内部,为什么它可以异步加载js?我知道Javascript没有线程,requirejs如何完成异步?
答案 0 :(得分:6)
每个模块都包含在define
调用中,该调用定义了模块依赖性。有了它,RequireJS制作了一种树,可以将每个模块从没有依赖关系的模块排序到具有最多依赖关系的模块。
只有一个依赖关系的模块可能是依赖于所有东西的模块,如果它的依赖关系依赖于另一个模块,这取决于2-3个其他模块,然后就像那样继续。
define(['some/dep'], function(someDep){ /* module code */ });
按此顺序,RequireJS使用模块文件的url创建一个<script>
标记,并在<head>
的末尾插入该脚本标记。 浏览器加载JavaScript文件,按照HTML中存在的顺序运行它们。
然后,当为模块定义每个依赖项运行时,调用该模块的函数,并将每个依赖项(先前定义的)注入模块工厂函数,并存储其结果。
它是异步的,但不一定是并行的。加载脚本可以是并行的,因为浏览器(至少是chrome)可以与服务器建立多个连接以同时获取更多文件,但这与JS无关。
JavaScript的异步性质来自事件循环。
每个异步回调都放在一个事件队列中,当同步调用堆栈完全执行完毕后,将调用队列中的下一个事件回调。
当您看到它时更容易掌握,您可以使用Chrome的开发工具时间轴标签。