CommonJs
主要针对服务端(同步加载文件),对应的实现是nodejs
CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。
eg:
//以下代码在一个js文件里,一个文件就是一个模块
//私有变量
var test = "private";
//公有方法
function example () {
this.foo = function () {
// do someing ...
}
this.bar = function () {
//do someing ...
}
}
//exports对象上的方法和变量是公有的
var example = new example();
exports.foobar = foobar;
AMD
主要针对浏览器端(异步加载文件),预加载文件。对应的实现是requirejs
AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:require([modules], callback);
第一个参数[modules],是需加载的模块名数组;第二个参数callback,是模块加载成功之后的回调函数。
eg:
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
b.doSomething()
//...
})
CMD
主要针对浏览器端(异步加载文件),按需加载文件。对应的实现是seajs
eg:
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ...
})
对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。CMD 推崇依赖就近,AMD 推崇依赖前置。