AMD:浏览器中的模块规范
前面提到,为实现与NodeJS相同方式的模块写法,大牛们做了很多努力。
?
但由于浏览器环境不同于服务器端,它的模块有一个HTTP请求过程。这个请求过程多数使用script tag,script tag默认的异步性导致很难实现与NodeJS一模一样的模块格式。
?
Modules/Wrappings使得实现变为现实。虽然和NodeJS的模块写法不完全一致,但也有很多相似之处,使得熟悉NodeJS的程序员有一些亲切感。
?
但NodeJS终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。这时AMD诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format存在,因无法与CommonJS开发者达成一致而独立存在。它有独立的wiki和讨论组。
?
AMD设计出一个简洁的写模块API:define。
?
define(id?, dependencies?, factory);
?
其中:
- id: 模块标识,可以省略。
- dependencies: 所依赖的模块,可以省略。
- factory: 模块的实现,或者一个JavaScript对象。id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。
以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):?base.jsdefine(function(require, exports, module) {var base = require('base');exports.show = function() {// todo with module base} });
?不考虑多了一层函数外,格式和NodeJS还比较象的。使用require获取依赖模块,使用exports导出API。
除了define外,AMD还保留一个关键字require。require作为规范保留的全局标识符,可以实现为module loader。也可以不实现。
目前,实现AMD的库有RequireJS、curl、Dojo、bdLoad、JSLocalnet、Nodules等。也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools、jQuery、qwery、bonzo?甚至还有?firebug。
相关:AMD No Longer A CommonJS SpecificationUMD和ECMAScript模块