webpack优化:使用 DllPlugin

用过 Windows 系统的人应该会经常看到以 .dll 为后缀的文件,这些文件称为动态链接库,在一个动态链接库中可以包含给其他模块调用的函数和数据。

要给 Web 项目构建接入动态链接库的思想,需要完成以下事情:

  1. 把网页依赖的基础模块抽离出来,打包到一个个单独的动态链接库中去。一个动态链接库中可以包含多个模块。
  2. 当需要导入的模块存在于某个动态链接库中时,这个模块不能被再次被打包,而是去动态链接库中获取。
  3. 页面依赖的所有动态链接库需要被加载。

打包后生成的文件包括:

动态链接库文件中包含了大量模块的代码,这些模块存放在一个数组里,用数组的索引号作为 ID。 并且还通过 _dll_react 变量把自己暴露在了全局中,也就是可以通过 window._dll_react 可以访问到它里面包含的模块。

var _dll_react = (function(modules) {
     
  // ... 此处省略 webpackBootstrap 函数代码
}([
  function(module, exports, __webpack_require__) {
     
    // 模块 ID 为 0 的模块对应的代码
  },
  function(module, exports, __webpack_require__) {
     
    // 模块 ID 为 1 的模块对应的代码
  },
  // ... 此处省略剩下的模块对应的代码 
]));

manifest.json 文件清楚地描述了与其对应的 dll.js 文件中包含了哪些模块,以及每个模块的路径和 ID。

{
     
  // 描述该动态链接库文件暴露在全局的变量名称
  "name": "_dll_react",
  "content": {
     
    "./node_modules/process/browser.js": {
     
      "id": 0,
      "meta": {
     }
    },
    // ... 此处省略部分模块
    "./node_modules/react-dom/lib/ReactBrowserEventEmitter.js": {
     
      "id": 42,
      "meta": {
     }
    },
    "./node_modules/react/lib/lowPriorityWarning.js": {
     
      "id": 47,
      "meta": {
     }
    },
    // ... 此处省略部分模块
    "./node_modules/react-dom/lib/SyntheticTouchEvent.js": {
     
      "id": 210,
      "meta": {
     }
    },
    "./node_modules/react-dom/lib/SyntheticTransitionEvent.js": {
     
      "id": 211,
      "meta": {
     }
    },
  }
}

index.html 引入生成的这俩文件

<html>
<head>
  <meta charset="UTF-8">
head>
<body>
<div id="app">div>

<script src="./dist/polyfill.dll.js">script>
<script src="./dist/react.dll.js">script>

<script src="./dist/main.js">script>
body>
html>

你可能感兴趣的:(前端工程化)