【Vue】性能优化与调试技巧

在这里插入图片描述

个人主页:Guiat
归属专栏:Vue

在这里插入图片描述

文章目录

  • 1. Vue 性能优化与调试技巧
    • 1.1 使用 `v-if` 替代 `v-show` 控制条件渲染
      • 示例代码:
    • 1.2 组件懒加载(异步组件)
      • 示例代码:
      • 效果分析图(Mermaid 图表示):
    • 1.3 使用 `keep-alive` 缓存组件状态
      • 示例代码:
      • Mermaid 流程图说明组件缓存机制:
    • 1.4 避免不必要的响应式数据更新
      • 1.4.1 使用 `Object.freeze()` 冻结静态数据
      • 1.4.2 使用计算属性代替模板内表达式
    • 1.5 使用 `v-once` 指令渲染静态内容
      • 示例代码:
    • 1.6 减少 Watcher 数量
      • 优化建议:
      • 示例:合并多个 watch
    • 1.7 使用 Vue Devtools 进行性能调试
      • 使用建议:
    • 1.8 使用 `provide/inject` 优化跨层级通信
      • 示例代码:
    • 1.9 使用 Memoization 技术优化高频函数
      • 示例:使用 Lodash 的 `memoize`
    • 1.10 使用 Webpack 分包优化打包体积
      • 示例:Vue CLI 中配置路由懒加载
      • 打包结构对比图:
    • 1.11 使用虚拟滚动优化长列表渲染
      • 推荐库:
      • 示例代码:
    • 1.12 使用 Vue Performance Plugin 进行性能监控
      • 示例:Webpack 分析工具
    • 1.13 使用 Tree Shaking 移除无用代码
      • Vite 默认支持,无需额外配置。
      • Webpack 配置示例:
    • 1.14 小结:性能优化检查清单
    • 附录:性能优化流程图(Mermaid)

正文

1. Vue 性能优化与调试技巧

1.1 使用 v-if 替代 v-show 控制条件渲染

在控制组件是否渲染时,应根据使用场景选择合适的指令。

  • v-show:通过 CSS 的 display: none 切换显示状态,组件始终挂载。
  • v-if:真正地销毁和重建组件,适用于不频繁切换的场景。

示例代码:

<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 支持使用异步组件来实现按需加载,提升首屏性能。

示例代码:

// 异步加载组件
const AsyncComponent = () => import('./components/HeavyComponent.vue');export default {components: {AsyncComponent}
};

效果分析图(Mermaid 图表示):

用户访问页面
是否需要加载 HeavyComponent?
不加载组件
动态导入并渲染组件
网络请求加载 JS 文件
组件成功渲染

建议:对非首屏使用的大型组件进行懒加载,减少初始加载时间。


1.3 使用 keep-alive 缓存组件状态

<router-view> 或动态组件切换中,可以使用 <keep-alive> 来缓存组件状态,避免重复创建和销毁。

示例代码:

<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() 冻结静态数据

export default {data() {return {staticData: Object.freeze([{ id: 1, name: 'Item A' },{ id: 2, name: 'Item B' }])};}
};

冻结后的对象不会触发 Vue 的响应式更新,提高性能。

1.4.2 使用计算属性代替模板内表达式

<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 指令只渲染一次。

示例代码:

<span v-once>This will never change: {{ msg }}</span>

⚠️ 注意:msg 变化后不会重新渲染该节点。


1.6 减少 Watcher 数量

过多的 watch 和计算属性会增加内存消耗和执行开销。

优化建议:

  • 合并多个 watch 监听为一个;
  • 避免在模板中频繁调用方法(如 {{ method() }}),改用计算属性;
  • 使用 deep 监听器时要谨慎,避免深层监听大对象。

示例:合并多个 watch

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 实现祖先组件向子孙组件传值。

示例代码:

// 祖先组件
export default {provide() {return {theme: 'dark'};}
};// 子孙组件
export default {inject: ['theme']
};

优点:减少父子间层层传递 props,提升维护性和性能。


