模块化
前端模块化是指将代码分解成独立的、可复用的模块,以便更好地组织、维护和扩展代码
发展历史
在没有CommonJS(CMJ)和ES Module(ESM)等模块化规范前,我们想要达到模块化的效果有以下几种方式
全局函数
一个函数就是一个模块
<script>
  function m1() {}
  function m2() {}
</script>缺点
- 污染了全局变量 
- 无法保证模块之间不会发生命名冲突 
命名空间模式
一个对象就是一个模块
在全局对象下新建一个对象属性来存放模块,需要手动保证模块命名不冲突,模块内的属性就不会冲突
<script>
  var __Module = {
    sum: 0,
    f1: function () {},
    f2: function () {},
  };
</script>缺点
- 会暴露所有模块成员 
- 内部状态可能会被改写 ( - window.__Module.属性名可以直接修改模块)
立即执行函数(IIFE)
通过IIFE(Immediately Invoked Function Expression),利用闭包来创建私有变量
<script>
  var module1 = (function () {
    var _sum = 0; // 私有变量
    var foo1 = function () {};
    var foo2 = function () {};
    return {
      foo1: foo1,
      foo2: foo2,
    };
  })();
  /// 此时外部无法访问 module1._sum
</script>虽然能解决全局污染和私有性的问题,但是和前两种方式一样存在硬伤:
- 代码阅读维护困难 
- 没有完善的依赖管理、模块加载机制 
