AMD:全称(Asynchronous Module Definition),异步模块加载
CMD:全称(Common Module Definition) 通用模块加载
1.模块依赖策略
提前执行,假设依赖列表里面存在依赖['a', 'b'],谁先加载完毕,谁先实例化,实例化的顺序因为异步的关系所以是乱序,当然,执行的时候,还是会保证顺序的关系。
延迟执行,a和b存在依赖列表内,a和b不会马上进行实例化,会等到a和b同时加载完毕才会实例化。
2.代码风格依赖前置
define(['dep1','dep2'],function(dep1,dep2){ //内部只能使用制定的模块
return function(){};
});
提前告诉加载器模块依赖的情况。
就近依赖
//CMD
define(function(require,exports,module){ //此处如果需要某XX模块,可以引入
var xx=require('XX');
});
通过正则分析require,来收集依赖情况
知识点2:CommonJs主要针对服务端,AMD/CMD主要针对浏览器端,所以最容易混淆的是AMD/CMD。(顺便提一下,针对服务器端和针对浏览器端有什么本质的区别呢?服务器端一般采用同步加载文件,也就是说需要某个模块,服务器端便停下来,等待它加载再执行。这里如果有其他后端语言,如java。而浏览器端要保证效率,需要采用异步加载,这就需要一个预处理,提前将所需要的模块文件并行加载好。)
知识点3 : AMD/CMD区别,虽然都是并行加载js文件,但还是有所区别,AMD是预加载,在并行加载js文件同时,还会解析执行该模块(因为还需要执行,所以在加载某个模块前,这个模块的依赖模块需要先加载完成);而CMD是懒加载,虽然会一开始就并行加载js文件,但是不会执行,而是在需要的时候才执行。
知识点4:AMD/CMD的优缺点.一个的优点就是另一个的缺点, 可以对照浏览。
AMD优点:加载快速,尤其遇到多个大文件,因为并行异步解析,所以同一时间可以解析多个文件。
AMD缺点:并行加载,异步处理,加载顺序不一定,可能会造成一些困扰,甚至为程序埋下大坑。
CMD优点:因为只有在使用的时候才会解析执行js文件,因此,每个JS文件的执行顺序在代码中是有体现的,是可控的。
CMD缺点:执行等待时间会叠加。因为每个文件执行时是同步执行(串行执行),因此时间是所有文件解析执行时间之和,尤其在文件较多较大时,这种缺点尤为明显。
知识点5:如何使用CommonJs的话,因为nodeJs就是它的实现,所以使用node就行,也不用引入其他包。AMD则是通过<script>标签引入RequireJs,具体语法还是去看官方文档或者百度一下吧。CMD则是引入SeaJs。