[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模块

与传统脚本不同,所有模块都会像