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.js

  1. define(function() { 
  2.     return { 
  3.         mix: function(source, target) { 
  4.         } 
  5.     }; 
  6. }); 

ui.js

  1. define(['base'], function(base) { 
  2.     return { 
  3.         show: function() { 
  4.             // todo with module base 
  5.         } 
  6.     } 
  7. }); 

page.js

  1. define(['data', 'ui'], function(data, ui) { 
  2.     // init here 
  3. }); 

data.js

  1. define({ 
  2.     users: [], 
  3.     members: [] 
  4. }); 

以上同时演示了define的三种用法,

1,定义无依赖的模块(base.js)

2,定义有依赖的模块(ui.js,page.js)

3,定义数据对象模块(data.js)

细心的会发现,还有一种没有出现,即具名模块

  1. define('index', ['data','base'], function(data, base) { 
  2.     // todo 
  3. }); 

具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。

前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写

  1. define(function(require, exports, module) { 
  2.     var base = require('base'); 
  3.     exports.show = function() { 
  4.         // todo with module base 
  5.     }  
  6. }); 

不考虑多了一层函数外,格式和NodeJS还比较象的。使用require获取依赖模块,使用exports导出API。

除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader。也可以不实现。

目前,实现AMD的库有RequireJS 、curl 、Dojo 、bdLoad、JSLocalnet 、Nodules 等。

也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools 、jQuery 、qwery 、bonzo 甚至还有 firebug 。

原文:http://www.cnblogs.com/snandy/archive/2012/03/12/2390782.html

【编辑推荐】

  1. 性能优化:如何更快速加载你的JavaScript页面
  2. 从此不再惧怕URI编码:JavaScript及C# URI编码详解
  3. JavaScript设计模式之代理模式
  4. 早该知道的7个JavaScript技巧
  5. JavaScript:根本没有“JSON对象”这回事!
责任编辑:陈贻新 来源: snandy的博客
相关推荐

2012-03-09 09:11:29

Node.js

2009-04-13 08:40:30

AMD浏览器Fusion Medi

2010-04-05 21:57:14

Netscape浏览器

2012-11-08 09:45:44

JavaScriptrequireJS

2012-03-19 17:25:22

2012-03-20 11:31:58

移动浏览器

2012-03-20 11:41:18

海豚浏览器

2012-03-20 11:07:08

2010-12-21 10:11:35

手机浏览器

2013-01-14 10:58:51

傲游云浏览器

2012-06-21 15:38:02

猎豹浏览器

2017-07-20 14:13:38

前端浏览器Native App

2012-03-19 17:17:00

移动浏览器欧朋

2012-03-20 11:22:02

QQ手机浏览器

2015-07-23 10:17:27

浏览器内核

2012-05-07 14:11:30

Delphi

2016-09-21 14:24:37

3D全景浏览器浏览器

2012-03-20 11:35:32

傲游手机浏览器

2011-07-11 14:12:15

浏览器

2012-08-14 17:07:13

点赞
收藏

51CTO技术栈公众号