问题
在前端项目中,我们希望第三方库(vendors
)和自己写的代码可以分开打包,vue-cli
也帮我们配好了webpack
的CommonsChunkPlugin
,但是在使用vue-cli
的打包的过程中有一些痛点。
一、verdors
缓存失效
改变了app.js的一点儿代码,verdors
打包的chunkhash
就会改变,导致每次发布,vendors
的缓存都会失效。这样增加了用户的流量消耗和首屏加载时间。
二、项目打包时间过长
在公司的台式机打包一次要花费30s,在个人笔记本上则需要花费40s之多。
为了解决上述问题,在网上查找资料后,找到使用 webpack dll
这个方案。
解决过程
一、编写dll配置文件
先贴上我的webpack.dll.conf.js
配置代码
1 | var path = require('path'); |
1、
entry
配置需要dll打包的库2、
module
配置处理对应文件类型的loader3、增加
webpack.DllPlugin
插件- 1、path:生成
mainfest.json
文件的绝对路径。mainfest.json
里面的内容为所有被打包到dll.js文件模块id的映射。 - 2、
name
:webpack
打包时mainfest.json包含的库的暴露出来的函数名名 - 3、
contenxt
(可选):引入manifest
文件的context
,默认为webpack
的context
- 1、path:生成
二、修改webpack.base.conf.js
在webpack.base.conf.js
的plugins
增加
1 | new webpack.DllReferencePlugin({ |
注:上面提到通过AssetsPlugin
和HtmlWebpackPlugin
给打包的dll.js各dll.css增加缓存机制
AssetsPlugin
生成的bundle-config.js
1 |
|
webpack.dev.conf.js
文件增加以下代码
1 | var bundleConfig = require("../public/bundle-config.json") |
在index.html
引入生成的dll.js,dll.css
1 | <link rel="stylesheet" href="./public/<%= htmlWebpackPlugin.options.libCssName %>"> |
上面为开发环境的配置,生产环境对应修改就可以了。
- 增加
build.dll.js
文件,
1 | var path = require('path'); |
- 然后在
package.json
script
中加上"build:dll": "node build/buildDll.js"
注:开发和生产环境都要首先使用 webpack运行
webpack.dll.conf.js
生成dll.js, dll.css, mainfest.json
文件,每次改变库文件也都需要重新执行一遍。
三、对比结果
优化前笔记本上打包时间为4000ms,
优化后笔记本打包时间为1800ms,同时也增加了这些库的缓存。