web前端前端技术博文技术文档

webpack之bundle文件分析

2017-04-23  本文已影响170人  婷楼沐熙

一、一个入口,一个文件

module.exports = {
  entry: './main.js',  // 一个入口
  output: {
    filename: 'bundle.js'
  }
};
document.write('<h1>Hello World</h1>');  // 一个文件
/******/ (function(modules) { // webpackBootstrap
/******/    // module缓存对象
/******/    var installedModules = {};
/******/
/******/    // require函数
/******/    function __webpack_require__(moduleId) {
/******/
/******/        // 检查module是否在缓存当中,若在,则返回exports对象
/******/        if(installedModules[moduleId]) {
/******/            return installedModules[moduleId].exports;
/******/        }
/******/        // 若不在,则以moduleId为key创建一个module,并放入缓存当中
/******/        var module = installedModules[moduleId] = {
/******/            i: moduleId,
/******/            l: false,
/******/            exports: {}
/******/        };
/******/
/******/        // 执行module函数
/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/        // 标志module已经加载
/******/        module.l = true;
/******/
/******/        // 返回module的导出模块
/******/        return module.exports;
/******/    }
/******/
/******/
/******/    // 暴露modules对象(__webpack_modules__)
/******/    __webpack_require__.m = modules;
/******/
/******/    // 暴露module缓存
/******/    __webpack_require__.c = installedModules;
/******/
/******/    // 认证和谐导入模块具有正确的上下文的函数
/******/    __webpack_require__.i = function(value) { return value; };
/******/
/******/    // 为和谐导入模块定义getter函数
/******/    __webpack_require__.d = function(exports, name, getter) {
/******/        if(!__webpack_require__.o(exports, name)) {
/******/            Object.defineProperty(exports, name, {
/******/                configurable: false,
/******/                enumerable: true,
/******/                get: getter
/******/            });
/******/        }
/******/    };
/******/
/******/    // 兼容非和谐模块的getDefaultExport函数
/******/    __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公共路径__webpack_public_path__
/******/    __webpack_require__.p = "";
/******/
/******/    // 读取入口模块,返回exports导出
/******/    return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {  // 模块ID为0
document.write('<h1>Hello World</h1>');
/***/ })
/******/ ]);
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

通过借用call来使函数的this始终为module本身,参数__webpack_require__是为了让modules有加载其他模块的能力。

二、一个入口,多个文件

module.exports = {
    entry: './main1.js',
    output: {
        filename: 'bundle.js'
    }
}
var main = require('./main2.js')
document.write('<h1>Hello World</h1>');
main.webpack();
exports.webpack = function() {
    document.write('<h2>Hello Webpack</h2>');
}
/******/ (function(modules) { // webpackBootstrap
/******/  这部分和上面的一样
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
exports.webpack = function() {
    document.write('<h2>Hello Webpack</h2>');
}
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
var main = __webpack_require__(0)
document.write('<h1>Hello World</h1>');
main.webpack();
/***/ })
/******/ ]);
index.html

三、两个入口,两个出口文件

main1包含inner1;main2包含inner1和inner2。

module.exports = {
  entry: {
    bundle1: './main1.js',
    bundle2: './main2.js'
  },
  output: {
    filename: '[name].js'
  }
};
var inner1 = require('./inner1.js');
inner1.inner1();
document.write("<h1>我是main1</h1>")
var inner1 = require('./inner1.js');
var inner2 = require('./inner2.js');
inner1.inner1();
inner2.inner2();
document.write("<h1>我是main2</h1>");
/******/ (function(modules) { // webpackBootstrap
/******/ 这部分和上面的一样
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = 2);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
exports.inner1 = function() {
    document.write('<h1>我是inner1</h1>');
}
/***/ }),
/* 1 */,
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
var inner1 = __webpack_require__(0);
inner1.inner1();
document.write("<h1>我是main1</h1>")
/***/ })
/******/ ]);
/******/ (function(modules) { // webpackBootstrap
/******/ 这部分和上面的一样
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = 3);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
exports.inner1 = function() {
    document.write('<h1>我是inner1</h1>');
}
/***/ }),
/* 1 */
/***/ (function(module, exports) {
exports.inner2 = function() {
    document.write('<h1>我是inner2</h1>');
}
/***/ }),
/* 2 */,
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
var inner1 = __webpack_require__(0);
var inner2 = __webpack_require__(1);
inner1.inner1();
inner2.inner2();
document.write("<h1>我是main2</h1>");
/***/ })
/******/ ]);
index.html
CommonsChunkPlugin初始化参数 含义
name 给这个包含公共代码的chunk命名(唯一标识)。
filename 如何命名打包后生产的js文件。
minChunks 公共代码的判断标准:某个js模块被多少个chunk加载了才算是公共代码。
chunks 表示需要在哪些chunk(也可以理解为webpack配置中entry的每一项)里寻找公共代码进行打包。不设置此参数则默认提取范围为所有的chunk。

四、总结

代码

上一篇 下一篇

猜你喜欢

热点阅读