一、前言

接手公司百万级后台管理系统,技术栈 Vue3 + Vite4 + Element Plus,线上实测首屏白屏 3.8s,路由切换卡顿、打包产物超 12M,页面操作偶发阻塞。本文完整记录落地优化流程,所有方案均经过压测、线上验证,可直接复制落地。

二、基础指标采集(优化前基线)

使用 Lighthouse + 浏览器 Performance 面板采集核心指标:

FCP:3.82s

LCP:4.1s

JS 总打包体积:12.6M

第三方依赖占比 72%(图表、富文本、导出插件)

无分包、无按需加载、全量引入 UI 组件

三、构建层优化(Vite 配置改造)

  1. 依赖预构建分包 splitVendorChunk

修改 vite.config.ts 手动分割第三方大包,避免单 chunk 体积过大:

typescript

运行

build: {
rollupOptions: {

output: {
  manualChunks(id) {
    if (id.includes('node_modules/echarts')) return 'echarts';
    if (id.includes('node_modules/xlsx')) return 'excel';
    if (id.includes('element-plus')) return 'element-plus';
    return 'vendor';
  }
}

}
}
效果:单 js 文件拆分 5 个独立分包,并行加载减少阻塞。

  1. 开启 Gzip + Brotli 双压缩

搭配 vite-plugin-compression,nginx 同步开启解压,静态资源体积直接减少 60%。

  1. 图片资源自动化处理

全量图片转 webp 格式

大尺寸背景图使用 cdn、懒加载

vite-plugin-image-optimizer 压缩本地静态图

四、业务代码层面优化

  1. Element Plus 完整按需引入

删除全局导入,自动导入组件、图标、样式,剔除未使用组件代码,减少 2.3M 冗余代码。

  1. 路由懒加载 + 动态导入分包

所有页面路由使用 ()=>import() 动态导入,一级路由独立 chunk,避免首页一次性加载全页面代码。

  1. 大列表虚拟滚动替代 v-for 循环

数据表格超过 1000 行全部替换 vue-virtual-scroller,DOM 节点从 3000 + 降至 50 以内,解决滚动卡顿。

  1. 大型第三方库延迟加载

Echarts、Excel 导出、PDF 打印等重型工具,进入对应页面后动态 import,不在首页预加载。

五、运行时性能优化

全局防抖节流:搜索框、窗口 resize、表格筛选统一封装工具函数

watch 精准监听,避免无意义重复渲染

v-once 固定静态文案,杜绝重复 diff

全局销毁监听:页面离开清除定时器、请求、滚动监听,防止内存泄漏

六、CDN 与缓存策略

稳定第三方库(Vue、VueRouter、Pinia)使用 CDN 引入,剔除打包体积

Nginx 设置静态资源强缓存,js/css 图片增加 hash 文件名,更新自动刷新缓存

接口添加缓存层,高频查询数据本地 localstorage 缓存,减少重复请求

七、优化后最终数据对比

表格

指标 优化前 优化后 提升幅度
FCP 3.82s 0.91s 76%
打包总产物 12.6M 4.3M 66%
页面 DOM 节点峰值 3600+ 600 以内 83%
路由切换耗时 400ms 80ms 80%

八、踩坑总结(避坑干货)

Vite 分包不要过度拆分,chunk 数量超过 8 个会触发浏览器并行加载上限,反而变慢

Brotli 压缩会增加打包时间,生产环境开启,开发环境关闭

CDN 版本必须锁定,避免自动升级引发线上兼容 bug

虚拟滚动必须固定高度,否则会出现空白、滚动错位问题

九、总结

大型 Vue 后台性能优化是分层工作:构建分包减少下载体积、代码懒加载降低首页负担、运行时优化减少浏览器渲染压力、缓存策略降低重复资源请求。整套方案无需重构业务逻辑,仅修改工程配置 + 少量页面改造,投入产出比极高,适合所有中后台 Vue 项目复用。


有腹肌的鼠标垫
1 声望0 粉丝