浅谈VUE首屏性能优化最佳实践

大家在日常开发中,可能会出现首屏加载慢、白屏停留时间长等问题,今天我结合自己项目的实际情况给大家分享一些思路和解决办法

一、众里寻他千"百度",却在灯火阑珊

我们日常在做研发时,可能很少关心首屏性能 问题,感觉不到性能瓶颈。那可能是因为我们的产品或者项目不复杂,还没有达到那个程度,再加上现在成熟的打包工具,自动帮我们做了优化,勉勉强强还能说的过去。

随着产品或者项目的复杂度高,功能逐步完善,慢慢的就会发现如由老牛拉拖车,越来越慢、首屏的加载速度无法忍受。

针对如何进行首屏优化的方法其实还是比较多,这里列举以下方向:

  • Vue组件按需加载

  • 减少打包文件体积

  • 减少静态资源请求数量

  • 静态资源开启GZIP加速

  • 静态资源服务器开启缓存

  • CDN静态资源加载

  • 做骨架屏

  • 完善加载动画

其中:前6项可以真正提升加载速度,后2项目主要是用于提升用户体验

二、探索最佳解决方案

Vue组件按需加载

说到按需加载,Vue项目中主要是通过以下2种实现策略,一种是组件按需加载,一种是路由懒加载,其本质都是组件的需求加载。【控制减少打包资源体积

组件按需加载

xml 复制代码
<script>

// 定义一个名为MyComponent的组件

const MyComponent = () => import('@/components/MyComponent.vue')

</script>

路由懒加载

dart 复制代码
// 单个路由地址配置

{

path: '/routePath',

name: 'routeName',

component:()=>import('@/views/MyComponent.vue')

}

减少打包文件体积

Vue组件按需加载已经可以优化打包体积,但是在实际的项目开发中我们还可以通过对vue.config.js配置文件的调整,设置相应的文件chunk大小阈值,chunk文件请求个数等。

Vue-Cli3.0:修改插件说明参考地址:cli.vuejs.org/zh/guide/we...
webpack-split-chunks插件配置参考地址:www.webpackjs.com/plugins/spl...

less 复制代码
// vue.config.js 配置

chainWebpack (config) {

config.optimization.splitChunks({

chunks: 'all',// 处理所有类型chunk

minSize: 1024 * 100, // 最小为100kb

maxSize: 0, //不限制单个chunk的最大大小

minChunks: 1,//拆分前模块最少被引用1次

maxAsyncRequests: 5,//异步模块的最大请求数为5

maxInitialRequests: 3//初始模块的最大请求数为3

})

}

模块拆分不是越小越好,也不是越大越快,需要根据项目的实际情况进行相应测试。

我所主导参与的项目比较复杂,引入了很多三方插件库,结合打包静态资源分析工具,把三方库排除打包,利用三方库UMD规范的压缩文件,直接动态挂载至window上供项目直接使用。

静态资源分析工具

按照上述方式进行配置后,我们可以借助打包分析工具,可视化查阅相应的静态资源大小,以及对相应的文件进行再次调整。

package.json 先安装打包分析工具"npm install webpack-bundle-analyzer"

arduino 复制代码
// Vue.config.js 中配置分析工具

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')

chainWebpack (config) {

// 生成打包文件-报告

config.plugin('webpack-report').use(BundleAnalyzerPlugin, [

{

analyzerMode: 'static'

}

])

}

配置完成后打包会生成一个可视化的文件链路图,涵盖各个资源的引用情况,项目上可以根据实际需求再次调整,本项目比较复杂,所以涵盖的内容比较多

减少静态资源请求数量

减少静态资源请求,可以从chunks拆分入手【详见:减少打包文件体积配置】,同时我参与的项目挂载了很多三方库,我们通过自定义webpack脚本,在项目每次运行时,把小的三方库进行动态合并,减少请求数据。如:jquery、lodash 等

后续文章将重点说一下这个自动化合并方案

静态资源开启GZIP加速

Gzip是一种数据压缩算法,通过将文本、样式表、脚本和其他可压缩的内容压缩成更小的文件【如:CSS、JS静态资源】从而减少传输数据量。目前的主流浏览器都已经支持Gzip。请求网页时,服务器会将响应的内容进行压缩,并在浏览器端解压缩,实现数据传输的优化。通过开启Gzip压缩,可以加速网站的加载速度,减少带宽使用,提升用户体验。完成GZIP加速按照以下连个步骤即可完成:

  • Vue项目打包时,对vue.config.js配置支持GZIP;

  • 静态资源服务器【nginx】开启Gzip加速;

Vue项目打包时,对vue.config.js配置支持GZIP

package.json 先安装打包压缩工具

arduino 复制代码
"npm install compression-webpack-plugin"

compression-webpack-plugin插件配置参考地址:webpack.docschina.org/plugins/com...

javascript 复制代码
// vue.config.js 配置开启gzip

const CompressionPlugin = require('compression-webpack-plugin')

configureWebpack: (config) => {

const plugins=[

new CompressionPlugin({

algorithm: 'gzip',// 压缩格式

test: new RegExp(`\\.(${['js', 'css', 'json', 'html'].join('|')})$`),// 正则匹配文件后缀

threshold: 1024 * 5,// 压缩阀值超过5KB时才压缩

minRatio: 0.5//压缩比例缩小50%才采用

})]

return {

plugins

}

}
静态资源服务器开启GZIP

通过对Nginx配置gzip,如下简单列举了

bash 复制代码
http {

# 开启GZIP

gzip on;

# GZIP类型

gzip_types text/plain application/x-javascript   application/javascript text/css application/xml text/javascript;

}

开启后,浏览器访问静态资源F12浏览器的Content-Enconding 会显示gzip

CDN静态资源加载

CDN静态资源加载有以下好处:

  • 可以把一些三方资源从别的服务器如公共CDN加载,减少打包文件大小,同时减少了本地服务器负载;

  • 当我们遇到复杂应用,首屏请求的资源非常多,初始化能达到100个请求,在htt1.0协议下 ,浏览器对同一个域名的并发请求数量存在限制,以Google浏览器举例:最大并发请求数为6,不同浏览器之间存在细微差异,通过CDN可以减少并发排队请求时间。

三、快速实践

以上首屏性能优化方案能解决大部分应用的响应性能特别是GZIP,对于静态资源缓存、骨架屏、加载动画后期将会持续更新对应的文章供大家参考。

相关推荐
秦时明月之君临天下几秒前
React和Next.js的相关内容
前端·javascript·react.js
上官花雨33 分钟前
什么是axios?怎么使用axios封装Ajax?
前端·ajax·okhttp
米奇妙妙wuu34 分钟前
React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?
前端·javascript·react.js
李刚大人37 分钟前
react-amap海量点优化
前端·react.js·前端框架
闹闹没有闹1 小时前
socket连接封装
前端
qq_364371722 小时前
Vue 内置组件 keep-alive 中 LRU 缓存淘汰策略和实现
前端·vue.js·缓存
y先森3 小时前
CSS3中的弹性布局之侧轴的对齐方式
前端·css·css3
你挚爱的强哥7 小时前
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
javascript·vue.js·jquery
y先森8 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy8 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html