AMD规范就是其中比较著名一个,全称是Asynchronous Module Definition,即异步模块加载机制。从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制。从它被requireJS,NodeJs,Dojo,JQuery使用也可以看出它具有很大的价值,没错,JQuery近期也采用了AMD规范。在这篇文章中,我们就将介绍AMD的性质,用法,优势以及应用场景。从AMD中我们也能学习到如何在更高层面去设计自己的前端应用。
AMD:浏览器中的模块规范
前面提到,为实现与Node.js相同方式的模块写法,大牛们做了很多努力。
但浏览器环境不同于服务器端,它的模块有一个HTTP请求过程(而Node.js的模块文件就在本地),这个请求过程多数使用script tag,script 默认的异步性导致很难实现与Node.js一模一样的模块格式。
Modules/Wrappings 使得实现变为现实。虽然和Node.js的模块写法不完全一致,但也有很多相似之处,使得熟悉Node.js的程序员有一些亲切感。
但Node.js终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。
这时AMD 诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format 存在,因无法与CommonJS开发者达成一致而独立出来。它有自己的wiki 和讨论组 。
AMD设计出一个简洁的写模块API:
define(id?, dependencies?, factory);
其中:
- id: 模块标识,可以省略。 
- dependencies: 所依赖的模块,可以省略。 
- factory: 模块的实现,或者一个JavaScript对象。 
id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。
 以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):
 base.js
| 1 2 3 4 5 6 | define(function() {    return{        mix: function(source, target) {        }    };}); | 
ui.js
| 1 2 3 4 5 6 7 | define(['base'], function(base) {    return{        show: function() {            // todo with module base        }    }}); | 
page.js
| 1 2 3 | define(['data', 'ui'], function(data, ui) {    // init here}); | 
data.js
| 1 2 3 4 | define({    users: [],    members: []}); | 
以上同时演示了define的三种用法
- 定义无依赖的模块(base.js) 
- 定义有依赖的模块(ui.js,page.js) 
- 定义数据对象模块(data.js) 
细心的会发现,还有一种没有出现,即具名模块
 4,具名模块
| 1 2 3 | define('index', ['data','base'], function(data, base) {    // todo}); | 
具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。
 前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
 5,包装模块
| 1 2 3 4 5 6 | define(function(require, exports, module) {    varbase = require('base');    exports.show = function() {        // todo with module base    }}); | 
不考虑多了一层函数外,格式和Node.js是一样的:使用require获取依赖模块,使用exports导出API。
 除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader,也可以不实现。
 转自(http://www.cnblogs.com/snandy/archive/2012/03/12/2390782.html  )
- 
                                « 上一篇:
                                
                                   RequireJS 2.0 正式发布                                
                            
- 
                                
                                    使用SVG中的Symbol元素制作Icon                                
                                :下一篇 »