模块化方案

模块化优点

  1. 可维护性:每个模块都是单独定义的,之间相互独立
  2. 命名空间:为了避免在JavaScript中的全局污染,我们通过模块化的方式利用函数作用域来构建命名空间
  3. 可复用

模块化方案

揭示模块模式(Reveaing Module)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var myRevealingModule = (function () {
var privateVar = “Ben Cherry”,
publicVar = “Hey there!”;

function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( “Paul Kinlan” );

优点:

  1. 可以在任何地方实现(没有库,不需要语言支持)。
  2. 可以在单个文件中定义多个模块。

缺点:

  1. 无法以编程方式导入模块(除非使用eval)。
  2. 需要手动处理依赖关系。
  3. 无法异步加载模块。
    4。 循环依赖可能很麻烦。
  4. 很难通过静态代码分析器进行分析。

CommonJS

CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作(require 和 exports)

优点:

  1. 简单:开发人员可以在不查看文档的情况下掌握概念。
  2. 集成了依赖管理:模块需要其他模块并按所需顺序加载。
  3. require可以在任何地方调用:模块可以通过编程方式加载。

缺点:

  1. 同步API使其不适合某些用途(客户端)。
  2. 每个模块一个文件。
  3. 浏览器需要加载程序库或转换。
  4. 模块没有构造函数(Node支持)。
  5. 很难进行静态代码分析。
    ##### AMD

AMD规范则是异步加载模块,允许指定回调函数,通过返回一个对象做为模块对象

优点:

  1. 异步加载(更好的启动时间)。
  2. 支持循环依赖。
  3. require和的兼容性exports。
  4. 完全整合了依赖管理。
  5. 如有必要,可以将模块拆分为多个文件。
  6. 支持构造函数。
  7. 插件支持(自定义加载步骤)。

缺点:

  1. 语法稍微复杂一些。
  2. 除非编译,否则需要加载程序库。
  3. 很难分析静态代码。
  4. 除了异步加载以外,AMD的另一个优点是你可以在模块里使用对象、函数、构造函数、字符串、JSON或者别的数据类型,而CommonJS只支持对象。
    UMD

统一模块定义(UMD:Universal Module Definition )就是将 AMD 和 CommonJS
合在一起的一种尝试,常见的做法是将CommonJS 语法包裹在兼容 AMD 的代码中。


ES6模块

支持JavaScript标准化的ECMA团队决定解决模块问题,
兼容同步和异步操作模式。