Skip to content

原生的模块化

现代的 Web 应用中,JS 越来越庞大复杂, 然而 JS 一开始设计的就是简单轻量的脚本语言,没有原生的一些模块化支持,后来才有了Common JS AMD ,然后有了兼容处理的UMD,然后才有了ES Module。下面主要介绍原生的几种模块化实现方案, 以及模块间依赖的解决。

一个对象包裹

把模块写成一个对象,模块成员放到对象中 缺点:内部状态完全暴露,可被外部轻易改写。

封装私有变量

利用构造函数封装私有变量

通过构造函数的形式,把私有状态保存在内存中不被销毁,外部也无法更改。
但是违背了OOP的一些原则,构造函数和实例对象在数据上应该是分离的,这种方式,实例对象依赖构造函数相关内存中的一些私有状态。

js
function StringBuilder() {
  var buffer = [];
  this.add = function (str) {
     buffer.push(str);
  };
  this.toString = function () {
    return buffer.join('');
  };
}

const StrBuilder = new StringBuilder()

利用 IIFE 封装私有变量

通过立即执行函数表达式,把相关属性方法封装在一个作用域内,只返回需要暴露的成员

js
var module1 = (function () {
 var _state = 0;
 var m1 = function () {};
 var m2 = function () {};
 return {
  m1 : m1,
  m2 : m2
 };
})();

const mod = module1()

基于 IIFE 的模块依赖管理

当模块依赖于其他模块,或者只是依赖一个外部全局变量,都可以在 IIFE 中传入, 使得模块依赖关系明晰。

js

var myModule = (function($ , _){
    ...
    return {
        ...
    }
    // 或
    window.xxx = {
        ...
    }

})(jQuery, loadash)