一、代码层面的优化
1.1 组件优化
合理拆分组件
避免巨型组件,按功能/视图拆分组件,保持单一职责原则异步组件 + Suspense
动态加载非首屏组件,降低初始包体积const AsyncComponent = defineAsyncComponent(() => import('./Component.vue'))
KeepAlive 缓存
对频繁切换的组件使用缓存(如 Tab 切换)<KeepAlive :include="['ComponentA']"> <component :is="currentComponent" /> </KeepAlive>
1.2 渲染优化
v-if 与 v-show
频繁切换用 v-show,运行时条件变化用 v-if列表渲染优化
- 始终提供稳定唯一的
:key
- 大数据量使用虚拟滚动(vue-virtual-scroller)
- 避免 v-for 与 v-if 同时使用
- 始终提供稳定唯一的
减少响应式依赖
对不需要响应式的数据使用Object.freeze()
或 shallowRefconst staticData = Object.freeze({ ... });
1.3 状态管理
- Vuex 模块化
按功能拆分 store 模块,避免单一 store 过大 - 计算属性缓存
优先使用 computed 而非 methods 处理衍生数据 - 批量更新
使用nextTick
合并多个状态更新this.$nextTick(() => { // 批量更新操作 });
二、构建优化
2.1 打包策略
代码分割
配置 splitChunks 分割公共代码// vite.config.js build: { rollupOptions: { output: { manualChunks: { vendor: ['vue', 'vue-router'], utils: ['lodash', 'moment'] } } } }
Tree Shaking
确保使用 ES Module 规范的库,移除未使用代码动态导入(Lazy Loading)
路由级代码分割:const Home = () => import('./views/Home.vue')
2.2 资源优化
图片处理
- 使用 CDN 托管图片
- 转换为 WebP 格式
- 实现懒加载(Intersection Observer API)
<img v-lazy="imageUrl" />
字体优化
- 使用
font-display: swap
- 子集化字体文件
- 使用
静态资源压缩
使用 Brotli/Gzip 压缩(配置服务器或构建时预压缩)
三、网络优化
3.1 HTTP 优化
预加载关键资源
<link rel="preload" href="critical.css" as="style">
HTTP2 推送
配置服务器推送关键资源合理缓存策略
- 长期缓存:
[name].[contenthash].js
- Cache-Control 策略设置
- 长期缓存:
3.2 第三方库优化
按需引入
避免全量引入组件库import { Button } from 'element-plus';
替换轻量方案
- dayjs → moment
- lodash-es → lodash
使用 CDN 资源
将稳定第三方库通过 externals 外链// vite.config.js build: { rollupOptions: { external: ['vue'], output: { globals: { vue: 'Vue' } } } }
四、运行时优化
4.1 性能监测
- DevTools 性能分析
使用 Vue DevTools 的 Performance 面板 - Lighthouse 检测
定期执行性能评分(CLS, FCP, TTI 等指标)
4.2 内存管理
及时销毁全局事件监听
beforeUnmount() { window.removeEventListener('resize', this.handleResize) }
避免内存泄漏
清除定时器、取消未完成请求
4.3 渲染性能
- 防抖节流处理
高频事件(resize, scroll)使用 lodash 的 debounce/throttle - 减少强制同步布局
避免在循环中访问 offsetWidth 等触发回流属性
五、高级优化策略
5.1 服务端优化
- SSR (Nuxt.js)
提升首屏速度与 SEO - SSG 静态生成
适用于内容型站点(VuePress)
5.2 Web Worker
将复杂计算移出主线程:
// worker.js
self.onmessage = (e) => {
const result = heavyCalculation(e.data)
self.postMessage(result)
}
5.3 WASM 加速
使用 Rust/Go 编写高性能模块:
import init, { calculate } from './pkg/wasm_module.js'
init().then(() => {
calculate() // 调用 WASM 方法
})
六、工具链优化
6.1 构建工具
- 升级到 Vite
利用原生 ESM 的快速冷启动 - SWC 加速
替换 Babel 进行更快转译
6.2 持续优化
Bundle 分析
使用 rollup-plugin-visualizer 分析包组成import { visualizer } from 'rollup-plugin-visualizer' plugins: [visualizer()]
性能预算
配置警告阈值:// vite.config.js build: { brotliSize: false, // 禁用压缩大小检查 chunkSizeWarningLimit: 1000 // 设置 chunk 大小警告阈值 (KB) }
七、移动端专项优化
- 避免 300ms 点击延迟
使用fastclick
库 - 禁用缩放
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
- GPU 加速
对动画元素使用 transform 和 opacity.animate { will-change: transform; transform: translateZ(0); }
优化效果验证工具
- Chrome DevTools Performance 面板
- Lighthouse 性能评分
- WebPageTest 多地点测试
- Vue DevTools 组件渲染时间分析
通过组合使用以上优化策略,通常可获得显著的性能提升。建议优先解决 Lighthouse 标注的核心 Web 指标(Core Web Vitals)问题,再针对具体业务场景进行深度优化。记住:性能优化是持续过程,需要结合监控系统建立长期优化机制。