[TOC]
1. CommonJS
CommonJS
同步声明依赖的模块定义
无论一个模块在 require()中被引用多少次,模块永远是单例
模块第一次加载后会被缓存,后续加载会取得缓存的模块, 模块加载顺序由依赖图决定
const moduleA = require ( ’. / moduleA ’);
module.exports = moduleA.someFunc;
2. AMD
异步的方式加载依赖的模块 Asynchronous Module Definition
// 定义一个模块
define('module', ['dep'], function (dep) {
return exports;
});
//导入和使用
require (['module'] , function(module) {
});
优点:
可以在不转换代码的情况下直接在浏览器中运行
可以异步加载依赖
可并行加载多个依赖
可以同时运行在浏览器环境和Node.js环境
JavaScript环境没有原生支持AMD,需要先导入实现AMD的库后才能正常使用
3. UMD 通用模块定义
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD。注册为匿名模块
define(['moduleB'], factory);
} else if (typeof module === 'object' && module.exports) { // Node。不支持严格CommonJS
// 但可以在 Node 这样支持 module.exports 的
// 类 CommonJS 环境下使用
module.exports = factory(require(' moduleB '));
} else {
// 浏览器全局上下文(root 是 window) root.returnExports = factory(root. moduleB);
}}(this, function (moduleB) {
// 以某种方式使用moduleB
// 将返回值作为模块的导出
// 这个例子返回了一个对象
// 但是模块也可以返回函数作为导出值 return {};
}));
4.ES6模块
与传统脚本不同,所有模块都会像