【ECharts】2. ECharts 性能優化

動態(按需)加載異步子組件

之前說過 ECharts 如何封裝,今天來講一講 ECharts 如何做性能優化。

對于之前 ECharts 的封裝子組件,我們可以使用 component 動態組件的方式進行渲染,并傳參。

并且使用 import 動態導入搭配 defineAsyncComponent 實現打包代碼分割,import 實現組件按需加載, defineAsyncComponent 實現將這些異步組件單獨打包,減小主包的體積。

而且統一封裝圖表組件,統一管理圖表配置 options,可以實現業務數據與圖表樣式配置分離。

在這里插入圖片描述

以下代碼均只保留核心代碼,已脫敏。

index.vue 中去實現動態渲染:

 <componentclass="w-full":is="echartsComponent"v-if="echartsComponent"v-bind="echartsProps"/>
  // 接收參數const props = defineProps({confgData: {type: Object,required: true,default: () => ({}),},boardData: {type: Object,required: true,default: () => ({}),},// componentKey: {//   type: String,//   required: true,// },});// ...// 所有的圖表按需加載const allEcharts = [{type: 'bar',component: defineAsyncComponent(() => import('./BarEcharts/index.vue')),},{type: 'pie',component: defineAsyncComponent(() => import('./PieCharts/index.vue')),},{type: 'line',component: defineAsyncComponent(() => import('./LineCharts/index.vue')),},{type: 'progress',component: defineAsyncComponent(() => import('./Progress/index.vue')),},];// 拋出一個父組件使用該組件修改內部配置的方式const emit = defineEmits(['updates']);// 針對不同圖表做不同的參數傳遞const echartsProps = computed(() => {if (confgData.value?.type === 'bar') {return {xAxisLabels: props.boardData.x_axis_labels,yAxisLabels: props.boardData.y_axis_labels,seriesData: props.boardData.series_data,isHorizontal: props.boardData?.y_axis_labels?.length >= 1,};} else if (confgData.value?.type === 'pie') {return {data: props.boardData.data,title: props.boardData?.title,};} else if (confgData.value?.type === 'progress') {return {percent: props.boardData.percent,title: props.boardData?.title,};} else {// 折線圖// obj 特殊化配置return {xAxisLabels: props.boardData.x_axis_labels,yAxisLabels: props.boardData.y_axis_labels,seriesData: props.boardData.series_data,isHorizontal: props.boardData?.y_axis_labels?.length > 1,...obj,};}});// 計算得到所需組件const echartsComponent = computed(() => {return allEcharts.find((item) => item.type === confgData.value?.type)?.component;});

按需導入 ECharts 包

按需引入 ECharts,而非全量引入,減小打包體積大小。

在全局入口文件中引用。

lib/echarts.ts

import * as echarts from 'echarts/core';import {BarChart,LineChart,// ...
} from 'echarts/charts';import {TitleComponent,TooltipComponent,// ... 
} from 'echarts/components';import { SVGRenderer } from 'echarts/renderers';echarts.use([LegendComponent,TitleComponent,// ...
]);export default echarts;

依賴預構建

依賴預構建 (Dependency Pre-Bundling)

vite.config.ts 文件中,相關的配置是 optimizeDeps.include

