首发于 吕小鸣Developer
Vue Cli项目B端系统常见性能优化技巧

Vue Cli项目B端系统常见性能优化技巧

最近工作上一直接触的时B端的管理系统,基本上都是采用Vue Cli生成脚手架后就直接开始写业务逻辑,所以一般都会忽略一些性能优化相关的想法和工作。虽说这种系统对前端要求一般来说比较简单,大多数是一些数据校验和可视化展示,可能重点的工作量在于业务逻辑,但是作为一个前端项目来说,基本的优化还是需要做的,可以参考这篇 文章

而本文将会介绍一些基于Vue Cli项目会被我们忽略的一些性能优化,尤其是首屏优化的技巧,如果对你有帮助,可以点赞支持一下。

UI库按需加载

对于大多是B端系统而言,都会使用一些一些UI组件库,例如Ant Design或者是Element UI,这些组件都是支持按需引入,我们在使用这些组件时,如果只用到了其中一部分组件,可以配置按需加载,在main.js中修改代码:

然后修改babel.config.js,如下:

这样,组件对应的js和css文件就可以实现按需加载,关于babel.config.js的配置,可以参考之前的一篇 文章

使用webpack-bundle-analyzer分析打包后的资源包

webpack-bundle-analyzer是一个webpack插件,它可以直观分析打包出的文件包含哪些,大小占比如何,模块包含关系,依赖项,文件是否重复,压缩后大小如何,针对这些,我们可以进行文件分割等操作,是我们后面分析资源包大小的基础。

配置完成之后,只需要npm run build即可,会自动打开 127.0.0.1:8888/

路由懒加载

对于一般比较大型的B端管理系统项目,基本上都会使用Vue Router来管理路由,这些项目涉及的页面都比较多,所以为了防止首屏资源过大,需要采用路由懒加载资源即Code Splitting,将每个页面的资源进行分离,这个只需在router.js里配置即可:

有选择的使用prefetch和preload

prefetch

这段代码告诉浏览器,这段资源将会在未来某个导航或者功能要用到,但是本资源的下载顺序权重比较低。也就是说prefetch通常用于加速下一次导航,而不是本次的。

preload

preload通常用于本页面要用到的关键资源,包括关键js、字体、css文件。preload将会把资源得下载顺序权重提高,使得关键数据提前下载好,优化页面打开速度。

在使用Vue Cli生成的项目里,当我们配置了路由懒加载后,默认情况下webpack在构建时会对所有的懒加载资源进行prefetchpreload,所以当你打开首页时,会看到大量的prefetchpreload请求,如下图:

虽说prefetch会在浏览器空闲时,下载相应文件,但这是一个很笼统的定义,这些大量的预加载资源会占用浏览器的资源,可能会导致一些关键的api请求或者图片请求受影响,所以对于这种情况,可以选择指定一些资源进行预加载或者禁止掉这些预加载,代码如下:

上面代码修改vue.config.jschainWebpack来添加配置。

拆分node_modules

对于一般比较大型的B端管理系统项目,一般都会使用一些UI组件库,图表库等第三方库,这些第三方库一般都是通过npm installnode_modules下面,并且每个页面大多都会使用这些库,所以会在main.js中引入:

在打包时,webpack会将这些公用的模块,抽离出来,放到一个公共模块中。这样不管这个模块被多少个入口引用,都只会在最终打包结果中出现一次,以此解决代码冗余。

这些在使用Vue Cli的项目中已经自动帮我们做好了,主要利用了optimization.splitChunks配置,但是当我们把这些公用的模块都堆在一个模块中,这个文件可能异常巨大(一般是app.js,首屏就会加载这个文件,引用的公共第三方库越多,这个文件越大),也是不利于网络请求和页面加载的。所以我们需要把这个公共模块再按照一定规则进一步拆分成几个模块文件,减小文件体积,同时也可以利用HTTP2多路复用特性,这些则需要我们自己配置,代码如下:

