我们还能在哪些方面进行webpack性能优化
我们做了啥
Bigo前端组计算平台前端组基于amis框架,参考之前的文章:https3A2F2Fgithub。com2Fbigofrontend2Fblog2Fissues2F17;有很好的研发效率提升,但是构建速度却很慢,亟需进行优化。优化之后达到了将webpack构建速度提升80左右的一个成绩,以下是优化前后的对比
团队做了3件事情来达到这样的一个效果:splitchunks进行公共模块优化optimization:{splitChunks:{chunks:all,cacheGroups:{vendorsa:{chunks:all,test:(mobxstatetreereactcolorreactdomroutersortablejsmobxreact),priority:100,name:vendorsreactmobx,},venodrb:{test:lodash,priority:100,name:vendorlodash,chunks:all},}}}external避免将比较大的第三方依赖打包到bundle中webpack。config。js:externals:〔{react:React,reactdom:ReactDOM,moment:moment,mobx:mobx,monacoeditor:monaco,echarts:echarts,jquery:jQuery,hls。js:hls,flv。js:flv,},function(context,request,callback){if(moment。。test(request)){returncallback(null,rootmoment);}if(tinymce。。test(request)){returncallback(null,roottinymce);}if(froalaeditor。。test(request)){returncallback(null,rootfroala);}if(echarts。。test(request)){returncallback(null,rootecharts);}继续下一步且不外部化引用callback();},〕index。html:对tsloader的优化:{test:。tsx?,use:〔{loader:tsloader,options:{transpileOnly:true}}〕,exclude:nodemodules},。。。plugins:〔newForkTsCheckerWebpackPlugin(),〕
基于这次优化做了功课,看了一些资料,看看还有哪些可以优化的地方。webpack是什么
官网的定义:
webpackisastaticmodulebundlerformodernJavaScriptapplications。Whenwebpackprocessesyourapplication,itinternallybuildsadependencygraphwhichmapseverymoduleyourprojectneedsandgeneratesoneormorebundles。
也就是说webpack是一个用于现代JavaScript应用程序的静态模块打包工具,从入口出发,找到入口文件所有的依赖,生成浏览器可以用的bundle文件。webpack的出现使得前端的工程化更加地丰富。从webpack在2013的第一次release(v1。0。0beta2)开始,至今已经有8、9年的历史了,是一个相当成熟的工具,其生态也比较完善,所以前端圈用webpack也是非常地广泛。版本
尽量用较新的版本,新版本相较之前都会有一定的性能提升和优化,包括Node和Webpack。要注意的是Node。jsv8。9。10v9。11。1ES6的Set和Map会有性能回退问题,现在LTS的node已经是v14。16。0,所以假设Node版本已经较新,并且用的是WP4(webpack4)。目前还不建议对求稳的或者已经很庞大的项目立即升级到WP5,其一是因为webpack生态里面并不一定所有的插件都能跟的上最新的版本,可能会出现兼容性的问题;其二由于webpack5还并未被广泛地应用,到新版本的稳定和成熟还是需要一定的时间,为避免不必要的bug,建议暂时使用webpack4。为什么要优化
对于开发者来说,每次在build的时候不希望花费较长的时间,优化构建速度能够减少开发成本;对于用户而言,优化bundle文件的数量和大小能减少用户的流失率,提升用户体验。所以webpack的性能优化是一个非常关键的技术手段。优化手段两个测量工具speedmeasurewebpackplugin(SMP),要对webpack的构建速度进行优化,得知道要优化的重点在哪里,而该插件则是帮助检查哪些地方需要进一步优化的工具。webpackbundleanalyzer,虽然webpack也有官方的分析工具,社区也有许多其他的工具可以参考,但是通过资料、技术分享以及项目经验,webpackbundleanalyzer用的还是不错的,它可以将bundle展示为交互式、可缩放的树状图形式,使用起来非常便捷。三个可优化阶段
webpack构建大概可分为loader解析依赖搜索打包等三个阶段,就这三个阶段我们分别展开阐述如何去优化。
loader解析:includeexclude,对于loader而言,不需要对项目中所有的文件进行文件转换,应将loader应用于最少数量的必要模块,常见的配置:{。。。,exclude:nodemodules}如果项目中用到了tsloader,那就要小心了,因为如果不做额外的配置,会发现构建速度是非常耗时的。原因是因为tsloader在每次构建的时候都会对所有文件进行类型检查,当项目越来越庞大,会发现构建速度越来越慢。这个时候需要设置transpileOnly:true来提高构建速度,该配置只处理编译而不做类型检查;然而类型检查是使用TypeScript的初衷,可以使用forktscheckerwebpackplugin插件来在单独的进程中做类型检查。那性能和类型检查都能cover到。如果使用的是babelloader,可以设置其cache相关的选项,比如cacheDirectory、cacheCompression等;cacheloader:利用文件的modifiertime来检查文件是否更新,如果没有更新则利用缓存的内容,是一个轻量级的比较。特点是在第一次构建的时候比较慢,后面的构建会快很多。但是用它也要特别注意,最好用在性能消耗比较昂贵的地方,否则基本没有什么效果。该loader已经被作者Archive了,因为webpack5内置了cache的相关配置,将来如果升级就不需要它了。使用cacheloader时要放在其他loader的前面。threadloader:也是应用于比较昂贵的地方,可以将打包任务划分多个node进程,把模块一次分配给这些进程,实现多进程构建。跟cacheloader一样也需要放到其他loader的前面。{。。。,use:〔threadloader,昂贵的loader(e。gbabelloader)〕,}最后一点是,尽量少用工具,因为每个loaderplugin都有其启动时间,不用就不会有性能问题啦。
依赖搜索:减少resolve。modules,resolve。extensions等中条目数量,因为IO操作比较消耗性能;基本上webpack对这些配置有默认值,比如resolve。modules为nodemodules,告诉webpack解析模块时应该搜索nodemodules目录;resolve。extensions默认值为〔。wasm,。mjs,。js,。json〕,如果用了TypeScript还是要配置一下的,extensions是说在引入模块时可以不需要带扩展:importFilefrom。。pathtofile;
打包:SmallerFastersplitChunks,本着小即是快的原则,尽量使chunk包越小越好。在webpack4之前,可以使用CommonsChunkPlugin来避免模块与模块之间的重复依赖,webpack4内置了optimization。splitChunks,可开箱即用。splitChunks有它默认的行为,不同的项目根据需求做不同的调整。可以设置不同的cacheGroup,拆分前必须共享模块的最小chunk数量等等,能最大程度地优化重复依赖的问题。一个简单的:splitChunks:{chunks:all,cacheGroups:{lodash:{test:lodash,priority:1,},}}externals,防止将某些import的包打包到bundle中,而是在运行时再去从外部获取这些扩展依赖。例如:externals:〔{moment:moment,}。。。〕
当然需要在index。html里面引入cdn依赖,否则在runtime无法找到相应的模块:。多环境
生产环境:生产环境关注与压缩bundle、更轻量的sourcemap等,建议不同环境写不同的配置,当然可以有共用的配置,利用webpackmerge可以实现配置共用;对于devTools,推荐使用sourceMap,相对于inlinesourcemap和evalcheapmodulesourcemap性能好一点;代码压缩,在WP5中内置了terserwebpackplugin,现在使用WP4的话,需要安装插件,这个插件功能非常强大,除了基本的压缩功能以外,还可以使用多进程并发构建,以及去除注释等功能;不带路径的配置,pathinfo会在bundle中包含模块信息的注释,但在庞大的项目中,会导致GC性能很差,应该关闭;
开发环境:同样地,生产环境有些配置也不适用于开发环境,比如TerserPlugin就不需要,因为在开发环境中压缩代码是没有意义的;devTools的最佳实践是evalcheapmodulesourcemap,我现在的项目比较轻量,但是也能看出对比:inlinesourcemap:5205msVSevalcheapmodulesourcemap:4744ms
虽然是不到1000ms的差距,苍蝇肉也是肉不是?而且将来代码量越来越庞大的时候,差距就更明显了。
当然还有其他的可以优化的方法,比如使用ESmodule,能更好地利用webpack的treeshaking功能;Dll,为更改不频繁的代码生成单独的编译结果,但却是一个配置比较复杂的过程;还有对图片的压缩等等。以上是对于webpack4性能优化基本的配置,期待webpack5成熟稳定的那一天。
2020款宝马3系M340ixDrive2020BMW3SeriesSedanM340ixDrive车身座位4门5人座性能数据374hp5500rpm51。0kgm1850rpm变速系统8速手自排能量消耗平均1……
太逗了!小哥坐路旁边玩手机,被路过的狗当成消防栓给尿了!我们有木有重视狗尿尿,嘿嘿,你可能木有这种嗜好,或许觉得它们的姿势很搞笑,可是不看不知道,其实狗子们真的不是随便尿,比方,找一根树,就很好:轮胎狗子:你不要偷偷的看……
支付宝发布通知规范服务商接入阿里巴巴全资收购美味不用等2020年,社会消费品零售总额391981亿元,餐饮收入39527亿1月18日国家统计局最新发布数据,2020年,社会消费品零售总额391981亿元,比上年下降3。9。其……
新能源小车遭两公交ampampquot夹击ampampquo众所周知,新能源汽车是未来十年内必然的趋势,然而新能源汽车的安全性,一直是消费者关注的重点,每当哪里有电动车自燃的情况发生,总能吸引不少视线。然而,最近有辆新能源车遭受两公交夹……
指尖上的方块飞傲M5迷你播放器评测玩惯了高端HIFI,有时候再回过头来体验入门级产品,还真别有一番品味。或许大多数烧友都有过一步步往上进阶发烧的经历,也会经常听到有人说:入坑怎能不交点学费。确实,HIFI发烧不……
双十一旗舰手机选购指南双十一的活动开启时间:天猫:10月20日10月31日预售定金支付11月01日11月03日预售尾款支付11月04日11月10日预售定金支付11月11……
为游戏而生的AIM引擎,达尔优A970精准度测试2021年1月,一直努力上进的达尔优发布全新有线游戏鼠标A970,距离暴风A960才6个月左右,这马不停蹄的更新速度。A970虽然不如A960的65g更加轻量化,但有新的KBS……
丧心病狂的反人类设计伤到你了吗?这些才配叫当代好设计设计改变了我们的生活,让我们生活的更舒适、健康,但是有些设计有时候也会让你哭笑不得,甚至是给人添堵,比如这些反人类设计:根本无法插进去的插座;让轮椅下楼梯的通道;……
月是故乡圆又是一年中秋节。都说近乡情怯,但对于因为疫情两年没有机会近乡的人来说,每逢佳节倍思亲似乎更能准确地表达此时此刻的心情。尤其对于沪漂、北漂来说,日复一日的在大都市努力地活着……
华为收购联智付,获取支付牌照,畅连上架,完善互联网生态众所周知,我国的移动支付领域一直是两强相争的局面,阿里的支付宝和腾讯的微信支付几乎垄断了整个市场,其他各大互联网企业虽然也先后推出自家的移动支付,比如京东支付、苏宁支付、美团支……
未开售先升值?FindX3获更新,完整解锁LTPO技术从近两年开始,很多安卓手机都用上了高刷新率屏幕,体验也在不断完善,给我们带来了全新的视觉享受。但不得不说,在享受着高刷屏的同时,我们也无可避免地要忍受高刷新率给续航带来的压力,……
H。266VVC能否后来居上?短视频风起、AI视频监控日趋普及、后疫情时代远程办公需求猛增,超高清视频无疑正在迎来广阔市场。而伴随着超高清视频时代的即将到来,产业链上下包括终端产品、显示面板、芯片等产……
好用的办公投影仪怎么选?与电视机相比,投影仪的使用更灵活。方便家庭娱乐和商务办公。今天我们就为大家分享明基e580高品质智能投影机。这款投影机采用了非常简单的外观设计,具有非常高的智能化程度,而且内置……
不止光刻机,国产芯片还有难题要解决,距离ASML差距有多大?对于半导体行业而言,芯片起着至关重要的作用,但是芯片的制造却一直受到光刻机的限制。光刻机的制造难度很大,全球范围内只有少数几家企业能够制造出一台高端的光刻机,包括荷兰ASML公……
上海闹市裸拍门行为艺术你是怎么理解的自从有了网络之后很多人似乎都疯了,不知道是因为之前我们接触知道的太少。还是因为现在网络的兴起让更多的人看到了这其中的便利。用一些举动来达到一些目的。网上总是会出现一些不雅视频或……
乃梨子与志摩子电车这文化太难让人理解接受其实每每说到日本的漫画这类话题的时候都是很令小编头疼的。因为压根小编也不是什么漫画迷,而对于日本的一些漫画也并感什么兴趣。为了满足一些网友们的问题。接下来就聊一些有关乃梨子与志……
广东出现的不明飞行物是什么?你怎么看?一颗流星,不必夸张。给中国拜年了呗,还能做个啥!?我近距离见过飞碟,对,明确就是飞碟,不是UFO(不明飞行物)。不清楚近期广东那个UFO事件,但我要指出,飞碟是有声……
芝麻女孩恐怖图片和玉米男孩比较更加恶心恐怖芝麻女孩恐怖图片和玉米男孩的图片是一样的恐怖的,当然了不仅是恐怖的故事,还有很多让人的感觉到恶心和揪心的一些内容,和玉米男孩比较更加恶心恐怖。这样的故事都是来之于很出名的一部悬……
朴宝剑惠利吻戏起反应柔软的嘴唇相碰当然有感觉朴宝剑惠利吻戏起反应,其实有反应是很正常的,没有反应才是不正常的,朴宝剑和李惠利主演的电视剧《请回答1988》大受欢迎,不管是在韩国、还是在中国,还是在其它国家播放之后都引起很……
闫京白航怎么死的太猖狂早晚是要还的早年间香港大佬向华强的娱乐板块也有涉及到内地。在北京开了一家叫做演歌台的娱乐场所。一时间受到了不少当地人的关注。毕竟向华强在娱乐圈中的影响力还是很大的。但是后来因为当地大哥闫京……
潘阳为什么离了婚潘长江公开要给自己姑娘找人家潘阳是潘长江的女儿,潘长江如今的成绩已经不能有成功来形容了,其实按理来说潘阳是一个很幸福的女孩,她的父母都那么的成功,而且也都那么的爱她,更重要的是还给了她很好的的资源,潘长江……
周震南家里公司简介富二代有钱好多艺人捧他其实艺人中富二代很多,此时在艺人圈子中,只要是家庭背景好一点,那么就会得到更多人的保障吧!今天要说的则是周震南,是有名的富二代,那么是怎么被发现的呢?好像是说周震南本身家里面曝……
胡渐彪和马薇薇分手了马薇薇当时就没有同意胡渐彪和马薇薇分手了,其实两个人并没有在一起过,两个人之所有绯闻,是因为马薇薇在《奇葩说》节目中的一句玩笑话,当时马薇薇对胡渐彪说:ldquo;是因为我拒绝了你的表白吗?rdq……
池昌旭承认鼻子整容透光的鼻子的确挺招眼娱乐圈本来就是个看脸的地方。长相出众的艺人自然他们发展起来就会顺利很多。虽然实力还是很重要的。但不得不说颜值才是第一。所以网友们也总是会讨论明星们的长相。哪个是天然的哪个是动过……