所以,我一直在使用require.js了一段时间了,但我意识到,其实我不知道它是如何工作的引擎盖下。 它说,它是一个AMD装载机。
我也明白,CommonJS的是同步的,这意味着,虽然它被装载的其他代码它阻止执行。 在另一方面,AMD是异步的。 这是我感到困惑。
当我定义了一个模块,它具有为了执行回调加载,B,C。 这里如何异步工作方式?
- 是不是同步的,当它具有先装入这三个依赖呢?
- 这是否意味着AMD加载,B,C异步然后检查是否这些文件被加载(不关心的顺序),然后执行回调?
define("name",["a","b","c"], function(a,b,c){
});
如你所知,“AMD”(异步模块定义(AMD))是一个特定的API。 有许多AMD兼容“装载机”,包括RequireJS,curl.js和Dojo(等等)。
正如JQuery和Dojo等框架可以让您对原始的Javascript的API; 使用AMD的程序:
1)要求您的.js库的AMD兼容,
2)需要特定的编程的“规则”和“约定”,和
3)最终位于 “上面” 的Javascript中,它运行在您的 “Javascript引擎”(无论是IE,Chrome浏览器,Firefox的 - 不管)。
这里有一对夫妇,我发现有用的链接:
https://www.ibm.com/developerworks/mydeveloperworks/blogs/94e7fded-7162-445e-8ceb-97a2140866a9/entry/loading_jquery_with_dojo_1_7_amd_loader2?lang=en
http://dojotoolkit.org/reference-guide/1.8/loader/amd.html
http://blog.millermedeiros.com/amd-is-better-for-the-web-than-commonjs-modules/
http://addyosmani.com/writing-modular-js/
PS:要回答你的问题立即,后者链接有一个关于“需要()”和“dynamically_loaded依赖”位的讨论。
自从我写了一个AMD装载机,我会尝试直接回答的问题:
是不是同步的,当它具有先装入这三个依赖呢?
JAVASCRIPT,顾名思义,是单线程的。 这意味着,你在上面运行什么总是依次运行。 你可以在浏览器中做的唯一的事情就是包括使用的脚本标签,这将使得在脚本加载未定义(异步)命令的“异步”参数的脚本。 一旦脚本执行它会在该时间点执行的唯一一个。
这是否意味着AMD加载,B,C异步然后检查是否这些文件被加载(不关心的顺序),然后执行回调?
正确。 AMD-定义()允许您加载所有脚本在您希望的顺序(即最终你让浏览器的霸气和在它认为合适的任何时候它认为合适的任何顺序加载它们)。
然后任何时间定义()被调用时,AMD-loader会检查是否依赖这个当前列表定义已经得到满足。 如果是,它会立即调用当前的回调,之后,它会检查是否有以前注册的定义,回调可太调用(因为他们所有的依赖关系都得到满足)。 如果此回调的依赖关系尚未全部满足的是,回调被添加到队列以后解决。
这最终导致了被称为正确的相关性顺序所有的回调,无论在哪个脚本已经加载/放在首位执行顺序的。