CommonJS
一种服务器端模块化的规范,Nodejs实现了这种规范,因此就说Nodejs支持CommonJS。javascript
- CommonJS分为三部分:
- require 模块加载
- exports 模块导出
- module 模块自己
根据规范一个单独的JS文件就是一个module,每一个单独的module是一个单独的做用域。也就是说在一个文件里定义的变量和函数都是私有,对其余文件不可见,除非用exports导出了。java
AMD
Asynchronous Module Definition 的缩写,意思是异步模块定义,是一种异步模块加载的规范,主要用于浏览器端的JS加载,为了避免形成网络阻塞。只有当依赖的模块加载完毕,才会执行回调。git
AMD使用define来定义模块,require来加载模块。
define(id?,dependencies?,factory);
require([module],callback);github
Note: AMD容许输出的模块兼容CommonJS。后端
RequireJS是AMD的一种实现。浏览器
CMD
Common Module Definition的缩写,也是一种异步模块定义规范,它和AMD的主要区别有两点:
1.对于模块的依赖,AMD是提早执行,CMD是延时执行。
2.AMD推崇依赖前置,CMD推崇就近依赖。服务器
//AMD
define(['./a','./b'], function (a, b) {
//依赖一开始就写好
a.test();
b.test();
});
//CMD
define(function (requie, exports, module) {
//依赖就近书写
var a = require('./a');
a.test();
});
固然还其余区别这里就不详细讲了。markdown
SeaJS是CMD的一种实现。
UMD
Universal Module Definition。从名字就能够看出来UMD作的是大一统的工做,把先后端加载糅合在了一块儿,提供了一个先后端统一的解决方案。支持AMD和CommonJS模式。网络
UMD的实现很简单:异步
1.先判断是否支持Node.js模块格式(exports是否存在),存在则使用Node.js模块格式。 2.再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。 3.前两个都不存在,则将模块公开到全局(window或global)。
各类具体的实现方式,能够查看UMD的github。下面是Jquery的例子
// if the module has no dependencies, the above pattern can be simplified to
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
root.returnExports = factory();
}
}(this, function () {
// Just return a value to define the module export.
// This example returns an object, but the module
// can return a function as the exported value.
return {};
}));