当前位置: 首页 > 编程日记 > 正文

CommonJS 的 AMD 规范

异步模块定义(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

相关文章:

易观的大数据中台之路

作者 | 易观CTO郭炜出品 | AI科技大本营(ID:rgznai100)本文为CSDN即将推出的《新战场:决胜中台》专刊的第 2 篇文章。什么是数据中台?中台的定义来自于投资银行,简单说来,投行当中前台是赚钱的、后台是做支…

WMI技术介绍和应用——查询系统信息和补丁包信息

本文使用了《 WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。( 转载请指明出于breaksoftware的csdn博客)本文主要知识点是Win32_OperatingSystem和Win32_Quick…

Winform与Webform中的对话框

参考MSDNDialogResult result MessageBox.Show("见过打劫的没?", "打、打、打劫", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);switch (result){case DialogResult.OK:MessageBox.Show("你按了确定…

启动Genymotion时报错Failed to initialize backend EGL display

在启动Genymotion的时候报错: video card说的是显卡,你的显卡可能不支持 OpenGL2.0,或者你装的驱动有问题。解决办法:将驱动重新安装一下。可直接下载一个如“驱动人生“一样的驱动软件,把你的显卡驱动更新一下。转载…

新年新方向-斩获新职位

^_^上个星期斩获公司内部竞聘职位:项目管理部总经理,高兴,发展方向变了,以后我会多写一些项目管理的文章和大家分享。WPF的学习和分享也不会停下来,我要全面发展,做社会主义的接班人!YE!项目管理部总经理职…

清华官宣:前百度总裁张亚勤正式加盟清华大学

整理 | Jane出品 | AI科技大本营(ID:rgznai100)12月31日,2019 年的最后一天,在大家沉浸在「总结过去」、「展望未来」之时,清华大学刚刚官宣了一则消息:前百度总裁张亚勤正式加盟清华大学&#…

WMI技术介绍和应用——查询时间信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。(转载请指明出于breaksoftware的csdn博客) 本文主要介绍Win32_LocalTime和Win32_UTCTime。 如何使…

问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”

问题现象:突然断电后,重启电脑,再打开VMware Workstation,启动不了。之后就提示“内部错误”。问题原因:希望高人指点。问题处理:关闭VMware Workstation,在快捷方式上,右击&#xf…

FC SAN与IP SAN的比较

SAN(Storage Area Network,存储区域网络)是一个由存储设备和系统部件构成的网络。所有的通信都在一个与应用网络隔离的单独的网络上完成,可以被用来集中和共享存储资源。SAN不但提供了对数据设备的高性能连接,提高了数…

“数学不行,干啥也不行!”骨灰级程序员:其实你们都是瞎努力

编程圈一直都流传着一个段子:一流程序员靠数学,二流程序员靠算法,末端程序员靠百度,低端看高端就是黑魔法。懂的人其实都知道,这不是段子,其实就是程序员的真实写照。想一想,我们日常学习、求职…

WMI技术介绍和应用——查询系统服务

本文使用了《 WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。( 转载请指明出于breaksoftware的csdn博客)本文主要介绍Win32_Service类。 如何使用WMI枚举系统中…

送书 | 2020年新一天,用这本书开启你的NLP学习之路!

本文选自电子工业出版社博文视点新书《大数据智能:数据驱动的自然语言处理技术》。本书作者:清华大学刘知远、薄言RSVP.ai崔安颀、腾讯张开旭、清华大学韩文弢、中国人民大学赵鑫、厦门大学苏劲松、罗格斯大学张永锋、北京大学严睿、哈尔滨工业大学&…

如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。今天花点时间,将该方法整理成文。&#xff…

Ruby环境的安装(In Ubuntu 7.10)

今天开始学习Ruby。准备的图书呢,就是《Programming Ruby - 2nd》。为了准备一个实验的环境,于是要给我的Ubuntu上安装Ruby的环境。1、安装解释器:sudo apt-get install ruby 2、安装一个即时执行工具irb:由于第一部安装的结果…

基于animation.css实现动画旋转特效

分享一款基于animation.css实现动画旋转特效。这是一款基于CSS3实现的酷炫的动画旋转特效代码。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <div class"wrap"><div class"mod_bg"><div class"bg…

VC:CString用法整理(转载)

1.CString::IsEmpty BOOL IsEmpty( ) const; 返回值&#xff1a;如果CString 对象的长度为0&#xff0c;则返回非零值&#xff1b;否则返回0。 说明&#xff1a;此成员函数用来测试一个CString 对象是否是空的。 示例&#xff1a; 下面的例子说明了如何使用CString::IsEmp…

WMI技术介绍和应用——查询本地用户和组

本文使用了《 WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句&#xff0c;具体使用参看前面的例子。&#xff08; 转载请指明出于breaksoftware的csdn博客&#xff09;本文主要介绍Win32_Group和Win32_UserAccount类。 如何…

AAAI 2020 | 时间可以是二维的吗?基于二维时间图的视频内容片段检测

作者 | 彭厚文、傅建龙来源 | 微软研究院AI头条编者按&#xff1a;当时间从一维走向二维&#xff0c;时序信息处理问题中一种全新的建模思路由此产生。根据这种新思路及其产生的二维时间图概念&#xff0c;微软亚洲研究院提出一种新的解决时间定位问题的通用方法&#xff1a;二…

UITextField的代理方法

- (void)textFieldDidBeginEditing:(UITextField *)textField 当textField开始编辑的时候调用&#xff0c;可用完成如下的需求&#xff1a;点击textField可以使页面往上滑动 必须加上这句代码 [UIView animateWithDuration:.25 animations:^{ _scrollView.contentOffset CGPo…

以金山界面库(openkui)为例思考和分析界面库的设计和实现——问题

随着物质生活的丰富&#xff0c;人们的精神生活也越来越丰富。人们闲暇的时间也相对变多&#xff0c;于是很多人就开始寻找打发时间的方法。其中电视便是其中一种非常重要的消遣方式。假如我们打开电视机&#xff0c;看到了一个电视台正在播一部我们之前没看过的&#xff0c;正…

知识图谱,下一代数据中台的核心技术

作者 | 杨威&#xff0c;明略科技技术中心负责人 编辑 | 夕颜 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 本文为CSDN即将推出的《新战场&#xff1a;决胜中台》专刊的第 3 篇文章。 【导读】数据中台火的十分突然&#xff0c;似乎年前还在炒概念&#xff0c;年…

StoneAge Dict 技术方案的可行性[1]

上次和项目经理讨论了技术选型的事&#xff0c;现在简单地说一下&#xff0c;等下次开会再系统地讲。1. 平台环境&#xff1a;Java1.52. 用户接口&#xff1a;Web: JSP, JSFSpring2.5xDesktop: JavaFX3. 技术&#xff1a;dictzip(解析StarDict词库), XML因为StarDict是目前很受…

using的几种用途

using 常用来引用命名空间 1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 using System.Collections.Generic; 5 using Model; 6 using IDAL; 7 using DBUnititly; using另一个用途是给类和命名空间指定别名 1 using spacename system.io2 3 using…

以金山界面库(openkui)为例思考和分析界面库的设计和实现——资源读取模块分析

按照软件的执行流程&#xff0c;我们首先遇到《以金山界面库&#xff08;openkui&#xff09;为例思考和分析界面库的设计和实现——问题》中提出的最后一个问题&#xff1a;界面描述文件的放置位置。我们曾提出一种方案&#xff1a;将界面描述文件打包后放在资源文件中&#x…

开发者如何赶上5G风口?

随着5G正式步入商用&#xff0c;5G 技术引发广泛关注。据信息通信研究院《5G经济社会影响白皮书》预测&#xff0c;2030年&#xff0c;5G将直接带动的总产出、经济增加值、就业机会分别为6.3万亿元、2.9万亿元和800万个。据BOSS直聘 《2019年5G相关人才数据观察》报告指出&…

使用C# 3.0编译器编译 Asp.Net 项目代码

只需要在 web.config 里添加这样的一段设置就OK了:<configuration><system.codedom><compilers><compiler language"c#;cs;csharp"extension".cs"type"Microsoft.CSharp.CSharpCodeProvider,System, Version2.0.0.0, Cultureneu…

java 它 引用(基本类型的包装,构造函数和析构函数c++不同)

一个&#xff1a;java 和c参考控制 他提到引用&#xff0c;我们会想到java它不喜欢c里面的指针。当然java内引用和c里面的引用是不同的。 比如&#xff1a; 比方C中&#xff0c;我对某一个函数的声明。int a(int &b)&#xff0c;b即为引用类型&#xff0c;函数内b的改动能够…

使用程序解决一道逻辑推理题

今天看朋友发了一个老问题&#xff0c;一道很有意思的推理题&#xff1a;&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 小明和小强都是张老师的学生&#xff0c;张老师的生日是M月N日&#xff0c;2人都知道张老师的生日是下列10组中的一天&#xff1a; 3月4…

AjaxControlToolKit之DragPanelExtender用法

1、将控件ToolkitScriptManager拖至页面中...2、定义3个Panel&#xff0c;用于实现窗体拖动效果&#xff0c;代码如下&#xff1a;1<body>2<form id"form1"runat"server">3<div>4<cc1:ToolkitScriptManager ID"ToolkitScriptMan…

自带数据线的迷你数显充电宝,旅途必备

还有20多天就过年了有件极其考验情商的事情也来临了就是我们这群90后过年最怕的事情——相亲但是在尴尬的场合手机可是一个缓解气氛的好东西不管是想要选择看电影&#xff0c;还是找附近的游玩只要有手机&#xff0c;就可以从容不迫的应对但是带手机最尴尬的事情莫过于结账的时…