webpack的模塊化做了什么

還是自己寫(xiě)了一個(gè)小例子看看...

一、打包完的代碼簡(jiǎn)析

1彬向、基本配置

目錄

webpack配置如下

// webpack.config.js

const path = require('path');

module.exports = {
    mode: 'development',
    entry: './src/index.js',
    output: {
        filename: 'main.js',
        path: path.resolve(__dirname, 'dist'),
    },
};

2兼贡、打包完之后的代碼簡(jiǎn)析

src下隨便寫(xiě)點(diǎn),打包出來(lái)的main.js是一個(gè)巨多*號(hào)的文件娃胆。

/******/ (function(modules) { // webpackBootstrap
/******/    // The module cache
/******/    var installedModules = {};
/******/
/******/    // The require function
/******/    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: {}
/******/        };
/******/
/******/        // Execute the module function
/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/        // Flag the module as loaded
/******/        module.l = true;
/******/
/******/        // Return the exports of the module
/******/        return module.exports;
/******/    }
/******/
/******/
/******/    // expose the modules object (__webpack_modules__)
/******/    __webpack_require__.m = modules;
/******/
/******/    // expose the module cache
/******/    __webpack_require__.c = installedModules;
/******/
/******/    // define getter function for harmony 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
/******/    __webpack_require__.r = function(exports) {
/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/        }
/******/        Object.defineProperty(exports, '__esModule', { value: true });
/******/    };
/******/
/******/    // create a fake namespace object
/******/    // mode & 1: value is a module id, require it
/******/    // mode & 2: merge all properties of value into the ns
/******/    // mode & 4: return value when already ns object
/******/    // mode & 8|1: behave like require
/******/    __webpack_require__.t = function(value, mode) {
/******/        if(mode & 1) value = __webpack_require__(value);
/******/        if(mode & 8) return value;
/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/        var ns = Object.create(null);
/******/        __webpack_require__.r(ns);
/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/        return ns;
/******/    };
/******/
/******/    // getDefaultExport function for compatibility with non-harmony modules
/******/    __webpack_require__.n = function(module) {
/******/        var getter = module && module.__esModule ?
/******/            function getDefault() { return module['default']; } :
/******/            function getModuleExports() { return module; };
/******/        __webpack_require__.d(getter, 'a', getter);
/******/        return getter;
/******/    };
/******/
/******/    // Object.prototype.hasOwnProperty.call
/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/    // __webpack_public_path__
/******/    __webpack_require__.p = "";
/******/
/******/
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
/************************************************************************/
/******/ ({

/***/ "./src/a.js":
/*!******************!*\
  !*** ./src/a.js ***!
  \******************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ('333');\n\n//# sourceURL=webpack:///./src/a.js?");

/***/ }),

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sayHi; });\nconst a = __webpack_require__(/*! ./a.js */ \"./src/a.js\")\nconsole.log('a', a);\n\nfunction sayHi() {\n    console.log('hi');\n}\n\n\n//# sourceURL=webpack:///./src/index.js?");

/***/ })

/******/ });

簡(jiǎn)單看遍希,其實(shí)是一個(gè)自執(zhí)行函數(shù)

(function(modules) {
    函數(shù)體
}) (入?yún)?
(1)函數(shù)體

函數(shù)體先定義了 __ webpack_require __ 函數(shù),然后返回了 __ webpack_require __ 這個(gè)函數(shù)里烦,并且將入口模塊作為入?yún)鹘o它凿蒜。

__ webpack_require __ 類(lèi)似于import或者require禁谦,并且有緩存功能。
下面是部分截取废封。

/******/    // The module cache 模塊緩存
/******/    var installedModules = {};
/******/
/******/    // The require function
/******/    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) 新建一個(gè)module并放入緩存
/******/        var module = installedModules[moduleId] = {
/******/            i: moduleId,
/******/            l: false,
/******/            exports: {}
/******/        };
/******/
/******/        // Execute the module function  執(zhí)行module的方法
/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/        // Flag the module as loaded 將module的緩存flag變成true
/******/        module.l = true;
/******/
/******/        // Return the exports of the module 返回module的exports屬性
/******/        return module.exports;
/******/    }
............
............
............
/******/      // Load entry module and return exports 加載入口模塊并且返回exports屬性
/******/    return __webpack_require__(__webpack_require__.s = "./src/index.js");

關(guān)鍵在最后2行

/******/ // Load entry module and return exports 加載入口模塊并且返回exports屬性
/******/ return __ webpack_require ( webpack_require __.s = "./src/index.js");