1.9 使用 Memoization 技术优化高频函数

在计算属性或方法中,使用 memoization(记忆化)技术避免重复计算。

示例:使用 Lodash 的 memoize

npm install lodash
import { memoize } from 'lodash-es';methods: {expensiveCalculation: memoize(function(input) {// 复杂计算逻辑return result;})
}

1.10 使用 Webpack 分包优化打包体积

通过配置 Webpack 对项目进行分块打包,减小主包体积。

示例:Vue CLI 中配置路由懒加载

// 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-virtual-scroller
  • vue-virtual-scroll-list

示例代码:

<template><RecycleScrollerclass="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 分析工具

npm install --save-dev webpack-bundle-analyzer
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');module.exports = {plugins: [new BundleAnalyzerPlugin()]
};

运行后打开浏览器即可查看模块大小分布图。


1.13 使用 Tree Shaking 移除无用代码

确保你的项目支持 ES Module 并开启 Tree Shaking,移除未使用的代码。

Vite 默认支持,无需额外配置。

Webpack 配置示例:

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)

graph TDA[开始优化] --> B{是首屏吗?}B -- 是 --> C[使用 v-if]B -- 否 --> D[使用异步加载]D --> E[使用 keep-alive 缓存]A --> F{是否有大量数据?}F -- 是 --> G[使用虚拟滚动]F -- 否 --> H[正常渲染]A --> I{是否有静态数据?}I -- 是 --> J[使用 Object.freeze / v-once]I -- 否 --> K[继续开发]

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角

文章目录 广义线性模型三剑客&#xff1a;线性回归、逻辑回归与Softmax分类的统一视角引言&#xff1a;机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…

【Linux系统篇】:Linux线程控制基础---线程的创建,等待与终止

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.线程创建二.线程等待三.线程终止四.扩展内容1.重谈pthread_…

More Effective C++学习笔记

条款1 指针与引用的区别 条款2 尽量使用C风格的类型转换 条款3 不要对数组使用多态 条款4 避免无用的缺省构造函数 条款5 谨慎定义类型转换函数 条款6 自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 条款7 不要重载“&&”,“||”, 或“,” 条款8 理…

先知AIGC超级工场,撬动运营效率新杠杆

北京先智先行科技有限公司&#xff0c;作为行业内的重要参与者&#xff0c;拥有“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品。这些产品在不同领域发挥着关键作用&#xff0c;尤其是先知AIGC超级工场&#xff0c;正悄然改变着内容创作与产品推广的…

十一岁少年叶珉雪用艺术点亮公益之路 个人原创公益演唱会传递大爱与担当

4月29日晚&#xff0c;"韶华映雪益路同行"叶珉雪个人原创公益演唱会在广东碧桂园学校歌剧院圆满落幕。 这场由该校美育成果浇灌出的艺术盛宴&#xff0c;生动诠释了广东碧桂园学校育人理念。11岁的叶珉雪以超越年龄的艺术掌控力&#xff0c;呈现了一场融合歌唱、舞蹈…

【深度学习基础】:VGG实战篇(图像风格迁移)

文章目录 前言style transfer原理原理解析损失函数 style transfer代码效果图 fast style transfer 代码效果图 前言 本篇来带大家看看VGG的实战篇&#xff0c;这次来带大家看看计算机视觉中一个有趣的小任务&#xff0c;图像风格迁移。 可运行代码位于&#xff1a; Style_tr…

python爬虫基础:requests库详解与案例

1.Requests模块的使用 requests模块的介绍与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据。 中文文档&#xff1a;https://requests.readthedocs.io/projects/cn/zh_CN/latest/ 对于爬虫任务&#xff0c;使用 requests模块基本能够解决绝大部分的数据抓取的…

Spring 容器相关的核心注解​

以下是 Spring 容器中用于 ​​Bean 管理、依赖注入、配置控制​​ 的关键注解&#xff0c;按功能分类说明&#xff1a; ​​1. Bean 声明与注册​​ 注解作用示例​​Component​​通用注解&#xff0c;标记一个类为 Spring Bean&#xff08;自动扫描注册&#xff09; Compo…

