公共模块定义/草案(Common Module Definition / draft - CMD草案)
This specification addresses how modules should be written in order to be interoperable in browser-based environment. By implication, this specification defines the minimum features that a module system must provide in order to support interoperable modules.
- Modules are singletons.
- New free variables within the module scope should not be introduced.
- Execution must be lazy.
Module Definition
A module is defined with define keyword, which is a function.
define(factory);
- The
definefunction accepts a single argument, the module factory. - The
factorymay be a function or other valid values. - If
factoryis a function, the first three parameters of the function, if specified, must be "require", "exports", and "module", in that order. - If
factoryis not a function, then the module's exports are set to that object.
Module Context
In a module, there are three free variables: require, exports and module.
define(function(require, exports, module) {
// The module code goes here
});
The require Function
requireis a functionrequireaccepts a module identifier.requirereturns the exported API of the foreign module.- If requested module cannot be returned,
requireshould return null.
require.asyncis a functionrequire.asyncaccepts a list of module identifiers and a optional callback function.- The callback function receives module exports as function arguments, listed in the same order as the order in the first argument.
- If requested module cannot be returned, the callback should receive null correspondingly.
The exports Object
In a module, there is a free variable called "exports", that is an object that the module may add its API to as it executes.
The module Object
module.uriThe full resolved uri to the module.
module.dependenciesA list of module identifiers that required by the module.
module.exportsThe exported API of the module. It is the same as
exportsobject.
Module Identifier
- A module identifier is and must be a literal string.
- Module identifiers may not have a filename extensions like
.js. - Module identifiers should be dash-joined string, such as
foo-bar. - Module identifiers can be a relative path, like
./fooand../bar.
Sample Code
A typical sample
math.js
define(function(require, exports, module) {
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
});
increment.js
define(function(require, exports, module) {
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
};
});
program.js
define(function(require, exports, module) {
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
module.id == "program";
});
Wrapped modules with non-function factory
object-data.js
define({
foo: "bar"
});
array-data.js
define([
'foo',
'bar'
]);
string-data.js
define('foo bar');
译文:
本规范阐述了如何编写模块,以便在基于浏览器的环境中进行互操作。本规范定义了模块系统必须提供的最小功能,以支持互操作模块。
- 模块应该是单例。
- 不应引入模块作用域范围内的新的自由变量。(模块作用域范围内不应引入新的自由变量)(其他模块不应引入模块作用域范围内的新的自由变量)
- 执行必须是懒惰的。
模块定义
一个模块就是一个函数,使用“define”关键字定义。
例如:
define(factory);
define函数接受单个参数,即模块工厂。
工厂可能是一个函数或其他有效值。
如果factory是一个函数,函数的前三个参数(如果指定的话)必须是“require”,“exports”和“module”。
如果工厂不是一个函数(不是函数那必然就是对象或者基本类型了),那么模块的export属性应该设置为该对象(这里这个“对象”两个字,意思是“那个传入模块的单个参数,即模块工程,因为它不是函数,那么可能是js对象或者js基本类型)。
模块上下文
一个模块中有三个自由变量:require,exports 和 module。
例如:
define(function(require, exports, module) {
// The module code goes here
});
require函数
1. ”require“是一个这样的函数:
require函数接收一个模块标识符(模块标识符也叫模块id)。require函数返回外部模块的导出API(”导出API“是用来导出内容给外部模块使用的)。- 如果无法返回请求的模块,
require函数将返回null。
2. ”require.async“ 是一个这样的函数:
require.async接收一个模块Id列表和一个可选的回调函数。- 回调函数接收模块导出作为函数参数,按照与第一个参数中的顺序相同的顺序列出。
- 如果不能返回请求的模块,则回调应该相应地收到null。
exports对象
每个模块中都有个名叫"exports"的自由变量,这是一个模块可以在模块执行时添加模块API的对象。
module对象
1. module.uri:完整解析的模块URI(模块URI的全路径)。
2. module.dependencies:模块请求的标识符(模块id)列表。
3. module.exports:模块的导出API(”导出API“是”用来导出什么东西的API“)。 它与export对象相同。
模块标识符(模块id)
- 模块的标识符(模块id)必须是字面量字符串。
模块标识符(模块id)不能有类似 .js 的文件名扩展。- 模块标识符(模块id)应该是加前/后缀的字符串,比如:foo-bar。
- 模块标识符(模块id)可以是相对路径,例如:
./foo和../bar.。
示例代码
一个典型的例子:
math.js
define(function(require, exports, module) {
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
});
increment.js
define(function(require, exports, module) {
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
};
});
program.js
define(function(require, exports, module) {
var inc = require('increment').increment;
var a = 1;
inc(a); //
module.id == "program";
});
使用非函数的工厂包装模块
object-data.js
define({
foo: "bar"
});
array-data.js
define([
'foo',
'bar'
]);
string-data.js
define('foo bar');
公共模块定义/草案(Common Module Definition / draft - CMD草案)的更多相关文章
- 【SysML】模块定义图(BDD, Block Definition Diagram)
一.引言 SysML中的模块定义图,英文为 “Block Definition Diagram”,简称BDD,是系统建模过程中最为常见的图之一,BDD是一种结构图,它主要对系统的结构组成以及组成元素间 ...
- CMD规范(通用模块定义规范)(翻译)
最近在使用sea.js.大家知道sea.js遵循CMD规范.该规范的英文说明很简洁,我试着翻译了一下,旨在交流. Common Module Definition 通用模块定义规范 This spec ...
- Sea.js学习3——Sea.js的CMD 模块定义规范
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- CMD 模块定义规范
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- CMD模块定义规范
CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规 ...
- CMD (sea.js)模块定义规范
转自http://www.cnblogs.com/hongchenok/p/3685677.html CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(C ...
- CMD 模块定义规范【转】
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- 理解JS中的模块规范(CommonJS,AMD,CMD)
随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...
- JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...
随机推荐
- jQuery筛选总结
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【转】Linux 移动或重命名文件/目录-mv 的10个实用例子
熟悉了 复制命令,下一个相关的命令就是 mv 命令.当你想要将文件从一个位置移动到另一个地方并且不想复制它,那么mv 命令是完成这个任务的首选. 初识 mv 命令 mv 命令是一个与cp类似的命令,但 ...
- Linux中无权限使用sudo
提示:$USER is not in the sudoers file. This incident will be reported. 解决方法: 切换到root用户,su 编辑sudo配置文件,v ...
- [loj2585][APIO2018]新家
题目 一条街上有\(n\) 个点,坐标为\(x_i\) , 店的种类为\(t_i\) , 开业时间为 \([a_i,b_i]\) ; 定义一种类型到一个点的距离为这种类的点到这个点的最近距离 ; 定义 ...
- .net跨防火墙链接oracle连接池链接长时间无通讯数据被断开后报错问题解决
环境: .net 4.0以上使用Oracle.ManagedDataAccess组件链接oracle数据库,应用程序与数据库之间存在硬件防火墙. 症状:应用程序启动后正常访问,如果出现长时间无数据库请 ...
- Java:读取系统信息
com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) Managem ...
- poj 1236(强连通分量分解模板题)
传送门 题意: N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都 ...
- 约会 音频mm教你追女孩
微信吧地址发给他人. 美团提前选好环境然后提前打电话订购一个位置. 微博作用是为:更多的谈资.热搜 ,最近上榜的话题说. 打车软件: 地图: 2.外表: 下澡,指甲,胡子,发型,适合服装.发型和服装搭 ...
- Mysql跨表更新
Mysql跨表更新一直是大家所关心的话题,本文介绍mysql多表 update在实践中几种不同的写法,需要的朋友可以参考下 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Pr ...
- ev的offsetX,pageX,clientX和screenX
event.offsetX.event.offsetY(相对事件发生的具体元素左上角的定位) 鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性 ...