// vite.config.ts
export default defineApplicationConfig({overrides: {optimizeDeps: {include: ['echarts/core','echarts/charts','echarts/components','echarts/renderers',// ... other dependencies],},// ...},
});

這個配置是如何優化 ECharts 的?

  1. 優化對象:此優化主要針對 開發環境 (dev server),旨在提升開發時的頁面加載速度和熱更新性能。

  2. 工作原理

    • 問題背景
      1. ECharts 庫本身是由大量的小模塊組成的(例如,core 是核心,charts 目錄下有各種圖表類型,components 目錄下有提示框、圖例等組件)。
      2. 當我們在代碼中按需引入時(如 import { BarChart } from 'echarts/charts'),在開發模式下,瀏覽器需要根據 import 語句逐個去請求這些零散的模塊文件。
      3. 如果一個復雜的圖表需要幾十個模塊,就會導致瀏覽器發起大量的網絡請求,形成“請求瀑布流”,嚴重拖慢頁面首次加載速度。
    • Vite 的解決方案:Vite 在啟動開發服務器時,會先掃描項目代碼,找出所有依賴。對于 optimizeDeps.include 中明確列出的依賴,Vite 會使用速度極快的 esbuild 工具,提前將這些零散的模塊 “預構建” 成一個或少數幾個大的 JavaScript 文件。
      • 具體到 ECharts:配置中的 'echarts/core', 'echarts/charts', 'echarts/components', 'echarts/renderers' 告訴 Vite:“請提前把這幾個路徑下的所有 ECharts 模塊都找到,并將它們打包成一個整體。”
  3. 帶來的好處

    • 減少網絡請求:經過預構建,當瀏覽器需要加載 ECharts 時,不再是請求幾十個零散的小文件,而是只請求一個或幾個已經打包好的大文件。這極大地減少了 HTTP 請求開銷。
    • 模塊格式轉換esbuild 會將可能存在的 CommonJS 或 UMD 格式的模塊(一些舊的庫可能還在使用)統一轉換為瀏覽器原生支持的 ESM (ES Modules) 格式,避免了在瀏覽器端進行復雜的模塊解析。
    • 更快的頁面加載:最終結果就是,在開發環境中,包含 ECharts 圖表的頁面加載速度會得到顯著提升,讓開發體驗更加流暢。

注意:這個優化主要作用于 開發環境。在 生產環境打包 (build) 時,Vite 會利用 Rollup 和 Tree Shaking 機制,確保最終打包出的代碼只包含實際用到的 ECharts 模塊,以實現生產環境包體積的最小化。這里的 optimizeDeps 配置與最終的打包體積沒有直接關系。

圖表的屏幕適配

統一解決了窗口縮放時圖表的適應問題,避免因窗口縮放導致的 ECharts 圖表變形。(主要針對大屏)

  1. 使用 scale,縮放比例比較小,那么左右留白比較大。
  2. 推薦使用 vw/vh,動態計算寬高比例,字體等,比較靈活,避免大片留白。缺點:每個圖表都需要單獨做字體、間距、位移的適配,比較麻煩。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919898.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919898.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919898.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何創建自己的 Minecraft 世界

步驟1&#xff1a;準備虛擬服務器運行以下命令來更新系統的軟件包列表并應用所有待處理的升級&#xff1a;sudo apt update sudo apt upgrade -y您的系統已更新完畢&#xff0c;您已準備好進行下一步。第 2 步&#xff1a;安裝依賴項并創建安全用戶LinuxGSM 需要一些軟件才能正…

vue中監聽頁面滾動位置

vue中監聽頁面滾動位置問題描述實現代碼1. 獲取頁面被卷起的高度2. 監聽滾動事件問題描述 頁面滾動到指定位置時&#xff0c;展示側邊欄導航。 實現代碼 1. 獲取頁面被卷起的高度 使用 e.target.scrollTop可以獲取到頁面向上滾動了多少像素&#xff0c;代碼如下&#xff1a;…

docker:compose

docker三劍客&#xff1a;compose、swarm、machinemachine是在不同環境&#xff08;不同的操作系統平臺上安裝&#xff09;下部署docker的compose是做容器編排的swarm是做docker集群管理的Compose 簡介口任務&#xff08; task &#xff09; &#xff1a; 一個容器被稱為一個任…

GaussDB 數據庫架構師修煉(十八) SQL引擎-計劃管理-SQL PATCH

1 業務背景GaussDB的優化器生成計劃不優的情況下&#xff0c;對DBA調優過程中不對業務sql修改場景下&#xff0c;提供3種計劃管理&#xff0c;分別為plan hint,sql patch,spm。2 sql patch的使用場景在發現查詢語句的執行計劃、執行方式未達預期的場景下&#xff0c;可以通過創…

函數式編程從入門到精通

1.概述1.1為什么學&#xff1f;* 能夠看懂公司里的代碼 * 大數量下處理集合效率高 * 代碼可讀性高 * 消滅嵌套地獄//查詢未成年作家評分在70分以上的書籍&#xff0c;由于流的影響所以作家和書籍可能會重復出現&#xff0c;所以要去重public void test1() {List<Book> bo…

Overleaf 中文報錯和中文不顯示問題的解決方案

Overleaf是一個很方便的在線latex編輯工具。但在最初使用Overleaf的時候&#xff0c;是不是有很多小伙伴會遇到模板中中文報錯或者中文不顯示的問題呢&#xff1f; 本文將帶你一步步解決這個問題~ 中文報錯 在點擊重新編譯按鈕后&#xff0c;中文報錯問題一般會有如下圖紅框顯示…

前后端聯調場景以及可能會遇到的問題

一、異地和在一起辦公的方式 首先&#xff0c;在一起辦公&#xff08;同局域網&#xff09;的情況&#xff0c;最常用的應該是直接使用后端的局域網 IP 進行聯調&#xff0c;因為同一網絡內設備可以直接通信。步驟方面&#xff0c;需要后端提供 IP 和端口&#xff0c;前端配置…

【T113自制板卡】1 - 原理圖說明

文章目錄1、前言2、板卡資源總覽3、電源3.1、板卡供電3.2、電源方案4、OTG接口5、調試串口6、用戶LED7、FLASH8、按鍵9、BLE MESH10、Wi-Fi11、MIC12、喇叭接口13、MIPI接口1、前言 這幾天跟著小智學長的課程畫了一塊t113的板子。本文將描述該板卡的硬件說明。 2、板卡資源總…

WiFi有網絡但是電腦連不上網是怎么回事?該怎么解決?

有時候&#xff0c;咱們用電腦上網&#xff0c;打開WiFi一看&#xff0c;信號滿格&#xff0c;狀態欄顯示已連接&#xff0c;本來想著可以愉快地看個番、查個資料、玩個游戲了&#xff0c;結果一打開瀏覽器&#xff0c;直接完犢子了&#xff0c;網頁都打不開。這時候再看狀態&a…

【golang】制作linux環境+golang的Dockerfile | 如何下載golang鏡像源

一、關于如何下載docker images 這里需要大家自行科學上網如果沒有話&#xff0c;下面可以使用我自行打包的golang 的docker images 注意科學上網要開啟TUN模式二、golang鏡像源 1、阿里云公開鏡像 如果找不到golang包的小伙伴可以使用我的公開阿里鏡像docker pull registry.cn…

Day58 Java面向對象13 instanceof 和 類型轉換

Day58 Java面向對象13 instanceof 和 類型轉換 1.instanceof關鍵字 instanceof關鍵字的作用是判斷一個對象是否是某個類或其子類的實例,它返回一個布爾值true/false dog1 instanceof Dog; //返回true dog1 instanceof Animals; //返回true dog1 instanceof Object; //返回…

GEO優化案例:如何通過“知識圖譜+權威信號”提升品牌AI信任度

引言&#xff1a; “在AI日益成為用戶信息入口的今天&#xff0c;品牌信息能否被AI賦予‘權威’標簽&#xff0c;直接決定了其在搜索結果中的可見度和用戶采信度。移山科技正是這方面的專家。” 一、行業趨勢概覽&#xff1a;AI時代的品牌信任與GEO的價值 2025年&#xff0c…

讓數據可視化更簡單:Embedding Atlas使用指南

Embedding Atlas&#xff1a;交互式的嵌入可視化工具 在大數據時代&#xff0c;如何有效地理解和利用高維數據變得愈發重要。Embedding Atlas 是一款致力于提供大型嵌入&#xff08;embeddings&#xff09;交互式可視化的工具&#xff0c;允許用戶對嵌入數據進行可視化、交叉過…

復雜場景魯棒性突破!陌訊自適應融合算法在廠區越界檢測的實戰優化?

一、行業痛點&#xff1a;越界檢測的復雜場景挑戰 工業廠區周界安防中&#xff0c;越界檢測極易受環境干擾。據《2024工業智能安防白皮書》統計&#xff08;注1&#xff09;&#xff0c;強逆光、雨霧天氣導致傳統算法誤報率超35%&#xff0c;而密集設備遮擋造成的漏檢率高達28…

Huggingface入門實踐 Audio-NLP 語音-文字模型調用(一)

吳恩達LLM-Huggingface_嗶哩嗶哩_bilibili 目錄 0. huggingface 根據需求尋找開源模型 1. Whisper模型 語音識別任務 2. blenderbot 聊天機器人 3. 文本翻譯模型translator 4. BART 模型摘要器&#xff08;summarizer&#xff09; 5. sentence-transformers 句子相似度 …

Python-Pandas GroupBy 進階與透視表學習

??一、數據分組&#xff08;GroupBy&#xff09;????核心概念??&#xff1a;將數據按指定字段分組&#xff0c;對每組進行聚合、轉換或過濾操作。??1. 分組聚合&#xff08;Aggregation&#xff09;??將分組數據聚合成單個值&#xff08;如平均值、總和&#xff09…

MQTT 核心概念與協議演進全景解讀(二)

MQTT 在物聯網中的應用實例智能家居中的設備聯動在智能家居系統里&#xff0c;MQTT 協議扮演著至關重要的角色&#xff0c;是實現設備間高效通信與智能聯動的核心樞紐。以常見的智能家居場景為例&#xff0c;當清晨的陽光緩緩升起&#xff0c;光線傳感器檢測到光照強度的變化&a…

燧原科技招大模型訓練算法工程師

高級大模型訓練算法工程師&#xff08;崗位信息已經經過jobleap.cn授權&#xff0c;可在csdn發布&#xff09;燧原科技 上海職位描述負責大模型在AI芯片預訓練和微調等研發和客戶支持工作&#xff1b; 參與大模型訓練精度分析和性能調優&#xff1b;職位要求985/211大學計算機…

基于Java虛擬線程的高并發作業執行框架設計與性能優化實踐指南

基于Java虛擬線程的高并發作業執行框架設計與性能優化實踐指南 一、技術背景與應用場景 在分布式系統和微服務架構中&#xff0c;后端常需承載海量異步作業&#xff08;如批量數據處理、定時任務、異步消息消費等&#xff09;&#xff0c;對作業執行框架提出了高并發、高吞吐、…

了解 PostgreSQL 的 MVCC 可見性基本檢查規則

1. 引言 根據 Vadim Mikheev 的說法&#xff0c;PostgreSQL 的多版本并發控制&#xff08;MVCC&#xff09;是一種“在多用戶環境中提高數據庫性能的高級技術”。該技術要求系統中存在同一數據元組的多個“版本”&#xff0c;這些版本由不同時間段內獲取的快照進行管理。換句話…