webpack模块化

61 阅读1分钟

1. 为什么需要模块化,有什么优点

若没有模块化,那么一个项目中不同人负责的不同模块可能会出现命名空间污染,若是大型项目,资源引入顺序将是一个巨大的问题

优点:

  • 解决命名冲突,代码易维护
  • 提高代码复用性
  • 多人协作不干扰
  • 灵活架构,方便组合、分解

2. 模块化本质

本质上创建了一个函数作用域,每个模块都通过函数封装在自己的局部环境中。

模块与模块之间通过require 接口进行通信,且不用通过暴露在全局环境。

3. webpack实现CommonJS的源码

//定义了一个对象,放模块映射  
var __webpack_modules__ = ({
    "./src/js/formate.js":
      (function (module) {
        const dateFormate = (date) => {
          return "2023-8-2";
        }
        const priceFormate = (price) => {
          return "100.00";
        }
​
        //将导出的变量放入module对象的export中
        module.exports = {
          dateFormate,
          priceFormate
        }
      })
  });
​
  //定义一个对象,作为加载模块的缓存
  var __webpack_module_cache__ = {};
​
  //加载模块时,通过该函数加载
  function __webpack_require__(moduleId) {
    //判断缓存是否已经加载过
    var cachedModule = __webpack_module_cache__[moduleId];
    if (cachedModule !== undefined) {
      return cachedModule.exports;
    }
​
    //给module变量和————__webpack_module_cache__[moduleId]赋值同一个对象
    var module = __webpack_module_cache__[moduleId] = {
      exports: {}
    };
​
    //3. 加载执行模块
    __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
​
    //4. 导出 module.exports {dateFormat:function priceFormate:function}
    return module.exports;
  }
​
  var __webpack_exports__ = {};
  !function () {
    const { dateFormate, priceFormate } = __webpack_require__("./src/js/formate.js")
    console.log(dateFormate("abc"));
    console.log(priceFormate("xyz"));
  }();

4. 模块化实现

  1. __webpack_modules__对象:用文件地址当作键名,存储不同的模块
  2. __webpack_module_cache__对象:存储模块导出对象
  3. __webpack_require__(moduleId):访问该模块以及该模块的导出对象,在访问之前会先判断__webpack_module_cache__对象中有没有该模块的导出对象,若有直接返回。

5. 图解

image-20230807125031270.png