AMD(异步模块定义规范)制定定义模块的规则,模块和模块的依赖是异步加载的。
AMD通过define()函数定义一个模块:
define(?id, dependencies?, factory );
id:为模块的名字,可选,
dependencies:该模块所依赖模块的数组,可选,模块名可以是相对或者绝对,忽略此参数则默认为["require", "exports", "module"]
factory:模块初始化要执行的函数或对象,函数则执行一次,对象则为模块的输出值。
一些例子:
创建一个名为"alpha"的模块,使用了require,exports,和名为"beta"的模块:
define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
exports.verb = function() {
return beta.verb();
//Or:
return require("beta").verb();
}
});
一个返回对象的匿名模块:
define(["alpha"], function(alpha){
return {
verb: function(){
return alpha.verb() + 2;
}
}
})
一个没有依赖性的模块可以直接定义对象:
define({
add: function(x, y) {
return x + y;
}
})
使用CommonJS转换的模块定义:
define(function(require, exports, module) {
var a = require('a'),
b = require('b');
exports.action = function(){};
})
CMD规范
在CMD中,一个模块就是一个文件,通过define()函数定义一个模块
define(factory);
factory可以是一个函数,也可以是一个对象或者字符串。当为函数的时候,如果指定参数,则必须为require、exports、module的顺序,即:
define(function(require, exports, module) {
})
其中require引入一个外部模块,当这个外部模块没有被返回时,应该返回null。
require.async()函数为加载异步加载的模块。
exports对象用来导出模块中的方法等。
module对象:module.uri为该模块的完整uri路径,module.dependencies为该模块需要的外部模块,module.exports等同于exports
其中模块名必须为一个字符串,模块标识符可以没有后缀,模块路径可以是相对路径
math.js
define(function(require, exports, module) {
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
});
increment.js
define(function(require, exports, module) {
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
};
});
program.js
define(function(require, exports, module) {
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
module.id == "program";
});
模块中factory不是函数的
define({
foo: "bar"
})
define([
"foo",
"bar"
])
define('foo bar')
网友评论