這里加載了入口文件的module州泊,并且返回了它的exports。

(2)入?yún)?/h5>

函數(shù)的入?yún)⑹且粋€(gè)對(duì)象漂洋,里面的kv分別對(duì)應(yīng)的是模塊的路徑和模塊的函數(shù)遥皂。

/******/ ({

/***/ "./src/a.js":
/*!******************!*\
  !*** ./src/a.js ***!
  \******************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ('333');\n\n//# sourceURL=webpack:///./src/a.js?");

/***/ }),

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sayHi; });\nconst a = __webpack_require__(/*! ./a.js */ \"./src/a.js\")\nconsole.log('a', a);\n\nfunction sayHi() {\n    console.log('hi');\n}\n\n\n//# sourceURL=webpack:///./src/index.js?");

/***/ })

/******/ });

來(lái)看下傳參里的入口模塊的函數(shù)

/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return sayHi; });\nconst a = __webpack_require__(/*! ./a.js */ \"./src/a.js\")\nconsole.log('a', a);\n\nfunction sayHi() {\n    console.log('hi');\n}\n\n\n//# sourceURL=webpack:///./src/index.js?");

/***/ })

可以看到下面這句, __ webpack_require __ 又去加載了 a.js氮发。

const a = __ webpack_require __(/*! ./a.js */ "./src/a.js")

這個(gè)編譯后的main.js是不可以被其他模塊引用的渴肉,如果要做到,就得借助webpack的libraryTarget了爽冕。

2仇祭、output.libraryTarget

文檔解釋?zhuān)琹ibraryTarget和library是配合一起使用的。
栗子先把library設(shè)置成 'myLibraray'

// webpack.config.js
const path = require('path');

module.exports = {
    mode: 'development',
    entry: './src/index.js',
    output: {
        filename: 'main.js',
        path: path.resolve(__dirname, 'dist'),
        library: 'myLibrary',
    },
};
(1)libraryTarget默認(rèn)是 'var'
// main.js 

var myLibrary = .......入口文件的return
(2)libraryTarget:commonjs
// main.js 

exports["myLibrary"] = ......入口文件的return
(3)libraryTarget:commonjs2
// main.js 

module.exports = ......入口文件的return
(4)libraryTarget:this
// main.js 

this["myLibrary"] = ......入口文件的return
(5)libraryTarget:window
// main.js 

window["myLibrary"] = ......入口文件的return

所以一些庫(kù)是通過(guò)設(shè)置libraryTarget來(lái)做到被其他模塊引用颈畸。

二乌奇、tree shaking

to be continued

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眯娱,隨后出現(xiàn)的幾起案子礁苗,更是在濱河造成了極大的恐慌,老刑警劉巖徙缴,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试伙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡于样,警方通過(guò)查閱死者的電腦和手機(jī)疏叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穿剖,“玉大人蚤蔓,你說(shuō)我怎么就攤上這事『啵” “怎么了秀又?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贬芥。 經(jīng)常有香客問(wèn)我吐辙,道長(zhǎng),這世上最難降的妖魔是什么蘸劈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任昏苏,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捷雕。我一直安慰自己,他們只是感情好壹甥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布救巷。 她就那樣靜靜地躺著,像睡著了一般句柠。 火紅的嫁衣襯著肌膚如雪浦译。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天溯职,我揣著相機(jī)與錄音精盅,去河邊找鬼。 笑死谜酒,一個(gè)胖子當(dāng)著我的面吹牛叹俏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播僻族,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粘驰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了述么?” 一聲冷哼從身側(cè)響起蝌数,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎度秘,沒(méi)想到半個(gè)月后顶伞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唆貌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侨赡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊壹。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稠茂,死狀恐怖睬关,靈堂內(nèi)的尸體忽然破棺而出电爹,到底是詐尸還是另有隱情丐箩,我是刑警寧澤屎勘,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布丑慎,位于F島的核電站立哑,受9級(jí)特大地震影響铛绰,放射性物質(zhì)發(fā)生泄漏捂掰。R本人自食惡果不足惜曾沈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一姐帚、第九天 我趴在偏房一處隱蔽的房頂上張望罐旗。 院中可真熱鬧九秀,春花似錦鼓蜒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)或详。三九已至郭计,卻和暖如春霸琴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昭伸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工梧乘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庐杨。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像填渠,于是被迫代替她去往敵國(guó)和親弦聂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345