

文章目录
- [1. Vue 性能优化与调试技巧](#1. Vue 性能优化与调试技巧)
-
- [1.1 使用 `v-if` 替代 `v-show` 控制条件渲染](#1.1 使用
v-if
替代v-show
控制条件渲染) - [1.2 组件懒加载(异步组件)](#1.2 组件懒加载(异步组件))
-
- 示例代码:
- [效果分析图(Mermaid 图表示):](#效果分析图(Mermaid 图表示):)
- [1.3 使用 `keep-alive` 缓存组件状态](#1.3 使用
keep-alive
缓存组件状态) -
- 示例代码:
- [Mermaid 流程图说明组件缓存机制:](#Mermaid 流程图说明组件缓存机制:)
- [1.4 避免不必要的响应式数据更新](#1.4 避免不必要的响应式数据更新)
-
- [1.4.1 使用 `Object.freeze()` 冻结静态数据](#1.4.1 使用
Object.freeze()
冻结静态数据) - [1.4.2 使用计算属性代替模板内表达式](#1.4.2 使用计算属性代替模板内表达式)
- [1.4.1 使用 `Object.freeze()` 冻结静态数据](#1.4.1 使用
- [1.5 使用 `v-once` 指令渲染静态内容](#1.5 使用
v-once
指令渲染静态内容) - [1.6 减少 Watcher 数量](#1.6 减少 Watcher 数量)
-
- 优化建议:
- [示例:合并多个 watch](#示例:合并多个 watch)
- [1.7 使用 Vue Devtools 进行性能调试](#1.7 使用 Vue Devtools 进行性能调试)
- [1.8 使用 `provide/inject` 优化跨层级通信](#1.8 使用
provide/inject
优化跨层级通信) - [1.9 使用 Memoization 技术优化高频函数](#1.9 使用 Memoization 技术优化高频函数)
-
- [示例:使用 Lodash 的 `memoize`](#示例:使用 Lodash 的
memoize
)
- [示例:使用 Lodash 的 `memoize`](#示例:使用 Lodash 的
- [1.10 使用 Webpack 分包优化打包体积](#1.10 使用 Webpack 分包优化打包体积)
-
- [示例:Vue CLI 中配置路由懒加载](#示例:Vue CLI 中配置路由懒加载)
- 打包结构对比图:
- [1.11 使用虚拟滚动优化长列表渲染](#1.11 使用虚拟滚动优化长列表渲染)
- [1.12 使用 Vue Performance Plugin 进行性能监控](#1.12 使用 Vue Performance Plugin 进行性能监控)
-
- [示例:Webpack 分析工具](#示例:Webpack 分析工具)
- [1.13 使用 Tree Shaking 移除无用代码](#1.13 使用 Tree Shaking 移除无用代码)
-
- [Vite 默认支持,无需额外配置。](#Vite 默认支持,无需额外配置。)
- [Webpack 配置示例:](#Webpack 配置示例:)
- [1.14 小结:性能优化检查清单](#1.14 小结:性能优化检查清单)
- 附录:性能优化流程图(Mermaid)
- [1.1 使用 `v-if` 替代 `v-show` 控制条件渲染](#1.1 使用
正文
1. Vue 性能优化与调试技巧
1.1 使用 v-if
替代 v-show
控制条件渲染
在控制组件是否渲染时,应根据使用场景选择合适的指令。
v-show
:通过 CSS 的display: none
切换显示状态,组件始终挂载。v-if
:真正地销毁和重建组件,适用于不频繁切换的场景。
示例代码:
vue
<template>
<div v-if="isVisible">This is conditionally rendered using v-if</div>
<div v-show="isVisible">This is toggled using v-show</div>
</template>
<script>
export default {
data() {
return {
isVisible: false
};
}
};
</script>
✅ 建议 :对于频繁切换的组件使用
v-show
,否则优先使用v-if
。
1.2 组件懒加载(异步组件)
Vue 支持使用异步组件来实现按需加载,提升首屏性能。
示例代码:
js
// 异步加载组件
const AsyncComponent = () => import('./components/HeavyComponent.vue');
export default {
components: {
AsyncComponent
}
};
效果分析图(Mermaid 图表示):
否 是 用户访问页面 是否需要加载 HeavyComponent? 不加载组件 动态导入并渲染组件 网络请求加载 JS 文件 组件成功渲染
✅ 建议:对非首屏使用的大型组件进行懒加载,减少初始加载时间。
1.3 使用 keep-alive
缓存组件状态
在 <router-view>
或动态组件切换中,可以使用 <keep-alive>
来缓存组件状态,避免重复创建和销毁。
示例代码:
vue
<template>
<keep-alive>
<component :is="currentTabComponent" v-if="isCached" />
</keep-alive>
<component :is="currentTabComponent" v-if="!isCached" />
</template>
Mermaid 流程图说明组件缓存机制:
是 否 切换 Tab 是否启用 keep-alive? 从缓存恢复组件状态 重新创建组件实例
✅ 建议:用于 Tab 切换、表单编辑等需要保留状态的场景。
1.4 避免不必要的响应式数据更新
虽然 Vue 的响应式系统非常强大,但过多的 watcher 和依赖追踪会影响性能。可通过以下方式优化:
1.4.1 使用 Object.freeze()
冻结静态数据
js
export default {
data() {
return {
staticData: Object.freeze([
{ id: 1, name: 'Item A' },
{ id: 2, name: 'Item B' }
])
};
}
};
冻结后的对象不会触发 Vue 的响应式更新,提高性能。
1.4.2 使用计算属性代替模板内表达式
vue
<template>
<!-- 不推荐 -->
<div>{{ items.length > 0 ? '有数据' : '无数据' }}</div>
<!-- 推荐 -->
<div>{{ displayMessage }}</div>
</template>
<script>
export default {
computed: {
displayMessage() {
return this.items.length > 0 ? '有数据' : '无数据';
}
}
};
</script>
1.5 使用 v-once
指令渲染静态内容
若某些 DOM 节点在整个生命周期中不会变化,可以使用 v-once
指令只渲染一次。
示例代码:
vue
<span v-once>This will never change: {{ msg }}</span>
⚠️ 注意:msg 变化后不会重新渲染该节点。
1.6 减少 Watcher 数量
过多的 watch
和计算属性会增加内存消耗和执行开销。
优化建议:
- 合并多个 watch 监听为一个;
- 避免在模板中频繁调用方法(如
{``{ method() }}
),改用计算属性; - 使用
deep
监听器时要谨慎,避免深层监听大对象。
示例:合并多个 watch
js
watch: {
firstName(newVal) {
this.fullName = newVal + ' ' + this.lastName;
},
lastName(newVal) {
this.fullName = this.firstName + ' ' + newVal;
}
}
// 优化后:
watch: {
firstName: updateFullName,
lastName: updateFullName
}
function updateFullName() {
this.fullName = this.firstName + ' ' + this.lastName;
}
1.7 使用 Vue Devtools 进行性能调试
Vue Devtools 提供了丰富的调试功能,包括:
- 组件树查看;
- 响应式数据跟踪;
- 渲染性能分析;
- 时间线记录(Timeline)。
使用建议:
- 查看组件渲染耗时;
- 检查是否有不必要的重渲染;
- 分析事件流和数据流。
1.8 使用 provide/inject
优化跨层级通信
避免使用多层 $emit
和 $on
,可使用 provide/inject
实现祖先组件向子孙组件传值。
示例代码:
js
// 祖先组件
export default {
provide() {
return {
theme: 'dark'
};
}
};
// 子孙组件
export default {
inject: ['theme']
};
✅ 优点:减少父子间层层传递 props,提升维护性和性能。
1.9 使用 Memoization 技术优化高频函数
在计算属性或方法中,使用 memoization(记忆化)技术避免重复计算。
示例:使用 Lodash 的 memoize
bash
npm install lodash
js
import { memoize } from 'lodash-es';
methods: {
expensiveCalculation: memoize(function(input) {
// 复杂计算逻辑
return result;
})
}
1.10 使用 Webpack 分包优化打包体积
通过配置 Webpack 对项目进行分块打包,减小主包体积。
示例:Vue CLI 中配置路由懒加载
js
// vue-router 配置示例
{
path: '/dashboard',
component: () => import('../views/Dashboard.vue')
}
打包结构对比图:
未分包:
main.js (5MB)
分包后:
main.js (1MB)
Dashboard.chunk.js (2MB)
OtherPage.chunk.js (2MB)
1.11 使用虚拟滚动优化长列表渲染
当渲染大量数据时,使用虚拟滚动技术只渲染可视区域内的元素。
推荐库:
示例代码:
vue
<template>
<RecycleScroller
class="scroller"
:items="list"
:item-size="32"
key-field="id"
v-slot="{ item }"
>
<div class="user">{{ item.name }}</div>
</RecycleScroller>
</template>
✅ 效果:即使渲染上万条数据,页面依然流畅。
1.12 使用 Vue Performance Plugin 进行性能监控
使用插件 @vitejs/plugin-vue
(Vite)或 webpack-bundle-analyzer
来分析构建性能。
示例:Webpack 分析工具
bash
npm install --save-dev webpack-bundle-analyzer
js
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
};
运行后打开浏览器即可查看模块大小分布图。
1.13 使用 Tree Shaking 移除无用代码
确保你的项目支持 ES Module 并开启 Tree Shaking,移除未使用的代码。
Vite 默认支持,无需额外配置。
Webpack 配置示例:
js
module.exports = {
mode: 'production',
optimization: {
usedExports: true
}
};
1.14 小结:性能优化检查清单
优化项 | 是否推荐 | 适用场景 |
---|---|---|
使用 v-if 替代 v-show |
✅ | 不频繁切换的组件 |
组件懒加载 | ✅ | 非首屏组件 |
keep-alive 缓存组件 |
✅ | Tab 切换、表单 |
Object.freeze() |
✅ | 静态数据 |
v-once |
✅ | 静态文本 |
合并 Watcher | ✅ | 多个相关状态变化 |
虚拟滚动 | ✅ | 长列表 |
Webpack 分包 | ✅ | 项目较大 |
使用 Devtools 分析 | ✅ | 调试阶段 |
Tree Shaking | ✅ | 生产环境 |
附录:性能优化流程图(Mermaid)
结语
感谢您的阅读!期待您的一键三连!欢迎指正!
