Vite打包優化實踐:從分包到性能提升

前言:
???????
隨著前端應用功能的增加,項目的打包體積也會不斷膨脹,影響加載速度和用戶體驗。本文介紹了幾種常見的打包優化策略,通過Vite和相關插件,幫助減少項目體積、提升性能,優化加載速度。

rollup-plugin-visualizer

rollup-plugin-visualizer插件,是一個可視化工具,以圖表的形式,展示打包結果的模塊構成與體積分布。

安裝:

pnpm add rollup-plugin-visualizer -D
 

用法:

// vite.config.tsimport?{ visualizer }?from?"rollup-plugin-visualizer";module.exports = {plugins: [visualizer()],
};

pnpm build?一下, 打開生成的stats.html文件。

圖片

xlsx?、html2canvasjspdf,這3個第三方庫占了主要部分。

分包策略

在項目中,xlsxhtml2canvasjspdf,只在對應功能模塊中使用,可以單獨打包出來,用戶使用對應功能,才會下載對應js腳本。

rollupOptions選項的?manualChunks函數中控制分包邏輯,并配合?experimentalMinChunkSize?屬性,閥值設置為 20 KB,模塊大小,大于20kb的才會單獨打包成chunk。

rollupOptions: {experimentalLogSideEffects:?true,
output: {experimentalMinChunkSize:?20?*?1024,manualChunks:?(id: string) =>?{if?(id.includes('html2canvas')) {return'html2canvas';}if?(id.includes('jspdf')) {return'jspdf';}if?(id.includes('xlsx')) {return'xlsx';}}}
}

build一下,查看控制臺信息。

圖片

成功的將這3個第三方庫單獨打包成

chunkvite默認會把所有靜態資源都打包到assets文件夾,配置chunkFileNamesentryFileNamesassetFileNames將靜態資源分類。

?chunkFileNames:?'static/js/[name]-[hash].js', // 代碼分割后文件名entryFileNames:?'static/js/[name]-[hash:6].js', // 入口文件名assetFileNames:?'static/[ext]/[name]-[hash].[ext]'?// 靜態資源文件名

build一下,打包后到結果:

圖片

減少包體積

vite-plugin-remove-console移除consele

安裝:

pnpm add vite-plugin-remove-console -D

用法:

// vite.config.ts
import?{ defineConfig }?from?"vite";
import?vue?from?"@vitejs/plugin-vue";
import?removeConsole?from?"vite-plugin-remove-console";// https://vitejs.dev/config/
export?default?defineConfig({plugins: [vue(), removeConsole()]
});

vite-plugin-compression壓縮代碼

vite-plugin-compression插件壓縮代碼成gzip格式或者br格式,ngixn開啟gizp,http緩存策略。

安裝:

pnpm add vite-plugin-compression -D

配置說明

參數

類型

默認值

說明

verbose

booleantrue

是否在控制臺輸出壓縮結果

filter

RegExp or (file: string) => booleanDefaultFilter

指定哪些資源不壓縮

disable

booleanfalse

是否禁用

threshold

number

-

體積大于 threshold 才會被壓縮,單位 b

algorithm

stringgzip

壓縮算法,可選 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']

ext

string.gz

生成的壓縮包后綴

compressionOptions

object

-

對應的壓縮算法的參數

deleteOriginFile

boolean

-

壓縮后是否刪除源文件

用法:

import?viteCompression?from?'vite-plugin-compression';export?default?() => {return?{plugins: [?viteCompression({threshold:?1024?*?20,?algorithm:?'gzip',ext:?'.gz'})]};
};

build一下:

圖片

修改壓縮算法,打包成br格式:

import?viteCompression?from?'vite-plugin-compression';export?default?() => {return?{plugins: [?viteCompression({threshold:?1024?*?20,?algorithm:?'brotliCompress',ext:?'.br'})]};
};

打包結果:

圖片

br格式,明顯比gzip格式還小。

外鏈CDN

如果條件允許外鏈接CDN,那么使用rollup-plugin-external-globals?插件將外部依賴映射為全局變量,避免將其打包進最終文件,減小文件體積。配合vite-plugin-html?自動注入代碼到HTML文件中。

安裝:

pnpm add vite-plugin-html rollup-plugin-external-globals -D

用法

import?{ defineConfig }?from'vite';
import?vue?from'@vitejs/plugin-vue';
import?{ createHtmlPlugin }?from'vite-plugin-html';
import?externalGlobals?from'rollup-plugin-external-globals';const?cdn = {
jspdf:?'jspdf',
xlsx:?'XLSX',
html2canvas:?'html2canvas'
};const?externalList =?Object.keys(cdn);const?globals = externalGlobals(cdn);// https://vitejs.dev/config/
exportdefault?defineConfig({
plugins: [vue(),createHtmlPlugin({minify:?true,inject: {data: {jspdfscript:'<script src="https://cdn.jsdelivr.net/npm/jspdf@2.5.1/dist/jspdf.umd.min.js"></script>',xlsxscript:'<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>',html2canvasscript:'<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>'}}})],
build: {rollupOptions: {external: externalList,plugins: [visualizer({?open:?true?}), globals]}}
});

