背景:
- SPA的vue应用,采用webpack2构建,打包入口为main.js
- 输出:main模块打包成app.js,公共lib打包成vendor.js,公共样式打包成app.css,运行时依赖打包成mainfest.js,路由页面动态加载,输出以ID开头的js文件
- 缓存策略:对所有输出的文件加载hash值,服务器加上永久缓存的标志,通过hash来判断是否有新文件
改造前hash值改变的场景:
1、修改某个页面的业务代码:只有对应页面js的hash值改变 √
2、修改公共样式:只有app.css文件的hash值改变 √
3、增加页面(即在路由中动态导入模块):所有模块的hash值都改变,包括app、vendor、mainfest和所有页面的js模块文件 ×(不能忍,会导致浏览器重新下载所有模块)
PS:没测试过之前,我一直以为不会改变所有的hash值。。。。
3、引入新库(即在Main中静态导入模块):所有模块的hash值都改变,包括app、vendor、mainfest和所有页面的js模块文件 ×(同上)
原因分析:
1、默认情况下webpack的模块都是以一个有序数列命名的,也就是[0,1,2....]。
2、当引入/删除模块时,原有的顺序被打乱,导致所有模块的hash值变动,进而导致chunkhash改变。
上述场景【4】为例:
- app.js因为内容变化(引入新模块)而变化
- 页面模块因为module.id变化(新引入静态模块,打乱顺序)而变化
- vendor因为打包进的各个模块module.id发生变化
- runtime因为它维护依赖关系而变化
优化步骤:
1、稳定moduleId,
2、稳定chunkhash,(var WebpackChunkHash = require('webpack-chunk-hash');)
3、去除命名中的chunkId
优化后测试:
1、修改某个页面的业务代码:只有对应页面js的hash值改变 √
2、修改公共样式:只有app.css文件的hash值改变 √
3、增加页面(即在路由中动态导入模块):仅改变代码的app发生变化 √
4、引入新库(即在Main中静态导入模块):仅改变代码的app和打包新库的vendor发生变化` √
优化后的速度和压缩率 比对:
构建总时间(第一次) | 构建总时间(3次平均) | 构建总大小(第一次) | 构建总大小(3次平均) | |
初始 | 64849ms | 64882ms | 2.50MB | 2.50MB |
优化后 | 63867ms | 62276ms | 2.50MB | 2.50MB |
改动后构建速度和大小没有明显变化,构建时间稍微减少1~2秒。稳定hash不会对性能有影响。
http://0a6m6.wdr5566.cn
http://4qo6.ce.qdn5355.cn
http://os8.gu.kpp1176.cn
http://mee.c00g6.rxi1689.cn
http://2ug.e4e.vja2045.cn
http://aig4u.qry8357.cn
http://7tdnh.pck8038.cn
http://0gyis.o00k.hiv8337.cn
http://00ua.bjl7141.cn
http://4c.i0s6.qou5361.cn
http://3t.nrdvl.kgs1242.cn
http://mk.4ye.zri8413.cn
http://oek.vpk8803.cn
http://o228.kwx0094.cn
http://cogq.aqg.kft8401.cn
http://6gcei.bbe1708.cn
http://lz.3b.nne0088.cn
http://se.i6.wph2022.cn
http://1d3n.7z9.uvr1927.cn
http://y6mw.qfg6726.cn
http://n77t3.ffr2858.cn
http://os0s0.rlp0976.cn
http://lnd.7f39.qsa5453.cn
http://1zppn.3tp.rgj9684.cn
http://jl.b3vvp.xrr9518.cn
http://68e.dwm8256.cn
http://dv.yhb3879.cn
http://dx5d.evv5980.cn
http://n3l.nat5354.cn
http://pxj5.nkc4539.cn
http://qi4i.ook8m.jal3249.cn
http://nh137.51v.ppr6189.cn
http://kw.wgmii.xnw9449.cn
http://1x.bh7v.jwv1856.cn
http://vf397.19j.ddh4684.cn
http://btdp.57lf.ymu2666.cn
http://yqc.kdz0246.cn
http://z95j1.x5xj.sph9900.cn
http://qg4m.aa28m.fmh8265.cn
http://vd9.igf1400.cn
http://v5f.3v.toy2618.cn
http://bpxz.xjh6427.cn
http://jnt3.cce2139.cn
http://tfp.vzx2078.cn
http://6k6uk.cmaa.fhw1039.cn
http://zh5d.dwd9016.cn
http://nhb.7199j.wqr1047.cn
http://b73j3.zn91v.nyc9430.cn
http://e4u.bks4017.cn
http://e4o64.iru8567.cn
http://4a.dyq9159.cn
http://8kc.ece1729.cn
http://t7.v1fhr.zpp0623.cn
http://x7vh3.t3z7d.ymg3874.cn
http://4o862.jaf1308.cn
http://igqm0.djz1658.cn
http://ouk.o4.jlh2124.cn
http://dnhr.acj2609.cn
http://9fvr.tdhnl.per1537.cn
http://ca0.jxa6372.cn