AMD
概述
AMD(Asynchronous Module Definition):异步模块定义,采用异步方式加载模块。
示例
// 定义模块 define("Module", [], function() { var Module = function() { // Module 相关实现代码 }; return Module; }); // 引用模块 require([Module], function(Module){ // 相关处理代码 });
代码说明
模块定义
AMD通过define()函数来定义模块:
- id(可选参数):字符串类型的数据,表示模块标识
- dependencies(可选参数):数组类型,当前模块依赖的模块
所依存的其他模块的ID。 - factory:函数或者对象类型
返回模块对象的函数,或模块对象自身。如果是函数,函数的参数将是所依存的模块对象列表。
模块引用
如果需要参照某个外部模块导出的对象,需要事先引用该外部模块。
- modules(字符串数组, 必须):
所引用的外部模块的ID。 - callback(可选参数):
设置回调函数
主要特点
AMD的主要特点:
- 异步加载
所有的模块都以支持异步加载为前提。 - 依存关系管理
定义模块的时候,可以声明所依存的其他模块。模块间的依存关系由模块化系统自动维护管理。 - 提前执行
提前执行所有的依赖。 - 依赖前置
在解析和执行当前模块之前即定义模块时必须指明当前模块所依赖的模块,没有依赖则为空数组。
原理探究
定义模块时,define函数被执行,解析器会用一些预定义的规则解析所有依赖模块的路径,并且把未载入也未进入等待列表的依赖放入等待列表,并加载这些依赖所对应的文件。当所有依赖被加载完后,才会执行定义时所设置的factory,并把factory的返回值存储在内部的哈希表里,而存储的键为定义时设置的id,没有有设置id的情况下,默认为该模块的模块名称(path/ModuleName)。
引用模块时,解析器会遍历所设置的依赖数组,以数组的成员(字符串)为键,从内部哈希表中查找到对应的值,赋值给回调函数中对应位置的参数。