index.html中使用CDN腳本:

<!doctype?html>
<html?lang="en">
<head><meta?charset="UTF-8"?/><link?rel="icon"?href="/favicon.ico"?/><meta?name="viewport"?content="width=device-width, initial-scale=1.0"?/><title>AIChat</title><%-?xlsxscript?%><%-?jspdfscript?%><%-?html2canvasscript?%>
</head>
<body><div?id="app"></div><script?type="module"?src="/src/main.ts"></script>
</body>
</html>

對比效果:

優化前:1.7MB

優化后:899KB

總結

  1. 可視化分析:使用?rollup-plugin-visualizer?直觀查看打包后的模塊大小,找出大體積模塊進行優化。

  2. 分包策略:通過?manualChunks?將大依賴庫分離到單獨的chunk,減少首屏加載資源。

  3. 去除無用 console:利用?vite-plugin-remove-console?刪除開發環境中的console,減少打包體積。

  4. 代碼壓縮:通過?vite-plugin-compression?壓縮代碼為?gzip?或?brotli?格式,減小文件大小。

  5. 外鏈CDN:使用?rollup-plugin-external-globals?和?vite-plugin-html?將常用庫通過CDN加載,避免將它們打包到最終文件。

這些優化策略成功將打包體積從1.7MB減少到899KB,提升了應用性能。

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

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

相關文章

C++語法系列之模板進階

前言 本次會介紹一下非類型模板參數、模板的特化(特例化)和模板的可變參數&#xff0c;不是最開始學的模板 一、非類型模板參數 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;靜態棧就可以用到&#…

html5的響應式布局的方法示例詳解

以下是HTML5實現響應式布局的5種核心方法及代碼示例: 1. 媒體查詢(核心方案) /* 默認樣式(移動優先) */ .container {padding: 15px; }/* 中等屏幕(平板) */ @media (min-width: 768px) {.container {padding: 30px;max-width: 720px;} }/* 大屏幕(桌面) */ @media …

數字化轉型進階:精讀41頁華為數字化轉型實踐【附全文閱讀】

該文檔聚焦華為數字化轉型實踐&#xff0c;核心內容如下&#xff1a; 轉型本質與目標&#xff1a;數字化轉型是通過數字技術穿透業務&#xff0c;實現物理世界與數字世界的融合&#xff0c;目標是支撐主業成功、提升體驗與效率、探索模式創新。華為以 “平臺 服務” 為核心&am…

C++ - STL #什么是STL #STL的版本 #閉源開源 #STL的六大組件

文章目錄 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、閉源、開源 四、STL的六大組件 總結 前言 路漫漫其修遠兮&#xff0c;吾將上下而求索&#xff1b; 一、什么是STL STL(standard template libaray 標準模板庫)&#…

智慧康養護理:科技重塑老齡化社會的健康守護體系

在我國邁入深度老齡化社會的背景下&#xff0c;智慧康養護理作為融合科技與人文的創新模式&#xff0c;正成為提升老年人生活質量、減輕家庭照護壓力、促進健康老齡化的重要路徑。我們將從核心概念、關鍵技術、實際應用與未來趨勢四個維度&#xff0c;為您呈現智慧康養護理的全…

權威認證與質量保障:第三方檢測在科技成果鑒定測試中的核心作用

科技成果鑒定測試是衡量科研成果技術價值與應用潛力的關鍵環節&#xff0c;其核心目標在于通過科學驗證確保成果的可靠性、創新性和市場適配性。第三方檢測機構憑借其獨立性、專業性和權威性&#xff0c;成為科技成果鑒定測試的核心支撐主體。本文從測試流程、第三方檢測的價值…

Linux.docker.k8s基礎概念

1.Linux基本命令 cat 查看文件內容。 cd 進入目標目錄。 ll 查詢當前路勁下文件的詳細信息。 ls 查詢當前路勁下的文件。 touch 建立一個文件。 mkdir 建立一個文件夾。 rm 刪除文件或者目錄。 mv 移動目錄和重新命名文件。 unzip 解壓。 top 查看當前線程的信息。 find …

Python小白的蛻變之旅:從環境搭建到代碼規范(1/10)

摘要&#xff1a;全文圍繞 Python 編程展開&#xff0c;先是介紹如何搭建 Python 開發環境&#xff0c;推薦使用 Anaconda 和 VSCode&#xff0c;并詳細說明了二者的安裝及配置步驟&#xff0c;包括安裝 Anaconda、安裝 VSCode 并配置 Python 插件、選擇 Anaconda 的 Python 解…

