requirejs如何加载javascript异步?

Ada*_*Lee -1 javascript requirejs

我想知道有人知道Requirejs的内部,为什么它可以异步加载js?我知道Javascript没有线程,requirejs如何完成异步?

Emi*_*ron 6

RequireJS如何运作?

每个模块都包含在一个define调用中,该调用定义了模块依赖性.有了它,RequireJS制作了一种树,可以将每个模块从没有依赖关系的模块排序到具有最多依赖关系的模块.

只有一个依赖关系的模块可能是一个依赖于所有东西的模块,如果它的依赖关系取决于另一个模块,它取决于2-3个其他模块,然后就这样继续.

define(['some/dep'], function(someDep){ /* module code */ });
Run Code Online (Sandbox Code Playgroud)

按顺序,RequireJS <script>使用模块文件的url 创建一个标记,并在该文件的末尾插入该脚本标记<head>.浏览器加载JavaScript文件并按照它们在HTML中的顺序运行它们.

然后,当为模块定义每个依赖项以运行时,将调用该模块的函数,并将每个依赖项(先前定义的)注入模块工厂函数,并存储其结果.

如果没有线程,它怎么会异步?

它是异步的,但不一定是平行的.加载脚本可以是并行的,因为浏览器(至少是chrome)可以与服务器建立多个连接,以便一次获取更多文件,但这与JS无关.

JavaScript的异步性质来自事件循环.

每个异步回调都放在一个事件队列中,当同步调用堆栈完全执行完毕后,将调用队列中的下一个事件回调.

当你看到它时更容易掌握,你可以在chrome的开发工具时间轴标签中.

chrome的开发工具中的异步调用堆栈