关于CMD与AMD

平时工作中处理模块化的方式主要有两种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//1.封闭空间,也叫匿名函数自执行或者IIFE
(function(){
var gf = 'ada wong';
})();
alert(gf);

//2.类似jquery方式,全局导入
var gf = {};
(function(myGirl){
myGirl.name = 'ada wong';
var kiss = function(){
alert('kiss me');
};

myGirl.getName = function(){
return myGirl.name;
};
return myGirl;
})(gf);

alert(gf.getName());
alert(gf.kiss());//只有自己可以调用的kiss方法

以上模块化的思想较为常用。但是:
1.依然存在全局变量污染,就是依然可能重名,开发的人多了 都var gf = 一点都不稀奇。
2.虽然模块化了,但是没有解决各个模块之间依赖问题。

那CMD和AMD又是啥?
不解释定义,上代码,简单的说去玩玩nodejs,里面代码的风格都特么是CMD.不举例子了,这个在nodejs或者seajs都有所体现。
下面是他们的一些特点:
CMD 是同步的,因为它非常适合服务器端,是同步的,因为硬盘速度嗖嗖的,啥叫同步?
一件事没做完后面的事儿做不了这就是同步。

AMD是啥 RequireJS就是一个AMD的模块化工具。AMD这里说的不是CPU而是异步的意思。

两者区别 ,服务器端速度嗖嗖的同步没问题,浏览器端网络状况可能很差所以用异步,个人喜欢同步。
其实还有UMD这种概念。直接上代码,jQuery 支持的UMD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node, CommonJS-like
module.exports = factory(require('jquery'));
} else {
// Browser globals (root is window)
root.returnExports = factory(root.jQuery);
}
}(this, function ($) {
// methods
function myFunc(){};

// exposed public method
return myFunc;
}));