Webpack 打包优化:使用外链与拆包模式 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kaolalicai
V2EX    Vue.js

Webpack 打包优化:使用外链与拆包模式

  •  
  •   kaolalicai
    Kalengo 2019-04-25 12:12:26 +08:00 2847 次点击
    这是一个创建于 2427 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一、发现问题

    这是一个基于 vue-cli 的管理后台项目,由于依赖较多,打包结果如下

    图片描述

    二、查找原因

    为什么 vendor 体积这么大?

    引用的库太多时,vendor 的体积会很大,借助 Webpack 的分析工具,看了下各个依赖的体积分布

    图片描述

    找到原因,是 Highcharts 和 Element-UI 占了较大体积,导致性能减弱。

    这两个库都提供了按需加载的功能,能有效减小体积,只是刚好这个管理后台项目依赖较多

    那么有办法控制打包的体积超过一定值时,分成多个文件打包吗?
    或者通过配置将部分库抽离出来,打包成另外的文件?

    三、解决方法

    (一) CDN 外链

    先把 Highcharts 和 Lodash 通过外链引入

    <script src="http://www.v2ex.com//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js" /> <script src="http://www.v2ex.com//cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.7/highstock.js" /> <script src="http://www.v2ex.com//cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.7/js/highcharts-more.js" /> <script src="http://www.v2ex.com//cdnjs.cloudflare.com/ajax/libs/highcharts/6.0.7/js/modules/treemap.js" /> 

    外链引入的资源就不能直接通过 import 来使用,但可以通过 Webpack 的 externals 特性来兼容

    import _ from 'lodash' import Highcharts from 'highcharts' console.log([_, Highcharts]) 

    这样配置 Webpack 就知道这两个依赖是外链全局的,不需要打包

    externals: { lodash: '_', highcharts: 'Highcharts' } 

    先看看去掉 Highcharts 和 Lodash 的效果

    图片描述

    vendor 也避免打包了这两个库

    图片描述

    这种方式适用于不常更新的第三方依赖,采用外链,Element-UI 由于常有新特性更新,需要保持最新版本,所以还是通过 npm 来管理

    内网部署的问题

    如若这个管理后台项目要部署到一个内网机器,访问不了外网,那要怎么解决呢?

    (二)拆开 vendor

    Webpack 默认是将依赖打包成一个文件,这样优点是减少资源请求数,但当依赖增多,体积增大,一个资源的加载速度就会减慢

    所以尝试去拆包

    new webpack.optimize.CommonsChunkPlugin({ name: 'charts', chunks: ['vendor'], minChunks: module => module.resource.indexOf('highcharts') > -1 }), new webpack.optimize.CommonsChunkPlugin({ name: 'utils', chunks: ['vendor'], minChunks: module => module.resource.indexOf('lodash') > -1 }), new webpack.optimize.CommonsChunkPlugin({ name: 'ui', chunks: ['vendor'], minChunks: module => module.resource.indexOf('element-ui') > -1 }) 

    拆包后的打包结果

    图片描述

    看看分析工具

    图片描述

    总结

    程序小哥实战经验得出:外链简单粗暴,而拆包可以配合浏览器缓存,在每次发布最小化更新资源,比较实用。

    程序小哥介绍

    考拉前端开发小哥 Bingo,潜心钻研小程序开发。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1574 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:25 PVG 00:25 LAX 08:25 JFK 11:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86