一、概括
CommonJs
用在服务器端,AMD
和CMD
用在浏览器环境。AMD
是 RequireJS
在推广过程中对模块定义的规范化产出。CMD
是 SeaJS
在推广过程中对模块定义的规范化产出。
二、CommonJs
CommonJS
是服务器端模块的规范,由Node
推广使用。由于服务端编程的复杂性,如果没有模块很难与操作系统及其他应用程序互动。使用方法如下: module.exports
和require
1 | // math.js |
注:CommonJs
中的require
是同步的
三、AMD
AMD
(Asynchronous Module Definition
),意思就是”异步模块定义”。由于不是JavaScript
原生支持,使用AMD
规范进行页面开发需要用到对应的库函数,也就是大名鼎鼎RequireJS
,实际上AMD
是 RequireJS
在推广过程中对模块定义的规范化的产出。
它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
1、define()函数
RequireJS定义了一个函数 define,它是全局变量,用来定义模块:
1 | define(id?, dependencies?, factory); |
id:指定义中模块的名字,可选;如果没有提供该参数,模块的名字应该默认为模块加载器请求的指定脚本的名字。如果提供了该参数,模块名必须是“顶级”的和绝对的(不允许相对名字)。
dependencies:是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。 依赖参数是可选的,如果忽略此参数,它应该默认为[“require”, “exports”, “module”]。然而,如果工厂方法的长度属性小于3,加载器会选择以函数的长度属性指定的参数个数调用工厂方法。
factory:模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。
1 | define("alpha", ["require", "exports", "beta"], function (require, exports, beta) { |
2、RequireJs使用
1 | // main.js |
1 | // math.js |
四、CMD
CMD
即Common Module Definition
通用模块定义,CMD
规范是国内发展出来的,就像AMD
有个requireJS
,CMD
有个浏览器的实现SeaJS
,SeaJS
要解决的问题和requireJS
一样,只不过在模块定义方式和模块加载(可以说运行、解析)时机上有所不同。
1 | define(function(require, exports, module) { |
1 | // 定义模块 myModule.js |