两个问题
- 包体积过大
- 打包速度太慢
优化1 webpack.DllPlugin
能加快打包速度,减小自身业务代码打包后的体积,但代码总体积(包含了第三方库)反而增大
项目中我们要将第三方库的代码单独打包,一般采用的方式是 webpack.optimize.CommonsChunkPlugin 这个插件。
1 | entry: { |
然而,用这种方式,每次我们重新构建代码时,vendor 的代码都要重新构建,从而使得构建的速度变慢。
webpack.DllPlugin 就可以解决这个问题,将第三方库事先编译为dll库,之后构建项目自身源码时,就不许要重新构建dll库中的代码。
首先,我们需要编写 webpack.dll.config.js 。
1 | const path = require('path'); |
其实,webpack 中的插件也都可以用在 webpack.dll 配置文件中。
执行 webpack --config webpack.dll.config.js
后,即可在 build 目录下找到生成的 dll bundle 和对应的 manifest 文件。
1 | > webpack --config webpack.dll.config.js |
然后,我们在 webpack.config.js 中配置 DLLReferencePlugin 插件。
1 | plugins: [ |
在 html 中,需要手动引入 dll 库
1 | <script src="/build/vendor.dll.js"></script> |
性能对比
首次构建:(build)
采用 CommonsChunkPlugin :
1 | Hash: 6ade5ef99f806b597685 |
采用 DllPlugin :
1 | Hash: 6f2755df167fdbf28a55 |
可以看到,用 DllPlugin 能比 CommonsChunkPlugin 约5s。这里的例子是一个多页面构建的例子。
注意,此处我们虽然看到 DllPlugin 打包出来的文件要比 CommonsChunkPlugin 的小,但其实是我们把第三方库提取到了 vendor.dll.js 中的原因,加上 vendor.dll.js 中的文件,DllPlugin 打包总文件体积更大。
模块热加载(rebuild)
采用 CommonsChunkPlugin :
1 | Hash: d8187730060863aecaad |
采用 DllPlugin :
1 | Hash: ca95bad33ad492f0a11b |
追求极致体验,dll 值得拥有。
另外还需注意到的一点是,antd 这个包非常大,大概有 2.6m,用 dll 的方式,就一次把整个antd 的包都打入 vendor.dll.js 中,使得 vendor.dll.js 非常大。这在开发环境时,为了追求打包速度,可以不考虑包大小。在生产环境下,建议还是采用 antd 推荐的 babel 插件,做按需加载处理,从而减小包的总大小
优化2 HappyPack
配置:
1 | const HappyPack = require('happypack'); |
采用 happypack 能进一步将构建时间从10s提升至5s。
以上两个优化都是优化了构建速度,然而并没能减小代码编译后包的体积大小,这是以后需要继续探索改进的地方。
参考文档:
- 开发工具心得:如何 10 倍提高你的 Webpack 构建效率
- webpack使用优化(基本篇)
- webpack使用优化(react篇)
- webpack 的 dll 功能
- 彻底解决Webpack打包性能问题
- 使用 webpack + react + redux + es6 开发组件化前端项目
- happypack github
- webpack 2.1 beta20 + happypack 多线程