原生的模块化
现代的 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)