上面代码在vue.config.js里,修改configureWebpack项来添加配置,关于optimization.splitChunks的配置,可以参考这个 文档,这里可以简单的解释一下上面配置的含义:

  1. 每个cacheGroups代表需要抽离的第三方库,这里有两个分别是ant-design-vue和echarts。
  2. test项表示要扫描的node_modules文件路径,这里简单采用了正则来匹配。
  3. chunks项有三个选项:all, async, initialinitial 代表负责异步模块和非异步模块加载的公共抽离,async代表只负责异步模块加载的公共抽离, all结合前面两者特点。

定制资源文件加载位置

对于使用Vue Cli创建的项目,一般来说都不会刻意的修改css,JavaScript文件加载的顺序,例如默认情况下webpack会把css放在标签里,JavaScript文件放在标签底部,所以,有时我们会在标签底部引入一些第三方的JavaScript文件,例如jquery或者高德地图的api文件等等,如下所示:

我们知道,浏览器在解析HTML时,遇到非异步的资源,尤其是JavaScript文件资源时,会下载并解析,那么越先加载就越先解析, 而默认情况下,项目构建之后,业务的核心JavaScript文件会被放在这些第三方的JavaScript文件后面加载,会对首屏的展示有一定的影响。

解决这个问题,需要修改html-webpack-plugin配置,然后手动在index.html里,自定义文件的加载位置,代码如下:

这样,就可以将一些重要的首屏资源加载优先级提升,在一定情况下,优化首屏的加载速度。

PrerenderSpaPlugin首屏预渲染

对于大多数的B端系统而言,大部分都是一个已Vue开发的单页应用SPA,所以首屏的内容基本上都是依赖JavaScript来进行渲染的,这样不仅依赖于JavaScript文件资源的加载,而且不利于SEO(可能大部分B端系统无需SEO,但不排除一些欢迎页或者品牌首页类似的页面有SEO的需求)。

PrerenderSpaPlugin是一个可以将一些页面预先打包成静态资源页面的webpack插件,并且可以结合vue-router,来根据路由,配置指定的页面,它的工作流程如下图:

基于此,我们可以修改vue.config.js,添加PrerenderSpaPlugin支持,代码如下:

上面代码中,给/login/about两个路由配置了预加载,在项目dist之后,就可以看到两个独立的html文件,在通过一些nginx配置,将对应的路径直接转发到对应的静态页面即可。更多关于PrerenderSpaPlugin可以参考 配置

图片压缩

默认情况下,Vue Cli创建的项目不会对项目中引入的一些图片资源进行二次压缩,这时如果引入一些较大的图片,并且比较多的情况下,会导致dist之后的包变得很大,这时可以采用image-webpack-loader来开启配置图片压缩,添加image-webpack-loader,代码如下:

上面代码修改vue.config.jschainWebpack来添加配置,image-webpack-loader始于 imagemin开发的webpack的loader,可以支持无损和有损压缩。

结语

对于大多数的B端系统而言,可能更注重复杂的业务逻辑实现,但可能也会忽略一些基本的性能优化,对于整个系统而言,给到良好的用户体验才能让系统变得更加健壮,同时也是一名前端工程师的成就所在。

代做工资流水公司曲靖日常消费流水代做许昌薪资银行流水代开宿迁薪资流水单打印淮安办银行流水账单保定离职证明价格滁州薪资银行流水报价鞍山代做工资流水南宁银行对公流水制作宜昌自存银行流水图片孝感日常消费流水图片郑州工资流水账单报价青岛做车贷银行流水徐州个人工资流水 模板贵阳背调流水查询哈尔滨代办车贷流水漳州银行流水修改费用唐山房贷流水多少钱宿迁企业贷流水三亚流水样本廊坊在职证明代办柳州对公银行流水办理西安代办对公流水南阳做签证工资流水济南背调工资流水模板深圳代做流水铜陵离职证明公司临沂代做工资证明黄冈办消费贷流水湛江代办购房银行流水大连开流水单香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化