异步模块定义(Asynchronous Module Definition,简称 AMD)API 描述了一种定义模块的机制,模块及其依赖模块可以通过这种机制进行加载。该机制特别适用于浏览器。

本规范曾被称为 Modules Transport/C,但本规范主要不是用来传输已有的 CommonJS 模块,而是用来定义模块。

规范正文

define 函数

本规范只定义了一个函数 define,该函数是一个自由变量,或者说是一个全局变量。函数签名如下:

define(id?, dependencies?, factory);

第一个参数 id 指定了即将定义的模块的 id。该参数是可选的,如果未指定该参数,则模块的 id 默认为模块加载器请求该脚本时使用的模块 id。如果指定该参数,参数值必须是一个绝对 id(不允许使用相对 id)。

第二个参数 dependencies 是一个数组,包含即将定义的模块所有依赖模块名称。依赖模块必须在执行工厂函数之前完成解析,解析结果作为参数传递给工厂函数,工厂函数的参数顺序与 dependencies 参数所包含依赖模块顺序保持一致。依赖模块 id 可以为相对 id,所谓相对是指相对于即将定义的模块而言。如果 dependencies 中出现 require, exportsmodule 字样,则对应的参数应被解析为 CommonJS 模块规范中所定义的自由变量 require, exports 或 module。dependencies 参数是可选的,该参数缺省值为 ["require", "exports", "module"]。如果工厂函数的参数列表长度小于 3,那么加载器可以选择使用工厂函数参数列表长度所对应的 dependencies 参数来调用工厂函数。

第三个参数 factory 是一个函数,它用来初始化一个模块或对象。如果 factory 是一个函数,那它应该只被执行一次。如果 factory 是一个对象,那么它应该作为模块的输出物进行赋值。

如果 id 和 dependencies 全部缺省,则模块加载器应扫描工厂函数体中包含的 require 语句来确定依赖模块。为此,工厂函数的第一个参数应命名为 "require"。某些情况下加载器可以选择不去扫描依赖模块,例如代码大小限制,或者函数对象缺少 toString 方法。只要 id 或 dependencies 有一个被指定实参,则加载器就不应再扫描工厂函数来确定依赖模块。

define.amd 属性

为了能够清楚表明当前全局函数 define 是否符合 AMD API,任何一个全局函数 define 都应拥有一个 amd 属性,该属性值为一个对象。这样可以避免现有的 Javascript 代码中存在的全局函数 define 不符合 AMD API 的冲突。

define.amd 对象应拥有的属性不在本规范中给出说明。实现了 AMD API 的作者可以利用 amd 属性来通知别人,他的实现中除了基本的 AMD API,还额外提供了什么支持。

define.amd 属性表明当前 AMD 实现符合本规范所定义的 API。如果还有另一个版本的 API,那么将在 define 函数上添加另一个属性,例如 define.amd2 来表示该实现符合另一个版本的 API。

以下示例想要说明某个实现支持加载多个版本的模块:

define.amd = {
multiversion: true
};

最简单的定义:

define.amd = {};

一次传输多个模块

一个脚本中可以多次调用 define 函数,define 函数的调用顺序不影响大局。先定义的模块可以指定后定义的模块作为依赖模块。模块加载器负责延迟加载未解析的依赖模块直到整个脚本都加载完毕,以此来阻止非必要的请求

示例

使用 require 和 exports

定义一个 id 为 "alpha" 的模块,它有一个依赖模块 beta。

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
exports.verb = function () {
return beta.verb();
}
});

定义一个匿名模块,模块的 id 来自于源文件名。

define(['alpha'], function (alpha) {
return {
verb: function () {
return alpha.verb() + 2;
}
};
});

定义一个自由模块(没有依赖其他模块)。

define({
add: function (x, y) {
return x + y;
}
});

全局变量

本规范保留了全局变量 define,*包的元数据异步定义 API and 作为保留关键字以备未来其他 CommonJS API 使用。模块加载器不应该在此函数上添加额外的方法或属性。

本规范保留了全局变量 require 提供给模块加载器使用。模块加载可以自由使用该全局变量,它们可以使用该变量,并向该变量添加属性或函数,甚至可以选择不使用 require。