linux 1.0.7

用戶和權限的含義與作用 linux中的用戶和文件 用戶的權限是非常重要的 而且有些程序需要使用管理員身份去執行 這些都是非常重要的 不可能讓所有的人擁有所有的權限 這樣的工具可以避免非法的手段來修改計算機中的數據 linux之所以安全還是權限管理做的很棒 每個登錄的用戶都有…

【第4章 圖像與視頻】4.6 結合剪輯區域來繪制圖像

文章目錄 前言示例 前言 本節將綜合運用圖像處理、離屏 canvas 以及剪輯區域等技術實現墨鏡效果。 示例 主線程代碼&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&qu…

UV 包管理工具:替代 pip 的現代化解決方案

安裝 方法一&#xff1a;使用安裝腳本 # macOS 和 Linux curl -LsSf https://astral.sh/uv/install.sh | sh# Windows PowerShell powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 方法二&#xff1a;使用包管理器 # macOS (Homebrew) brew install uv#…

Java注解規范與使用詳解

注解中的空值限制 在Java注解中,元素值不允許使用null引用。這是注解使用中的一項重要約束規則,違反該規則將導致編譯錯誤。需要注意的是,雖然禁止使用null值,但允許為String類型元素指定空字符串(“”),為數組類型元素指定空數組({})。 空值約束示例 以下兩種注解用法…

從零開始的數據結構教程(八)位運算與狀態壓縮

&#x1f3a9; 標題一&#xff1a;位運算基礎——魔術師的二進制手套 位運算是一種直接操作數字二進制位的運算方式&#xff0c;它高效且巧妙&#xff0c;就像魔術師戴上了二進制手套&#xff0c;能夠精準地操控每一個比特。理解位運算是深入學習狀態壓縮和其他底層優化技巧的…

GraalVM加持下的Quarkus極速啟動

1. 引言 1.1 Quarkus與云原生時代的挑戰 隨著云原生架構的普及,傳統Java應用在部署效率、資源消耗和冷啟動性能方面逐漸暴露出短板。Spring Boot等框架雖然功能強大,但在Serverless、邊緣計算等場景下表現乏力。 Quarkus 是 Red Hat 推出的一個專為云原生設計的 Java/Kotl…

vue3 el-input type=“textarea“ 字體樣式 及高度設置

在Vue 3中&#xff0c;如果你使用的是Element Plus庫中的<el-input>組件作為文本域&#xff08;type"textarea"&#xff09;&#xff0c;你可以通過幾種方式來設置字體樣式和高度。 1. 直接在<el-input>組件上使用style屬性 你可以直接在<el-input&…

Matlab中gcb、gcbh、gcs的區別

gcb&#xff1a;返回當前選中模塊的完整路徑名&#xff08;字符串&#xff09; gcbh&#xff1a;返回當前選中模塊的句柄&#xff08;數值標識符&#xff09; gcs&#xff1a;返回當前打開或選中的子系統或頂層模型路徑&#xff08;字符串&#xff09;

大語言模型的技術原理與應用前景:從Transformer到ChatGPT

目錄 摘要 1. 引言 2. Transformer架構核心原理 2.1 自注意力機制 2.2 位置編碼 2.3 前饋神經網絡 3. 從GPT到ChatGPT的演進 3.1 GPT系列模型架構 3.2 訓練流程優化 4. 應用場景與案例分析 4.1 代碼生成 4.2 文本摘要 4.3 問答系統 5. 挑戰與未來方向 5.1 當前技…

Flink Table API 編程入門實踐

Flink Table API 編程入門實踐 前言 Apache Flink 是目前大數據實時計算領域的明星產品&#xff0c;Flink Table API 則為開發者提供了聲明式、類似 SQL 的數據處理能力&#xff0c;兼具 SQL 的易用性與編程 API 的靈活性。本文將帶你快速了解 Flink Table API 的基本用法&am…

Android之ListView

1&#xff1a;簡單列表(ArrayAdapter) 1&#xff1a;運行的結果&#xff1a; 2&#xff1a;首先在MyListView里面創建一個按鈕&#xff0c;點擊的時候進行跳轉。 這里讓我吃驚的是&#xff0c;Button里面可以直接設置onClick .java里面的方法。 也即是點擊這個按鈕之后就會去…

Python(十四)

1.type函數和init_subclass_ init_subclass_ 2.元類 類就是用來創建對象的模版&#xff0c;類是由type創造而來的&#xff0c;元類就是創建類的模版&#xff0c;type可以用來創造類&#xff0c;因為type本身就是一個元類&#xff0c;使用元類來創造類&#xff0c;元類之間也有…