模块
这里需要注意的两个关键概念是用于促进模块定义的define方法和用于处理依赖项加载的require方法。define 用于根据使用以下签名的提议定义命名或未命名模块:
define(
module_id /*optional*/,
[dependencies] /*optional*/,
definition function /*function for instantiating the module or object*/
);
从内联注释可以看出,module_id 是一个可选参数,通常仅在使用非 AMD 连接工具时才需要(可能还有其他一些有用的边缘情况)。当这个参数被忽略时,我们称模块为匿名的。
使用匿名模块时,模块身份的概念是 DRY,避免文件名和代码重复变得微不足道。由于代码更具可移植性,因此可以轻松地将其移动到其他位置(或文件系统周围),而无需更改代码本身或更改其 ID。module_id 等效于简单包中的文件夹路径,并且在包中不使用时。开发人员还可以在多个环境中运行相同的代码,只需使用与 r.js 等 CommonJS 环境配合使用的 AMD 优化器。
回到定义签名,dependencies 参数表示您正在定义的模块所需的依赖项数组,第三个参数(“定义函数”)是执行以实例化模块的函数。准系统模块可以定义如下:
// A module_id (myModule) is used here for demonstration purposes only
define('myModule',
['foo', 'bar'],
// module definition function
// dependencies (foo and bar) are mapped to function parameters
function ( foo, bar ) {
// return a value that defines the module export
// (i.e the functionality we want to expose for consumption)
// create your module here
var myModule = {
doStuff:function(){
console.log('Yay! Stuff');
}
}
return myModule;
});
// An alternative example could be..
define('myModule',
['math', 'graph'],
function ( math, graph ) {
// Note that this is a slightly different pattern
// With AMD, it's possible to define modules in a few
// different ways due as it's relatively flexible with
// certain aspects of the syntax
return {
plot: function(x, y){
return graph.drawPie(math.randomGrid(x,y));
}
}
};
});
另一方面,如果您希望动态获取依赖项, require通常用于在顶级 JavaScript 文件或模块中加载代码。
// Consider 'foo' and 'bar' are two external modules
// In this example, the 'exports' from the two modules loaded are passed as
// function arguments to the callback (foo and bar)
// so that they can similarly be accessed
require(['foo', 'bar'], function ( foo, bar ) {
// rest of your code here
foo.doSomething();
});
希望这对你有帮助......