理解 webpack編譯后的文件

以webpack@4.46.0 官網(wǎng)首頁的代碼為例,分析webpack編譯為web環(huán)境的代碼(webpack默認構(gòu)建目標為web)
總觀倔丈,編譯后的代碼為立即執(zhí)行函數(shù)


立即執(zhí)行函數(shù)

函數(shù)的參數(shù)為對象需五,對象的key就是兩個文件的相對路徑警儒,value為函數(shù)index.js 跟bar.js放在eval內(nèi),為了方便閱讀把eval中的函數(shù)拿出來

{
  "./src/bar.js": function barWrapper(
    module,
    __webpack_exports__,
    __webpack_require__
  ) {
    __webpack_require__.r(__webpack_exports__);
    __webpack_require__.d(__webpack_exports__, "default", function () { // 將bar函數(shù)掛載到__webpack_require__中定義的exports對象上蜀铲,從而保證被調(diào)用模塊可以拿到bar函數(shù)
      return bar;
    });
    function bar() {
      console.info("xx");
    }
  },
  "./src/index.js": function indexWrapper(
    module,
    __webpack_exports__,
    __webpack_require__
  ) {
    __webpack_require__.r(__webpack_exports__);
    var _bar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/bar.js");
    Object(_bar__WEBPACK_IMPORTED_MODULE_0__["default"])();
  },
};

__webpack_require__的定義

  function __webpack_require__(moduleId) {
    // Check if module is in cache
    if (installedModules[moduleId]) {
      return installedModules[moduleId].exports;
    } // Create a new module (and put it into the cache)
    var module = (installedModules[moduleId] = {
      i: moduleId,
      l: false,
      exports: {}, // 定義exports空對象
    }); // Execute the module function

    modules[moduleId].call(
      module.exports,
      module,
      module.exports, // 將exports
      __webpack_require__
    ); // Flag the module as loaded

    module.l = true; // Return the exports of the module

    return module.exports; // 返回exports對象
  } // expose the modules object (__webpack_modules__)

__webpack_require__.d 用來在exports對象上定義屬性

  __webpack_require__.d = function (exports, name, getter) {
    if (!__webpack_require__.o(exports, name)) {
      Object.defineProperty(exports, name, {
        enumerable: true,
        get: getter,
      });
    }
  }; // define __esModule on exports

exports 在__webpack_require__函數(shù)中生成变姨,每執(zhí)行一次__webpack_require__函數(shù)也就是用__webpack_require__調(diào)用一次模塊厌丑,exports都是新的對象(即__webpack_exports__

總結(jié):
__webpack_require__函數(shù)中定義exports對象怒竿,根據(jù)moduleId去調(diào)用對應的模塊,將_webpack_require__函數(shù)傳入模塊耕驰,從而保證該模塊可以調(diào)用其他模塊,也將__webpack_exports__傳入模塊饭弓,從而將模塊中定義的函數(shù)變量掛載到__webpack_require__定義的exports對象中弟断,從而在調(diào)用__webpack_require__模塊的地方可以拿到被調(diào)用模塊內(nèi)定義的變量跟函數(shù)趴生。這么理解下來可以知道,__webpack_require__傳遞到每個模塊是必要的舍咖,但是為啥要將__webpack_exports__每個模塊,完全可以在每個模塊中定義一個對象返回出來排霉,這樣調(diào)用者就可以拿到被調(diào)用模塊的變量 函數(shù)了攻柠。不是很明白后裸,有清楚的微驶,可以告知

看完代碼也可以回答一個問題:webpack是怎樣實現(xiàn)模塊的依賴的?
將文件的相對路徑作為模塊的id 苟耻,通過最外層的立即執(zhí)行函數(shù)避免模塊內(nèi)變量污染全局扶檐,用_webpack_require__函數(shù)來實現(xiàn)模塊的相關引用款筑,每個模塊都是包裹在函數(shù)里,通過傳入的__webpack_exports__對象將模塊內(nèi)的變量函數(shù)暴露給調(diào)用模塊杈湾,最終調(diào)用模塊就可以拿到被調(diào)用模塊內(nèi)部的函數(shù) 變量了攘须。說白了就是用函數(shù)從模擬模塊,將每個模塊的代碼包裹在一個函數(shù)內(nèi)叫挟,通過__webpack_exports__將其暴露給調(diào)用模塊限煞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抹恳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子署驻,更是在濱河造成了極大的恐慌奋献,老刑警劉巖健霹,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓶蚂,居然都是意外死亡糖埋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門窃这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞳别,“玉大人,你說我怎么就攤上這事杭攻∷盍玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵馆铁,是天一觀的道長。 經(jīng)常有香客問我辣垒,道長乍构,這世上最難降的妖魔是什么哥遮? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任铜邮,我火速辦了婚禮松蒜,結(jié)果婚禮上召娜,老公的妹妹穿的比我還像新娘玖瘸。我一直安慰自己璃诀,他們只是感情好劣欢,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳算。 梳的紋絲不亂的頭發(fā)上华匾,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天有鹿,我揣著相機與錄音葱跋,去河邊找鬼稍味。 笑死模庐,一個胖子當著我的面吹牛赖欣,可吹牛的內(nèi)容都是我干的顶吮。 我是一名探鬼主播搏恤,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迈喉?” 一聲冷哼從身側(cè)響起挨摸,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熔掺,失蹤者是張志新(化名)和其女友劉穎瞬女,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报慕,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忿等。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逸尖,死狀恐怖冷溶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栋齿,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布疾就,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溅漾。R本人自食惡果不足惜添履,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞎饲。 院中可真熱鬧嗅战,春花似錦脚曾、人聲如沸珊泳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米罚。三九已至,卻和暖如春隘竭,著一層夾襖步出監(jiān)牢的瞬間尊剔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓邑蒋,卻偏偏與公主長得像钱慢,于是被迫代替她去往敵國和親束莫。 傳聞我的和親對象是個殘疾皇子策严,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容