C与指针5——字符串合集

常用函数 1、拷贝、长度、比较 size_t strlen();\\返回无符号整形 char* strcpy();char* strncpy();\\拷贝 int strcmp();int strncmp();\\比较 char* strcat();char* strncat();\\连接2、查找 char* strchr(const char * st,int ch);\\找字符第一次出现的位置 char* strrch…

论软件需求管理

目录 摘要&#xff08;300~330字&#xff09; 正文&#xff08;2000~2500字&#xff0c;2200字为宜&#xff09; 背景介绍&#xff08;500字做左右&#xff09; 论点论据&#xff08;1500字做左右&#xff09; 收尾&#xff08;200字左右&#xff09; 注&#xff1a;本篇论…

[特殊字符] 如何在比赛前调整到最佳状态:科学与策略结合的优化指

&#x1f9e0; 概述 在竞技体育中&#xff0c;赛前状态的调整对比赛结果起着决定性作用。所谓“最佳状态”&#xff0c;不仅指生理上的巅峰表现&#xff0c;更包括心理、认知、营养和恢复等多方面的协同优化。本文结合运动科学、心理学和营养学的研究成果&#xff0c;探讨赛前…

一种实波束前视扫描雷达目标二维定位方法——论文阅读

一种实波束前视扫描雷达目标二维定位方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 运动平台几何建模与回波信号构建2.1.1 距离历史建模2.1.2 回波信号模型2.2 距离向运动补偿技术2.2.1 匹配滤波与距离压缩2.3 加权最小二乘目标函数2.3.1 方位向信号…

基于 Spring Boot 瑞吉外卖系统开发(八)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;八&#xff09; 自动填充公共字段 MyBatis-Plus公共字段自动填充&#xff0c;也就是在插入或者更新的时候为指定字段赋予指定的值&#xff0c;使用它的好处就是可以统一对这些字段进行处理&#xff0c;降低了冗余代码的数量。本…

【前端】从零开始的搭建结构(技术栈:Node.js + Express + MongoDB + React)book-management

项目路径总结 后端结构 server/ ├── controllers/ # 业务逻辑 │ ├── authController.js │ ├── bookController.js │ ├── genreController.js │ └── userController.js ├── middleware/ # 中间件 │ ├── authMiddleware…

【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means

一、向量化表示的核心概念 1.1 特征空间与向量表示 多维特征表示&#xff1a;通过多个特征维度&#xff08;如体型、毛发长度、鼻子长短等&#xff09;描述对象&#xff0c;每个对象对应高维空间中的一个坐标点&#xff0c;来表示狗这个对象&#xff0c;这样可以区分出不同种…

如何用CSS实现HTML元素的旋转效果

原文&#xff1a;如何用CSS实现HTML元素的旋转效果 | w3cschool笔记 &#xff08;本文为科普文章&#xff0c;请勿标记为付费&#xff09; 在网页制作中&#xff0c;为 HTML 元素设置旋转效果可使其更灵动&#xff0c;提升用户体验。本文将深入浅出地介绍如何利用 CSS 实现 H…

Spark集群搭建之Yarn模式

配置集群 1.上传并解压spark-3.1.2-bin-hadoop3.2.tgz&#xff0c;重命名解压之后的目录为spark-yarn。 2. 修改一下spark的环境变量&#xff0c;/etc/profile.d/my_env.sh 。 # spark 环境变量 export SPARK_HOME/opt/module/spark-yarn export PATH$PATH:$SPARK_HOME/bin:$SP…

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no

【序列贪心】摆动序列 / 最长递增子序列 / 递增的三元子序列 / 最长连续递增序列

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;贪心算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 摆动序列最长递增子序列递增的三元子序列最长连续递增序列 摆动序列 摆动序列 贪心策略&#xff1a;统计出所有的极大值和极小…