AMD与CMD规范

时间: 作者:梧桐

AMD规范

定义

Asynchronous Module Definition,异步模块加载机制。
描述了模块的定义,依赖关系以及加载机制。

API

define([module-name?], [array-of-dependencies?], [module-factory-or-object]);
module-name: 模块的标识,可选参数,省略此参数,模块的名字默认为脚本的名字。如果提供了该参数,模块名必须是“顶级”的和绝对的(不允许相对名字);
array-of-dependencies: 依赖的模块, 可选参数,忽略此参数,默认为["require", "exports", "module"],否则按照位置顺序以参数的形式传入factory;
module-factory-or-object: 模块初始化要执行的函数或对象,如果为函数,有参数列表则不扫描依赖性,否则扫描依赖性。如果是对象,此对象应该为模块的输出值。
示例
define('test', [
    'require',
    'wutil',
    'template'
],
function(require, wutil, template) {
    //代码
});

(1)require

require("module-name"),返回模块name所代表的模块
define(['require'], function (require) {
    var a = require('a');
});
define(function (require, exports, module) {
    var a = require('a');
});
require(Array, Function):当模块name所以代表的模块加载完成且可用时,回调函数Function才开始执行,并且只被执行一次。各个模块按照依赖数组中的位置顺序以参数的形式传入到Function里。
define(function (require) {
    require(['a', 'b'], function (a, b) {
        //代码
    });
});

CMD规范

定义

Common Module Definition 即通用模块定义.

API

define(factory);
factory 为对象、字符串时,表示模块的接口就是该对象、字符串。
factory 为函数时,表示是模块的构造方法。执行该构造方法,可以得到模块向外提供的接口。factory 方法在执行时,默认会传入三个参数:require、exports 和 module .
define 也可以接受两个以上参数, define(id?, deps?, factory),我感觉和AMD相同.....
示例
define('hello', ['jquery'], function(require, exports, module) {
  // 模块代码
});

(1)require:

接受模块标识作为唯一的参数,用来获取其他模块提供的接口.
define(function( require, exports ){
    var a = require('./a');
    a.doSomething();
});

(2)exports:

factory 的第二个参数,用来向外提供模块接口。
define(function( require, exports ){
    exports.foo = 'bar'; // 向外提供的属性
    exports.do = function(){}; // 向外提供的方法
});

(3) module:

factory的第三个参数,存储了一些与当前模块相关联的属性与方法。
module.id 为模块的唯一标识。
module.uri 根据模块系统的路径解析规则得到模块的绝对路径。
module.dependencies 表示模块的依赖。
module.exports 当前模块对外提供的接口。

异同

AMD规范需要提声明,在依赖数组内.
CMD可以在function内加载.

AMD, CMD