You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constwebpack=require('webpack')module.exports=functionwp(webpackConfig,env){// 对roadhog默认配置进行操作,比如:if(env==='production'){// ...do what you want}returnwebpackConfig}
相关仓库版本
问题描述
在 cpbs PC 端开发过程中,发现在经过
roadhog build --debug --analyze
命令打包之后的文件体积很大,具体内容如下所示:Compiled successfully in 25.6s. File sizes after gzip: 1.56 MB dist\index.js 1.27 MB dist\role.async.js 1.26 MB dist\privilegeAudit.async.js 1.23 MB dist\merchant.async.js 1.23 MB dist\agent.async.js 1.23 MB dist\merchantAudit.async.js 1.23 MB dist\agentAudit.async.js 1.23 MB dist\merchantReview.async.js 1.23 MB dist\agentReview.async.js 1.22 MB dist\user.async.js 1.18 MB dist\privilege.async.js 1.15 MB dist\transactionTotal.async.js 1.14 MB dist\statisticRemit.async.js 1.14 MB dist\statisticContrast.async.js 1.14 MB dist\transactionFlow.async.js 239.48 KB dist\login.async.js 17.2 KB dist\index.css 3.93 KB dist\error.async.js 1.7 KB dist\antd.js Analyze result is generated at dist/stats.html.
roadhog 将每个 model 都打包为一个单独的异步调用的 js 文件,这些文件即使在 gzip 压缩之后每个都需要平均 1M 的体积,在查看打包的具体内容 (
stats.html
)之后,发现体积过大的这些包都对一些共同使用到的组件进行了打包,而非引用模块部分的代码体积只有 300k 左右:经过分析,发现体积过大的原因有以下几点:
moment
模块被重复引用moment
模块引用了多余的本地化文件(约300k)antd
重复引用到的模块,如Table
、Button
、Form
等被各个模块重复打包,增加了体积解决思路
moment
、antd
部分使用频率高的模块)moment
模块没有使用到的语言包本文只讲述如何将公共模块抽离出来作为一个单独文件
解决过程
使用
CommonsChunkPlugin
将公用模块抽离到ventor.js
修改
roadhog
的配置文件:在根目录添加
webpack.config.js
,输入以下内容:至此,完成了将除
antd
之外的公用模块的抽离使用
CommonsChunkPlugin
将antd
的高频模块抽离到antd.js
修改
webpack.config.js
为:修改
index.html
为index.ejs
将
/src
目录下的文件进行如下调整:各个文件的配置为:
index.less
和router.js
的内容这里不赘述经过以上配置之后,index.ejs 能够根据
roadhog
里面的entry
配置自动引入所有入口文件。注意
CommonsChunkPlugin
配置里面的name
的数组顺序会影响到 entry 的引用顺序,如果出现webpack
未定义的错误,尝试改变这个属性值的顺序,因为CommonsChunkPlugin
是按照抽离顺序将webpack
的全局对象放到了entry
的最后一个入口文件里面。解决成果
经过上面的处理之后,打包的个文件体积为:
Compiled successfully in 21.1s. File sizes after gzip: 1.41 MB dist\antd.js 596.22 KB dist\index.js 556.53 KB dist\role.async.js 549.17 KB dist\privilegeAudit.async.js 526.47 KB dist\merchant.async.js 524.27 KB dist\agent.async.js 520.04 KB dist\merchantAudit.async.js 519.58 KB dist\agentAudit.async.js 516.8 KB dist\merchantReview.async.js 516.34 KB dist\agentReview.async.js 508.46 KB dist\user.async.js 474.88 KB dist\privilege.async.js 443.19 KB dist\transactionTotal.async.js 434.33 KB dist\statisticRemit.async.js 433.45 KB dist\statisticContrast.async.js 429.59 KB dist\transactionFlow.async.js 279.46 KB dist\vendor.js 112.09 KB dist\login.async.js 17.2 KB dist\index.css 3.92 KB dist\error.async.js Analyze result is generated at dist/stats.html.
可以看到被抽离了公用模块之后的各模块的体积基本减少到了 500k(具体抽离哪些模块还可以再精准研究),代码包的整体面积无疑是减少了很多的。
后续报道
发现在使用多入口方式的时候无法触发热更新,所以在开发环境之下还是使用旧有的打包方式,只在线上环境使用抽离式打包,解决方式就是在
webpack.config.js
里面添加一个环境变量判断,详细见上面代码。资料来源
roadhog - 支持 vendor 的配置 #370
The text was updated successfully, but these errors were encountered: