【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.pswp.cn/web/78327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78327.shtml
英文地址,請注明出處:http://en.pswp.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;統計出所有的極大值和極小…