Skip to content

SPA 项目首屏加载速度慢怎么解决

首屏加载(又称首屏事件 - First Contentful Paint),指的是浏览器从响应用户输入的网址地址,到首屏内容的渲染完成的时间,此时整个网站不一定全部渲染完成,但是需要完全展示当前视窗的内容

首屏加载对于用户体验是最重要的环节

加载慢的原因

对于页面渲染的过程,导致加载变慢的因素可能如下:

  • 网络卡顿/延时
  • 资源文件体积过大
  • 资源是否重复发送请求重复加载了
  • 加载脚本的时候渲染的管线阻塞了

解决方案

常见的优化方案

  • 减小入口文件体积
  • 静态资源本地缓存
  • UI框架按需加载
  • 图片资源的压缩
  • 组件避免重复打包
  • 开启 gzip 压缩
  • 使用 SSR

减小入口文件体积

常用的手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加

vue-router 配置路由的时候,采用动态加载路由的形式,以函数的形式加载路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件

javascript
routes:[
    {
        path: 'Blogs',
        name: 'ShowBlogs',
        component: () => import('./components/ShowBlogs.vue')
    }
]

静态资源本地缓存

后端返回资源问题:

采用HTTP缓存,设置 Cache-ControlLast-ModifiedEtag 等响应头

采用 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 实现服务端渲染

尘埃虽微,积之成集;问题虽小,记之为鉴。 雾中低语,心之所向;思绪飘渺,皆可成章。