webpack模块化打包源码浅读

要阅读webpack打包后的代码,要在webpack配置文件中设置

mode: 'development', // 默认为 production,会对代码进行压缩丑化,不利于阅读
devtool: 'source-map'  // 开发环境下默认为 'eval' ,部分代码会被 eval 函数包裹,不利于阅读,eval包裹函数的目的是还原报错信息

1.CommonJS 打包后源码解读

// 定义了一个对象
// 模块的路径作为 key,函数作为 value
var __webpack_modules__ = ({
  "./src/js/formate.js":
    (function (module) {

      const dateFormate = (date) => {
        return '2020-12-12';
      }

      const priceFormate = (price) => {
        return '100.00';
      }

      // 对 __webpack_require__ 函数的 module 对象的 exports属性进行赋值
      module.exports = {
        dateFormate,
        priceFormate
      }
    })
});

  // 定义一个对象,用于加载模块的缓存
  var __webpack_module_cache__ = {};

  // 是一个函数,当我们加载一个模块时,都会通过这个函数来加载
  function __webpack_require__(moduleId) {
    /** 1.判断缓存中是否已加载过 */
    var cachedModule = __webpack_module_cache__[moduleId]; 
    if (cachedModule !== undefined) { // 缓存已加载过
      return cachedModule.exports;
    }

    /**2.
     * 对象的连续赋值,这里是把模块添加进缓存,并赋值给 module ,赋值了同一个对象
     * 这里 module 和  __webpack_module_cache__[moduleId] 指向同一个内存地址,更改一个,另一个也会被更改
     **/
    var module = __webpack_module_cache__[moduleId] = { 
      exports: {}
    };

    /** 3.开始加载执行模块 */
    __webpack_modules__[moduleId](module, module.exports, __webpack_require__);

    return module.exports; // 返回了一个赋值后的对象
  }

  var __webpack_exports__ = {};

  // 具体执行代码
  !function () {
    const { dateFormate, priceFormate } = __webpack_require__("./src/js/formate.js"); // 执行上面的加载函数,解构拿到数据

    console.log(dateFormate('abc'));
    console.log(priceFormate('abc'));
  }();

2. ES Module 打包后源码解读

// ESModule 相比 CommonJS,多做了一层代理,做了代理之后一些语法就能刻意的不被允许

// 定义了一个对象——模块映射
var __webpack_modules__ = ({
  "./src/js/math.js":
    (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) {

      __webpack_require__.r(__webpack_exports__); // 调用 r 的目的是记录是一个 ESModule:__esModule:true
      
      // 调用 d 的目的是:给 exports 设置代理为 definition
      // exports 对象中本身没有对应的函数,只有调用 get 的时候去取
      __webpack_require__.d(__webpack_exports__, { 
        "sum": function () { return sum; },
        "mul": function () { return mul; }
      });
      const sum = (num1, num2) => {
        return num1 + num2;
      }

      const mul = (num1, num2) => {
        return num1 * num2;
      }
    })
});

// webpack 模块缓存
var __webpack_module_cache__ = {};

// require函数的实现
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,值是一个函数
  __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,值是一个函数,判断是否有该属性
  __webpack_require__.o = function (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
}();

!function () {
  // 给 __webpack_require__ 函数对象添加一个属性:r,值是一个函数
  __webpack_require__.r = function (exports) {
    if (typeof Symbol !== 'undefined' && Symbol.toStringTag) { // 判断是否支持 Symbol
      Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); // 增加一个 Symbol.toStringTag 属性,表示是一个模块
    }
    Object.defineProperty(exports, '__esModule', { value: true }); // 在 exports 对象中增加一个 __esModule 属性,值为 true,记录是一个 ESModule
  };
}();

var __webpack_exports__ = {};
!function () {
  var _js_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/js/math.js");

  // 调用代理
  console.log((0, _js_math__WEBPACK_IMPORTED_MODULE_0__.mul)(20, 30))
  console.log((0, _js_math__WEBPACK_IMPORTED_MODULE_0__.sum)(20, 30))
}();

3.CommonJS 和 ESModule 相互导入

var __webpack_modules__ = ({

  "./src/js/formate.js": (function (module) {

    const dateFormate = (date) => {
      return '2020-12-12';
    }

    const priceFormate = (price) => {
      return '100.00';
    }

    module.exports = {
      dateFormate,
      priceFormate
    }

  }),
  "./src/js/math.js": (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) {

    "use strict";
    __webpack_require__.r(__webpack_exports__);
    __webpack_require__.d(__webpack_exports__, {
      "sum": function () { return sum; },
      "mul": function () { return mul; }
    });
    const sum = (num1, num2) => {
      return num1 + num2;
    }

    const mul = (num1, num2) => {
      return num1 * num2;
    }

  })

});


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__.n = function (module) {
    var getter = module && module.__esModule ?
      function () { return module['default']; } :
      function () { return module; };
    __webpack_require__.d(getter, { a: getter });
    return getter;
  };
}();

!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 () {
  "use strict";
  __webpack_require__.r(__webpack_exports__);
  var _js_formate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/js/formate.js");
  var _js_formate__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(_js_formate__WEBPACK_IMPORTED_MODULE_0__);

  const math = __webpack_require__("./src/js/math.js");
  console.log(math.mul(20, 30))
  console.log(math.sum(20, 30))



  console.log(_js_formate__WEBPACK_IMPORTED_MODULE_0___default().dateFormate('abc'))
  console.log(_js_formate__WEBPACK_IMPORTED_MODULE_0___default().priceFormate('abc'))
}();
;

4.总结,webpack如何对模块化进行支持?

webpack 封装了多个函数,并把一个个模块放到了对象里面进行管理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容