webpack打包后文件分析

平常遇到喜欢的页面总喜欢拿来欣赏一番,今天就以webpack+vue的项目为例分析一下打包后的源码。
环境:
webpack4.16
vue2.5.16

为了方便理解,先使用webpack打一个最简单的包(未使用vue),下面是混淆压缩前的伪代码

(function (modules) {
  var installedModules = {} // 缓存模块

   // 处理AMD commonjs  ESModule
  function __webpack_require__(moduleId)() {  ...  return module.exports}
  __webpack_require__.m
  __webpack_require__.c
  __webpack_require__.d
  __webpack_require__.r
  __webpack_require__.n
  __webpack_require__.o
  __webpack_require__.p

  return __webpack_require__(__webpack_require__.s = "./src/index.js")
})(obj)

var obj = {

  // 入口js处理
  './src/index.js': (function(module, __webpack_exports__, __webpack_require__) {"use strict";
    eval(`__webpack_require__.r(__webpack_exports__);\n/* harmony import */
    var _js_home__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./js/home */ \"./src/js/home.js\");\n/* harmony import */
    var _js_home__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_js_home__WEBPACK_IMPORTED_MODULE_0__);\n\r\n\r\n
    console.log('index.js')\n\n//# sourceURL=webpack:///./src/index.js?`);
  }),

  // 其他js处理
  './src/js/home.js': {
    (function (module, exports,__webpack_require__) {
      eval("console.log('home') \n\n//# sourceURL=webpack:///./src/js/home.js?")
    })
  }
}

从结果来看,文件由一个立即执行函数(IIFE)组成,IIFE内部是webpack用于模块处理的逻辑,不需要关心,真正的业务逻辑以参数的形式传入,也就是obj,这个是我们需要重点关注的。
接下来是webpack+vue混淆压缩后的伪代码

!function(e){}([function(e, t, n){},function(e, t, n){},...])

通过和上一段代码对比,可以知道各个参数的含义

e: module  t:export  n:__webpack_require__

那么一个vue文件压缩后的是怎么样的,下面我从压缩文件中提取组成的代码片段



//-------------------template压缩前------------------
<div class="home">
  <img class="logo" src="../images/logo.png"/>
  <h1>hello VueDemo</h1>
</div>
//-------------------template压缩后------------------
function (e, t, n) { 
  "use strict";
  var r = function () {
      var e = this.$createElement;
      this._self._c;
      return this._m(0)
    },
    a = [function () {
      var e = this.$createElement,
        t = this._self._c || e;
      return t("div", {
        staticClass: "home"
      }, [t("img", {
        staticClass: "logo",
        attrs: {
          src: n(68)
        }
      }), this._v(" "), t("h1", [this._v("hello VueDemo")])])
    }];
  r._withStripped = !0, n.d(t, "a", function () {
    return r
  }), n.d(t, "b", function () {
    return a
  })
}
//n(68): images/logo.82b9c7.png
//function (e, t, n) {
//e.exports = n.p + "images/logo.82b9c7.png"
//}
//n(0): window    n(2): vue

// -------------------script压缩前------------------
export default {
  data() {
    return {
      name: 'home'
    }
  },
  mounted() {},
  methods: {},
  components: {}
}
// -------------------script压缩后------------------
function (e, t, n) {
  "use strict";
  Object.defineProperty(t, "__esModule", {
    value: !0
  });
  n(45);
  t.default = {
    data: function () {
      return {
        name: "home"
      }
    },
    mounted: function () {},
    methods: {},
    components: {}
  }
}

// -------------------style压缩前------------------
.home{font-size: 16px;text-align: center;}
.logo{width: 100px;margin: 50px;}
// -------------------style压缩后------------------
function (e, t, n) {
  var r = n(66);
  "string" == typeof r && (r = [
    [e.i, r, ""]
  ]), r.locals && (e.exports = r.locals);
  (0, n(10).default)("d1dbaf94", r, !1, {})
}
//n(66):
//.home[data-v-324fb87d] {font-size: 0.21333333rem;text-align: center;}
//.logo[data-v-324fb87d] {width: 1.33333333rem; margin: 0.66666667rem;}
//function (e, t, n) {
//(e.exports = n(11)(!1)).push([e.i, "\n.home[data-v-324fb87d] {\n  font-size: 0.21333333rem;\n  text-align: center;\n}\n.logo[data-v-324fb87d] {\n  width: 1.33333333rem;\n  margin: 0.66666667rem;\n}", ""])
//}

可以看到template模板中的t其实就是一个render函数,在render中构建一个vnode来描述原来DOM,之后如果修改template,vue就使用diff算法更新DOM。

Webpack打包配置文件是一个 JavaScript 文件,通常被命名为 webpack.config.js。该文件用于配置 Webpack打包规则和选项。 以下是一个示例的 webpack.config.js 文件的基本结构: ```javascript const path = require('path'); module.exports = { // 入口文件配置 entry: './src/index.js', // 输出文件配置 output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, // 模块加载器配置 module: { rules: [ // 加载器规则 ] }, // 插件配置 plugins: [ // 插件列表 ], // 其他配置选项 }; ``` 在上述配置文件中,可以根据需要进行以下配置: 1. 入口文件配置(entry):指定项目的入口文件。可以是单个文件路径,也可以是一个对象,用于多入口文件的配置。 2. 输出文件配置(output):指定打包后的输出文件的位置和名称。可以通过 path 属性指定输出路径,filename 属性指定输出文件名。 3. 模块加载器配置(module.rules):用于配置不同类型文件的加载器。可以通过 rules 数组中的每一项来指定对特定类型文件的处理规则,如使用 babel-loader 处理 JavaScript 文件,使用 style-loader 和 css-loader 处理 CSS 文件等。 4. 插件配置(plugins):用于配置 Webpack 插件。可以通过 plugins 数组中的每一项来添加或配置不同的插件,如 HtmlWebpackPlugin 用于生成 HTML 文件,CleanWebpackPlugin 用于清理输出目录等。 5. 其他配置选项:还有其他一些常用的配置选项,如 resolve 用于配置模块解析规则,devServer 用于配置开发服务器等。 根据项目的需求,可以在 webpack.config.js 中添加适当的配置来满足项目的打包需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值