比较好的文章: 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 或 CMDvar hasDefine = typeof define === 'function',//检查上下文环境是否为NodehasExports = 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;
}));