什么是AMD,CMD,CommonJS-
CommibJS
CommonJS规范是诞生比较早的。NodeJS就采用了CommonJS1
2var clock = require('clock');
clock.start();
AMD
AMD,即 (Asynchronous Module Definition),这种规范是异步的加载模块,requireJs应用了这一规范。先定义所有依赖,然后在加载完成后的回调函数中执行:
1 | require(['clock'],function(clock){ |
AMD虽然实现了异步加载,但是开始就把所有依赖写出来是不符合书写的逻辑顺序的
CMD
CMD (Common Module Definition), 是seajs推崇的规范,CMD则是依赖就近,用的时候再require。它写起来是这样的:
1 | define(function(require, exports, module) { |
javascript模块化编程
1.原始方法封装函数1
2
3
4
5
6function m1(){
console.log('原始写m1')
}
function m2(){
console.log('原始写m2')
}
优点:哪里使用直接调用
缺点:污染”了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
2.对象写法1
2
3
4
5
6
7
8
9
10 var module1 = new Object({
_count : 0,
m1 : function (){
console.log('封装对象方法 module1.m1()')
},
m2 : function (){
//...
}
});
module1.m1()
缺点:会暴露所有模块成员,内部状态可以被外部改写
3.立即执行函数写法1
2
3
4
5
6
7
8
9
10
11
12
13 var module1 = (function(){
var _count = 0;
var m1 = function(){
console.log('立即执行函数写法')
};
var m2 = function(){
};
return {
m1 : m1,
m2 : m2
};
})();
module1.m1()
缺点:外部代码无法读取内部的_count变量
4.放大模式1
2
3
4
5
6
7 var module2 = (function (mod){
mod.m3 = function () {
console.log('新添加的方法m3')
};
return mod;
})(module1); //导入module1对象
module2.m3() //输出 '新添加的方法m3'
5.宽放大模式
在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用”宽放大模式”。
1 | var module1 = ( function (mod){ |
与”放大模式”相比,"宽放大模式"就是”立即执行函数”的参数可以是空对象。
- 输入全局变量
使用频率较高
1 | var module1 = (function ($, YAHOO) { |
commonJs适用于服务器端
AMD适用于浏览器端