commonJS, AMD, CMD区别表格对比
1、对比总览
名称 | 同步/异步 | 规范文件 | 应用场景 | 加载速度 | 描述 |
---|---|---|---|---|---|
commonJS | 同步 | CommonJS | NODEJS | 平均加载速度最慢 | 最早版本的js模块化编程规范,同步下载所有依赖后才能继续向下执行 |
AMD | 异步 | requireJS | 依赖前置 | 平均加载速度最快 | CommonJS的异步js加载模块解决方案,头部加载所有所需依赖 |
CMD | 异步 | seaJS | 就近加载 | 平均加载速度适中 | CommonJS的异步js加载模块解决方案,使用依赖前就近加载所需依赖 |
2、解决问题:
以上三种规范都是在解决以下问题:
- 模块化分装,避免污染全局变量
- 隐藏实现细节,避免从模块外部修改没有暴漏出来的变量、函数
3、commonJS
- 一个单独的文件就是一个模块
- 模块出口唯一 module.exports
- 加载模块使用require(.js的扩展名可省略)
加载方式:
require是同步的。模块系统需要同步读取模块文件内容,并编译执行以得到模块接口。
在js文件加载中,同步加载会使得页面加载效率很低,于是有了后来的cmd与amd规范。
4、AMD(Asynchronous Module Definition)
意为异步模块定义。对应函数库为大名鼎鼎的RequireJS
语法:
// 定义模块 myModule.js
define(['dependency', function() {
var name = 'Michael';
function printName() {
console.log(name);
}
return {
printName:printName
};
}];
// 加载模块
require(['myModule'], function(my) {
my.printName();
});
- define(id, dependencies, factory);
- id用来定义模块的标识。可选
- dependencies 当前模块依赖的模块名称。数组
- factory模块初始化时执行的函数或对象
- require([dependencies], function(){});
- 引用的模块。数组
- 当加载的函数都加载成功后执行的回调函数。
5、CMD(common module definition)
同为异步模块,只在模块定义方式和模块加载时机略有不同。
推崇理念
- 一个文件一个模块,经常用文件名作为模块id
- 推崇依赖就近,一般不在definie的参数中写依赖,在factory中写
// 定义模块 myModule.js
define(function(require, exports, module) {
var $ = require('jquery.js')
$('div').addClass('active');
}
// 加载模块
seajs.use(['myModule.js'], function(my) {
});
6、AMD与CMD区别
注:加载模块都是异步的。
在模块定义时对依赖的处理不同
- AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
- CMD推崇就近依赖,只有在用到某个模块的时候再去require