比较好的文章: 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;
}));

candice
435 声望25 粉丝

看原始的资料,读系统的书籍,研究官方或是优秀项目的源码。加油!


引用和评论

0 条评论