比较好的文章: http://www.jianshu.com/p/d67b...
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
//AMD 规范
/**
* define(id?, dependencies?, factory); id 和 dependencies 是可选的。
*
* define(['dep1', 'dep2'], function(dep1, dep2){
* return funciton() {};
* });
*/
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})
define(function () {
var exports = {};
exprots.sayHello = function () {
alert('Hello from module:' + module.id);
};
return exports;
});
//CMD 规范
/**
* define(function(require, exports, module){
* return funciton() {};
* });
* require、exprots 和module 通过形参传递给模块,在需要依赖模块是,随时调用require() 引入即可
*/
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b')
// 依赖可以就近书写 b.doSomething()
// ...
})
//commonJs 规范
/**
* 在模块中,通过require()方法来引入外部的模块。
* 上下文提供了exports 对象用于到处当前模块的方法和变量, 并且它是唯一导出的出口。
* 在模块中还存在一个module对象,它代表模块自身,而exports是module的属性。
* math.js
*/
exports.math = function () {
var sum = 0, i = 0, args = arguments, len = args.length;
while(i < 1) {
sum += args[i];
}
return sum;
};
//另外一个文件
var math = require('math');
exports.increment = function (val) {
return math.add(val, 1);
};
//兼容Node、AMD、CMD以及浏览器常见的浏览器环境
(function(name, definition){
//检测上下文环境是否为AMD 或 CMD
var hasDefine = typeof define === 'function',
//检查上下文环境是否为Node
hasExports = typeof module !== 'undefined' && module.exports;
if(hasDefine) {
//AMD或CMD环境
define(definition);
} else if (hasExports) {
//定义为普通Node 模块
module.exports == definition();
} else {
//将模块的执行结果挂在window变量中,在浏览器中this指向window对象
this[name] = definition();
}
}('hello', function () {
var hello = function () {
};
return hello;
}));
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。