异步模块定义(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. java集合——题4,6

    4.(List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.add(“Hel ...

  2. JS深入了解闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.   一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作 ...

  3. Android:改变Activity切换方式(转载)

    overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startAc ...

  4. 【VerySky原创】RPR_ABAP_SOURCE_SCAN

    [VerySky原创]RPR_ABAP_SOURCE_SCAN 扫描 ABAP 报表源

  5. VMware Workstation安装RedHat Linux 9

    RedHatLinux是目前世界上使用最多的Linux操作系统.因为它具备最好的图形界面无论是安装.配置还是使用都十分方便.下面我将介绍使用VMware Workstation安装RedHat Lin ...

  6. Android--Matrix图片变换处理

    前言 本篇博客主要讲解一下如何处理对一个Bitmap对象进行处理,包括:缩放.旋转.位移.倾斜等.在最后将以一个简单的Demo来演示图片特效的变换. 本篇博客的主要内容: Matrix Matrix缩 ...

  7. ubuntu下matplotlib画图中文乱码问题

    最近因为论文原因在学习机器学习,看的一本叫做<机器学习实战>的书,看了看还是不错的,因为其中既有原理又有实例.今天载使用matplotlib进行画图时,发现中文会显示为小方块,这个问题真是 ...

  8. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. Window Server IIS6.0部署webservice请求调用提示请求失败

    在一台window server 2003机器上部署了一个webservice,iis为6.0,奇怪的是.在服务器本机调用webservice成功了,可是在其它client调用却反馈失败.详细什么原因 ...

  10. IPv6 app适配

    参考资料: https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/Network ...