SPA 项目首屏加载速度慢怎么解决
首屏加载(又称首屏事件 - First Contentful Paint),指的是浏览器从响应用户输入的网址地址,到首屏内容的渲染完成的时间,此时整个网站不一定全部渲染完成,但是需要完全展示当前视窗的内容
首屏加载对于用户体验是最重要的环节
加载慢的原因
对于页面渲染的过程,导致加载变慢的因素可能如下:
- 网络卡顿/延时
- 资源文件体积过大
- 资源是否重复发送请求重复加载了
- 加载脚本的时候渲染的管线阻塞了
解决方案
常见的优化方案
- 减小入口文件体积
- 静态资源本地缓存
- UI框架按需加载
- 图片资源的压缩
- 组件避免重复打包
- 开启
gzip
压缩 - 使用
SSR
减小入口文件体积
常用的手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加
在 vue-router
配置路由的时候,采用动态加载路由的形式,以函数的形式加载路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件
routes:[
{
path: 'Blogs',
name: 'ShowBlogs',
component: () => import('./components/ShowBlogs.vue')
}
]
静态资源本地缓存
后端返回资源问题:
采用HTTP缓存,设置 Cache-Control
, Last-Modified
, Etag
等响应头
采用 Service Worker
离线缓存
前端合理利用 localStorag
UI框架按需加载
在日常使用UI框架时,不要直接引入整个库,可以使用自动引入工具或者手动逐个导入需要的组件,减少无用代码的产生
图片资源的压缩
控制高清图使用:大批量场景下,优先采用“低清缩略图占位+高清图加载完成后替换”的方式,减少首屏初始加载压力
优化图片格式:减少 JPG、PNG 等传统格式依赖,优先选用 WebP 格式(同等画质下体积更小)
优化图标资源:页面图标避免单独用图片,优先使用字体图标或雪碧图,减少 HTTP 请求次数
优化图片大小:图片过大导致加载速度变慢,优先采用“懒加载”的方式,将图片放置在合适的时机进行加载,从而提高加载速度
重复组件打包
避免重复打包组件:通过构建工具提取公共组件为独立chunk,同一组件只打包一次,减少首屏代码体积
配置工具去重:如Webpack用splitChunks、Vite用rollupOptions,拆分公共依赖,避免重复打包
第三方库按需引入:UI组件库需配合按需加载方案,防止未使用组件被打包,减少冗余
公共组件统一管理:项目内通用组件全局注册,避免在多页面中重复打包,提升加载效率
开启 gzip 压缩
浏览器对 gzip 压缩的支持比较好,可以有效提高页面加载速度,减少用户等待时间,从而提升用户体验
使用 SSR
SSR(Server side ),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到浏览器
从头搭建一个服务端渲染是很复杂的,vue应用建议使用 Nuxt.js
实现服务端渲染