前言
webpack 打包速度一直以来是个问题,之前用 webpack 打包 Angular 要等个几分钟,所以需要优化一下打包速度。
前期准备
我们需要准备一个很大的项目,去网上找几个 UI 库安装下载就差不多了
                
HappyPack
我们就看一下 HappyPack 是怎么配置的。
首先,HappyPack 是个插件来的,所以我们要在 webpack 的 plugins 里面 new 一个:
                
happyThreadPool 就是要用多少子进程来进行编译,我们在文件头声明一个变量1
var happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
这个就是获取操作系统的 cpu。
然后我们就把原来的 loader 替换:
                前面是一样的,后面的 id 就是指定的 HappyPack 配置,也就是说我们可以有多个配置,只需要改变 id 和 loader 就能启用 HappyPack。
现在,我们重新 build,看一下打包要花多久:
                
快了 10 秒,效果还不错。
DllPlugin
那我们再用另外一个插件 DllPlugin , 它要和 DllReferencePlugin 配合使用。前者是用来打包 dll.js,后者是用在打包主流程时引用刚才的 dll.js 的。Dll 是动态链接库的意思,实际上就是将这些 npm 打包生成一个 JSON 文件,这个文件里包含了 npm 包的路径对应信息。
需要新建一个文件夹 webpack.dll.conf.js 来使用第一个插件 DllPlugin:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30const webpack = require('webpack');
const path = require('path');
module.exports = {
    output: {
        // 将会生成 lib.js文件
        path: path.resolve(__dirname, '../statics/'),
        filename: '[name].js',
        library: '[name]',
    },
    entry: {
        "lib": [
          // ...其它库
          'vue/dist/vue.esm.js',
          'echarts',
          'element-ui',
          'iview',
          'vue-material',
          'vuetify',
        ],
    },
    plugins: [
        new webpack.DllPlugin({
            // 生成的映射关系文件
            path: path.resolve(__dirname, '../statics/[name]-mainfest.json'),
            name: '[name]',
            context: __dirname,// 执行的上下文环境,对之后DllReferencePlugin有用
        }), 
    ],
};
在 package.json 里面写个脚本:1
2
3
4
5
6"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "build": "node build/build.js",
  "build-dll": "webpack --config build/webpack.dll.conf.js"
},
执行 npm run build-dll,就会生成下面的文件:
                
第一步完成,然后我们在 webpack.prod.conf.js 里面添加我们的第二个插件 DllReferencePlugin :1
2
3
4
5
6plugins: [
  new webpack.DllReferencePlugin({
    context: __dirname,
    manifest: require('../statics/lib-mainfest.json') // 指向这个json
  }),
]
然后就可以啦,让我们试试添加插件之后的打包速度:
                
变成 30 秒了, HappyPack 和 DllPlugin 一起用比什么都没有快了一倍 !减少构建时间能让我们更快的开发调试,还是挺有用的。