Webpack原理整理(一)模块化原理

演示项目样例介绍

        这次来介绍下webpack模块化的原理,这次以commonJS模块化为例,先来看看项目的目录结构是怎样的。

         我们再来看看主要的内容,项目的内容非常简单,在index.js中用commonJS模块引入的方法,引入了一个js文件夹下common.js导出的 mul 乘法函数。

进行打包,查看模块化原理        

        我们进行npm run build打包(package.json)script中的build字段要改为webpack打包哦。但是我们打包后的代码会默认的进行一个压缩和丑化。我们可以在我们webpack.config.js文件中进行source-map的设置。

module.exports = {
    mode: 'development',
    entry: './src/index.js',
    devtool: 'source-map',
}

        它能够帮助我们将压缩和丑化的代码映射回原来的代码。这时候我们就可以到打包后的文件中查看源码进行学习了。

        源码中有很多备注和格式复杂,我将一些不必要的东西删除,配合注释整理如下,新手也能很容易看懂。

//将模块引用的信息存储在一个对象中
//key为路径信息,value为模块内容封装的函数
var __webpack_modules__ = {
  "./src/js/common.js":
    (function (module) {
      const mul = (n1, n2) => {
        return n1 * n2
      }
      module.exports = {
        mul
      }
    })
}

//用作缓存的一个对象
var __webpack_module_cache__ = {};

//获取模块内容的函数,moduleId为对象引用的路径
function __webpack_require__(moduleId) {
  //先去缓存对象中查询
  var cachedModule = __webpack_module_cache__[moduleId];
  //如果缓存命中,cachedModule不为undefined,直接返回内容
  if (cachedModule !== undefined) {
    return cachedModule.exports;
  }
  //定义一个含有exports属性的对象,同时缓存起来
  var module = __webpack_module_cache__[moduleId] = {
    exports: {}
  };
  //去储存模块引用信息的对象中查找
  //第一个参数module为上一步注册的对象
  //其中的exports用来接收模块中module.export语法导出的内容,这也是为什么要创建这么个对象
  //后两个参数在这个简单的例子中,用不上,我们主要理解模块化的原理
  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
  //返回内容
  return module.exports;
}

//!function(){}()是一个立即执行的一个语法,这也是这个打包程序的入口
!function () {
  //调用__webpack_require__函数,传入引用路径获取模块内容
  const { mul } = __webpack_require__("./src/js/common.js");
  console.log(mul(10, 20));
}();

        这就是webpack中commonJS模块化的一个原理啦,我上面注释解释的很详细啦。最后再附上ES6模块化打包的代码,我就不注释了,也不难的,可以试着读一读。

 

"use strict";
var __webpack_modules__ = {
  "./src/js/main.js":
    (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
      __webpack_require__.r(__webpack_exports__);
      __webpack_require__.d(__webpack_exports__, {
        "sum": function () { return sum; }
      });
      const sum = (n1, n2) => {
        return n1 + n2
      }
    })
}
var __webpack_module_cache__ = {};
function __webpack_require__(moduleId) {
  var cachedModule = __webpack_module_cache__[moduleId];
  if (cachedModule !== undefined) {
    return cachedModule.exports;
  }
  var module = __webpack_module_cache__[moduleId] = {
    exports: {}
  };
  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
  return module.exports;
}

!function () {
  __webpack_require__.d = function (exports, definition) {
    for (var key in definition) {
      if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
        Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
      }
    }
  };
}();

!function () {
  __webpack_require__.o = function (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
}();

!function () {
  __webpack_require__.r = function (exports) {
    if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
      Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
    }
    Object.defineProperty(exports, '__esModule', { value: true });
  };
}();

var __webpack_exports__ = {};
!function () {
  __webpack_require__.r(__webpack_exports__);
  var _js_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/js/main.js");
  console.log((0, _js_main_js__WEBPACK_IMPORTED_MODULE_0__.sum)(10, 20));
}();

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值