AMD 简要介绍
AMD 是 Asynchronous Module Definition 的简称,即异步模块加载机制。该规范是由 CommonJS 提出的一种异步动态加载 JavaScript 代码的 API 规范。AMD 以简洁优雅的运行方式得到了很多主流 JavaScript 框架的 青睐,主流 JavaScript 开源框架逐渐开始用 AMD 规范来实现对其代码模块的动态加载。在 AMD 日益流行的情况下,开发 过程中的 JavaScript 框架迁移变得更加方便,同时,在一个应用中引入多个具有不同优势和功能特点的 JavaScript 框架 也变得刚加容易。
AMD 工作原理
AMD 的 API 规范非常简洁,仅包含一个名为 define 的函数:
define([module-name?], [array-of-dependencies?], [module-factory-or-object]);
其中:
module-name:模块标识,可以省略。
array-of-dependencies:所依赖的模块,可以 省略。
module-factory-or-object:模块的具体实现,或者一个 JavaScript 对象。
第一个 参数 module-name 指的是模块名称标识,该参数在 AMD 加载中没有实际性作用,只做为一个名称标识。如果第一个参数被 省略,那么这个模块就成为了一个匿名模块。
匿名模块最大的优势就是可以降低代码本身和所属模块的耦合程度。 这类模块符合 DRY (Don't repeat yourself) 原则,即模块文件可以放置在任何位置而不需要修改文件内容本身。如 比较熟悉的 Java 类,它的类名和包名必须符合一定的格式,文件名和类名需要一致,文件也必须放置在相应的包路径下。 而在 AMD 加载的 dojo 中,如果一个模块为匿名模块,那么该模块的文件名就是模块标识。
AMD 的优势
匿 名模块的优势
下面来对比一下传统模块加载方式和 AMD 方式,看看匿名模块有什么样的优势:
在 dojo 的 早期版本中,建立一个 dog 类,该类继承自 animal 类。文件结构如下图所示:
图 1
在基类 animal 中有如下声明 :
清单 1
dojo.provide("animal"); // 用于初始化该 js 文件,使之成为 dojo 的模块 |
在非 AMD 情况下文件名和 provide 中参数必须保 持一致性 ( 即文件名与模块标识最后小数点右边部分保持一致 ),否则 dojo.require 就无法正确初始化调用该模块。
此时,继续引入子类,如 cat 类、tiger 类,为了区别基类与之类,将 animal 基类移到一个独立的文件夹,如下 图:
图 2