备注

define 函数的调用推荐使用 define(...) 的形式,以便静态分析工具可以顺利工作。

本规范曾使用 require.def() 作为入口方法。模块加载器可以将 define() 设置为 require.def() 的别名以向后兼容。


PS:本规范从 CommonJS 官方英文版本转译而来,斜体部分表示译文存在商榷。

Ref:

CommonJS Asynchronous Module Definition

CommonJS 的 AMD 规范的更多相关文章

  1. javascript模块化编程:CommonJS和AMD规范

    AMD规范,异步模块定义.与CommonJS规范齐名并列. 作用都是利于JavaScript的模块化编程. 模块化编程的好处就是: 1.可重用 2.独立 3.能解决加载的依赖性问题 4.能解决重复加载 ...

  2. 前端模块化IIFE,commonjs,AMD,UMD,ES6 Module规范超详细讲解

    目录 为什么前端需要模块化 什么是模块 是什么IIFE 举个栗子 模块化标准 Commonjs 特征 IIFE中的例子用commonjs实现 AMD和RequireJS 如何定义一个模块 如何在入口文 ...

  3. 浅析JS中的模块规范(CommonJS,AMD,CMD)

    如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS ...

  4. 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz

    浅析JS中的模块规范(CommonJS,AMD,CMD)   如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已.     ...

  5. Javascript模块规范(CommonJS规范&&AMD规范)

    Javascript模块化编程(AMD&CommonJS) 前端模块化开发的价值:https://github.com/seajs/seajs/issues/547 模块的写法 查看 AMD规 ...

  6. JS模块化规范CommonJS,AMD,CMD

    模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块.理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可.一个模块化系统所必须的 ...

  7. JS中的模块规范(CommonJS,AMD,CMD)

    JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧, ...

  8. CommonJs、AMD、CMD模块化规范

    /** * CommonJS 模块化规范 * CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作 */ /*-------Node.js遵循Commonjs规范----- ...

  9. 学习笔记:CommonJS规范、AMD规范

    CommonJS规范 http://wiki.jikexueyuan.com/project/webpack-handbook/commonjs.html CommonJS 规范 http://www ...

随机推荐

  1. webpack学习之入门实例

    webpack:前端打包神器,目前活跃度甚至超过了gulp.grunt等,使用webpack打包,简单快速,下面记录下webpack环境搭建以及基本使用: 1.首先新建一个空白目录,用于项目根目录,比 ...

  2. UICollectionView基础

    初始化部分: UICollectionViewFlowLayout *flowLayout= [[UICollectionViewFlowLayout alloc]init]; self.myColl ...

  3. MapReduce之单词计数

    最近在看google那篇经典的MapReduce论文,中文版可以参考孟岩推荐的 mapreduce 中文版 中文翻译 论文中提到,MapReduce的编程模型就是: 计算利用一个输入key/value ...

  4. JavaScript 语句 数组与冒泡排序法

    数组 数组:不管是什么类型,都可以进行存放.存放是有一定顺序的. 顺序:索引号从0开始. 1.需要先对数组进行初始化 var array //数组名称 = new Arrary() //Array 注 ...

  5. [IOS]IOS UI指南

    [IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...

  6. 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件

    PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...

  7. Qt 实现遥感图像显示时的连动效果

    遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果.如 ...

  8. hibernate 映射 多对一

    一对多和上文讲的多对一两种映射关系,其实就是站在相反的角度考虑同样的事情. 一对多和多对一映射原理是一样的,都在多的一端加入一个外键指向一的一端.也就是说,在关系数据库的表中,他们的表及表字段都是一样 ...

  9. Xshell中文乱码问题

    1.  先查看当前使用的语言: echo $LANG 2.  查看系统的语言安装包: locale 3.  如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 4.  有了中文 ...

  10. 深入剖析 redis 事件驱动

    概述 redis 内部有一个小型的事件驱动,它和 libevent 网络库的事件驱动一样,都是依托 I/O 多路复用技术支撑起来的. 利用 I/O 多路复用技术,监听感兴趣的文件 I/O 事件,例如读 ...