CommonJS规范
应用于服务端,模块同步加载 — nodejs/webpack;
- 引用:require(module);
- 导出:exports、module.exports;
- 全局对象:global对象 — 用于模块间共享变量;
- 模块对象:module对象 — 表示当前对象,存在于每个模块内部;
注:浏览器不兼容CommonJS的根本原因是缺少以上四个nodejs环境的变量,只要能提供这些对象—通过立即执行函数提供,浏览器就能加载CommonJS模块;
// 浏览器环境
var module = {
exports: {}
};
(function(module, exports) {
exports.multiply = function (n) { return n * 1000 };
}(module, module.exports))
var f = module.exports.multiply; // f(5) = 5000;
AMD规范(异步模块定义)
- 背景
CommonJS规范不适合于浏览器环境:
- require()是同步的:
- 服务器:所有的模块在本地磁盘,同步加载等待时间是硬盘的读取时间;
- 浏览器:模块在服务端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于假死状态;
- AMD
- require([module], callback):异步方式加载依赖的模块,所有依赖模块加载完后执行回调函数;
require(['moduleA'、‘moduleB’、‘moduleC’],function(moduleA,moduleB,moduleC){ ... }) - RequireJS库:
- 实现js文件的异步加载,避免网页失去响应;
- 管理模块之间的依赖性,便于代码的编写和维护;
- 模块编写规范
- define([module], callback):模块写在define()中;
//math.js
define(function(){
var add = function(x, y){
return x+y;
}
return {
add: add //导出模块
}
})
CMD规范(通用模块定义)
与AMD规范类似,区别是:
- AMD规范:依赖置前:预先加载所有的依赖,知道使用时才执行 —
define([module], function(){}) - CMD规范:依赖就近 :直到使用时才加载依赖;
define(function(reuqire, exports, module){
var module = require('xx'); //当需要模块时才require();
})
ES6的Module(支持服务器和浏览器)
区别
- CommonJS、AMD、CMD属于运行时加载:只有在运行时才能确定输出接口,获取到模块生成一个对象;
- ES6属于编译时加载:编译时确定输出接口,静态加载—支持静态分析,从而提前检查代码bug等;
- CommonJS模块的顶层this指向当前模块,ES6模块中的this指向undefined;
让浏览器兼容ES6写法
规范总结

