VUE3項(xiàng)目VITE打包優(yōu)化的實(shí)現(xiàn)
1、前言
Vue項(xiàng)目開(kāi)發(fā)完畢后,對(duì)項(xiàng)目進(jìn)行打包發(fā)布之前,必不可少的操作就是項(xiàng)目?jī)?yōu)化,這也是程序猿的加分項(xiàng)。跟隨本文的腳步來(lái)看看如何對(duì)項(xiàng)目進(jìn)行優(yōu)化吧!
2、視圖分析工具rollup-plugin-visualizer
在項(xiàng)目中使用rollup-plugin-visualizer 插件可以生成可視化的代碼分析報(bào)告,看看哪些模塊占用了空間,幫助我們更好地了解構(gòu)建過(guò)程中的文件大小、依賴關(guān)系等信息。
- 首先安裝了
rollup-plugin-visualizer
插件??梢允褂?nbsp;npm
或者yarn
進(jìn)行安裝:
yarn add rollup-plugin-visualizer -D npm i rollup-plugin-visualizer -D
- 在
vite.config.js
中引入rollup-plugin-visualizer
插件,并將其添加到插件列表中。
import { visualizer } from 'rollup-plugin-visualizer'; export default defineConfig({ plugins: [ vue(), visualizer({ open: true, //在默認(rèn)用戶代理中打開(kāi)生成的文件 gzipSize: true, // 收集 gzip 大小并將其顯示 brotliSize: true, // 收集 brotli 大小并將其顯示 filename: "stats.html", // 分析圖生成的文件名 }), })
配置的參數(shù)有很多是默認(rèn)的,如果你沒(méi)有特殊需求,完全可以不添加參數(shù);下面我添加一個(gè)表格對(duì)已有參數(shù)進(jìn)行詮釋:
參數(shù) | 類型 | 解釋 |
---|---|---|
filename/file | string | 生成分析的文件名 |
title | string | html標(biāo)簽頁(yè)標(biāo)題 |
open | boolean | 以默認(rèn)服務(wù)器代理打開(kāi)文件 |
template | string | 可選擇的圖表類型 |
gzipSize | boolean | 搜集gzip壓縮包的大小到圖表 |
BrotliSize | boolearn | 搜集brotli壓縮包的大小到圖表 |
emitFile | boolean | 使用emitFile生成文件,簡(jiǎn)單說(shuō),這個(gè)屬性為true,打包后的分析文件會(huì)出現(xiàn)在打包好的文件包下,否則就會(huì)在項(xiàng)目目錄下 |
sourcemap | boolean | 使用sourcemap計(jì)算大小 |
projectRoot | string, RegExp | 文件的根目錄,默認(rèn)在打包好的目錄下 |
- 運(yùn)行命令打包,生成分析圖。 執(zhí)行
npm run build
命令后等待片刻,生成分析視圖,視圖會(huì)自動(dòng)跳出來(lái),并保存在項(xiàng)目根目錄下,文件名就是剛剛參數(shù)filename
的名字(stats.htm
l)
npm run build
在生成的打包文件所在目錄下,會(huì)生成一個(gè)名為 stats.html
的文件,這就是生成的可視化報(bào)告。
打開(kāi) stats.html
文件,你將看到一個(gè)交互式的可視化圖表,顯示了打包文件中各個(gè)模塊的大小、依賴關(guān)系等信息。你可以通過(guò)這個(gè)圖表來(lái)識(shí)別哪些模塊占用了較大的空間,從而進(jìn)行代碼優(yōu)化。
視圖分析中方塊越大,表示該文件占用的空間越大,對(duì)于網(wǎng)絡(luò)帶寬和訪問(wèn)速度的要求就越高。如果一個(gè)網(wǎng)站中包含大量的大文件,那么用戶在訪問(wèn)該網(wǎng)站時(shí)需要下載更多的數(shù)據(jù),這會(huì)導(dǎo)致網(wǎng)站加載速度變慢,用戶體驗(yàn)變差。
3、路由懶加載
路由懶加載的實(shí)現(xiàn)方式通常是使用動(dòng)態(tài)導(dǎo)入(
Dynamic Import
)語(yǔ)法,比如在Vue
項(xiàng)目中使用import()
來(lái)導(dǎo)入需要懶加載的組件。當(dāng)用戶訪問(wèn)到對(duì)應(yīng)的路由時(shí),該組件才會(huì)被異步加載,實(shí)現(xiàn)了按需加載的效果。
export const constantRoute = [ { path: '/login', component: () => import('@/views/login/index.vue'), name: 'Login', meta: { title: '登錄', //菜單標(biāo)題 hidden: true, //代表路由標(biāo)題在菜單中是否隱藏 true:隱藏 false:不隱藏 icon: 'Promotion', }, }, { path: '/', component: () => import('@/layout/index.vue'), name: '/', meta: { title: '', hidden: false, }, redirect: '/home', children: [{ path: '/home', component: () => import('@/views/home/index.vue'), meta: { title: '項(xiàng)目總覽', hidden: false, icon: 'HomeFilled', }, },], }, { path: '/user', component: () => import('@/views/user/index.vue'), name: 'User', meta: { title: '個(gè)人中心', hidden: true, }, }, { path: '/404', component: () => import('@/views/404/index.vue'), name: '404', meta: { title: '找不到數(shù)據(jù)', hidden: true, }, }, ]
4、第三方庫(kù)CDN引入
在項(xiàng)目中可根據(jù)需要引入第三方庫(kù)
CDN
,使用CDN
引入第三方庫(kù)可以提高項(xiàng)目的性能和開(kāi)發(fā)效率,減少項(xiàng)目的體積,同時(shí)也可以減輕服務(wù)器的負(fù)擔(dān),提高用戶體驗(yàn)。
- 安裝插件
npm install vite-plugin-cdn-import -D yarn add vite-plugin-cdn-import -D
- 在
vite.config.js
中進(jìn)行配置
import { defineConfig } from 'vite'; import compression from 'vite-plugin-compression'; export default defineConfig({ // 其他配置項(xiàng)... plugins: [ // 其他插件... // 第三方庫(kù)CDN引入 importToCDN({ prodUrl: "https://unpkg.com/{name}@{path}", modules: [ autoComplete('vue'), autoComplete('axios'), { name: "vue-router", var: "VueRouter", path: "4.1.3", }, { name: "element-plus", var: "ElementPlus", path: "2.2.14", css: "2.2.14/dist/index.css", }, { name: "@element-plus/icons-vue", var: "ElementPlusIconsVue", // 根據(jù)main.js中定義的來(lái) path: "2.0.9", }, { name: "pinia", var: "Pinia", path: "2.0.34", }, { name: "lodash", var: "Lodash", path: "4.17.21", }, ], }), ], });
5、使用 gzip 壓縮
gzip
壓縮是一種常用的數(shù)據(jù)壓縮算法,它可以減小文件的大小,從而減少文件的傳輸時(shí)間和占用空間。gzip
壓縮算法基于DEFLATE
算法,使用了哈夫曼編碼和LZ77
算法來(lái)實(shí)現(xiàn)高效的數(shù)據(jù)壓縮。
當(dāng)使用gzip
壓縮文件時(shí),文件會(huì)被轉(zhuǎn)換為一種經(jīng)過(guò)壓縮和編碼的格式。這種格式可以通過(guò)減少冗余數(shù)據(jù)和使用更緊湊的編碼方式來(lái)降低文件的大小。壓縮后的文件通常以.gz
為擴(kuò)展名。
- 安裝插件
yarn add vite-plugin-compression -D npm i vite-plugin-compression -D
- 在
vite.config.js
中進(jìn)行配置
import { defineConfig } from 'vite'; import compression from 'vite-plugin-compression'; export default defineConfig({ // 其他配置項(xiàng)... plugins: [ // 其他插件... compression({ algorithm: "gzip", // 指定壓縮算法為gzip,[ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw'] ext: ".gz", // 指定壓縮后的文件擴(kuò)展名為.gz threshold: 10240, // 僅對(duì)文件大小大于threshold的文件進(jìn)行壓縮,默認(rèn)為10KB deleteOriginFile: false, // 是否刪除原始文件,默認(rèn)為false filter: /\.(js|css|json|html|ico|svg)(\?.*)?$/i, // 匹配要壓縮的文件的正則表達(dá)式,默認(rèn)為匹配.js、.css、.json、.html、.ico和.svg文件 compressionOptions: { level: 9 }, // 指定gzip壓縮級(jí)別,默認(rèn)為9(最高級(jí)別) verbose: true, //是否在控制臺(tái)輸出壓縮結(jié)果 disable: false, //是否禁用插件 }), ], });
6、按需引入第三方庫(kù)
對(duì)于一些較大的第三方庫(kù),如 Element UI或 Ant Design,可以考慮按需引入組件或樣式,而不是全部引入。按需引入組件或樣式可以參考這些第三方庫(kù)的官方文檔,在里面有介紹如何按需引入組件或樣式。
7、使用 Tree Shaking
treeshaking 也被稱為 “搖樹(shù)優(yōu)化”。簡(jiǎn)單來(lái)講,就是在保證代碼運(yùn)行結(jié)果不變的前提下,去除無(wú)用的代碼。Vue3中,許多 ApI的引入都支持 treeshaking 優(yōu)化。也就是說(shuō)只打包你用到的 API,忽略那些沒(méi)有用到的。
Vue3
會(huì)默認(rèn)使用 Rollup
進(jìn)行 treeshaking
,不需要額外進(jìn)行配置。但有一個(gè)條件,必須是 ES6 module
模塊才行。
8、剔除console和debugger
vite 4.X
版本已經(jīng)不集成terser
,需要自行下載。
yarn add terser -D npm i terser -D
- 在
vite.config.js
中進(jìn)行配置
import { defineConfig } from "vite"; export default defineConfig({ build: { minify: 'terser', // 啟用 terser 壓縮 terserOptions: { compress: { pure_funcs: ['console.log'], // 只刪除 console.log //drop_console: true, // 刪除所有 console drop_debugger: true, // 刪除 debugger } } } })
9、分包策略
默認(rèn)情況下,瀏覽器重復(fù)請(qǐng)求相同名稱的靜態(tài)資源時(shí),會(huì)直接使用緩存的資源。利用這個(gè)機(jī)制我們可以將不會(huì)經(jīng)常更新的代碼單獨(dú)打包成一個(gè)
JS
文件,這樣就可以減少HTTP
請(qǐng)求,同時(shí)降低服務(wù)器壓力。
manualChunks自定義分割
// vite.config.js import { defineConfig } from 'vite' export default defineConfig({ build: { rollupOptions: { output: { manualChunks: id => { // 將 node_modules 中的代碼單獨(dú)打包成一個(gè) JS 文件 if(id.includes('node_modules')) { return 'vendor' } } } } } })
可以看到依賴模塊已經(jīng)單獨(dú)生成一個(gè) JS
文件了。這樣我們即使修改了 main.js
中的代碼重新打包,依賴文件 vendor.b3aecacd.js
也不會(huì)發(fā)生變化的,對(duì)于這個(gè)文件,瀏覽器也不會(huì)再次發(fā)起請(qǐng)求。如果依賴模塊很多的話,性能將會(huì)有很大的提升。
10、圖片壓縮
根據(jù)項(xiàng)目對(duì)清晰度的要求,我們可以使用 vite-plugin-imagemin
插件,對(duì)圖片進(jìn)行適當(dāng)壓縮:
- 安裝
npm i vite-plugin-imagemin -D
插件 - 在
vite.config.js
中進(jìn)行配置
// vite.config.js import { defineConfig } from 'vite' import viteImagemin from 'vite-plugin-imagemin' export default defineConfig({ plugins: [ viteImagemin({ gifsicle: { optimizationLevel: 7, interlaced: false }, optipng: { optimizationLevel: 7 }, mozjpeg: { quality: 20 }, pngquant: { quality: [0.8, 0.9], speed: 4 }, svgo: { plugins: [ { name: 'removeViewBox' }, { name: 'removeEmptyAttrs', active: false } ] } }) ] })
注意:viteImagemin
在國(guó)內(nèi)比較難安裝,容易出現(xiàn)報(bào)錯(cuò),可以嘗試一下下面幾種解決方案。viteImagemin
報(bào)錯(cuò)
- 使用
yarn
在package.json
內(nèi)配置(推薦)
"resolutions": { "bin-wrapper": "npm:bin-wrapper-china" }
- 使用
npm
,在電腦host
文件加上如下配置即可
199.232.4.133 raw.githubusercontent.com
- 使用
cnpm
安裝(不推薦)
到此這篇關(guān)于VUE3項(xiàng)目VITE打包優(yōu)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)VUE3 VITE打包優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決vite build打包后頁(yè)面不能正常訪問(wèn)的情況
- vue3+ts+vite打包后靜態(tài)資源404無(wú)法加載js和css問(wèn)題解決辦法
- vite打包只生成了一個(gè)css和js文件問(wèn)題的解決方法
- vite打包出現(xiàn)?"default"?is?not?exported?by?"node_modules/...問(wèn)題解決辦法
- 關(guān)于vite+vue3打包部署問(wèn)題
- vite打包優(yōu)化分片打包依賴包詳解
- Vue3在history模式下如何通過(guò)vite打包部署白屏
- 解決vite打包后白屏之router-view不生效問(wèn)題
- VUE3?Vite打包后動(dòng)態(tài)圖片資源不顯示問(wèn)題解決方法
- vite分目錄打包及去掉默認(rèn)的.gz?文件的操作方法
- Vite中Rollup打包的實(shí)現(xiàn)
相關(guān)文章
electron-vite工具打包后如何通過(guò)內(nèi)置配置文件動(dòng)態(tài)修改接口地址
使用electron-vite?工具開(kāi)發(fā)項(xiàng)目打包完后每次要改接口地址都要重新打包,對(duì)于多環(huán)境切換或者頻繁變更接口地址就顯得麻煩,這篇文章主要介紹了electron-vite工具打包后通過(guò)內(nèi)置配置文件動(dòng)態(tài)修改接口地址實(shí)現(xiàn)方法,需要的朋友可以參考下2024-05-05vue中el-table實(shí)現(xiàn)自動(dòng)吸頂效果(支持fixed)
本文主要介紹了vue中el-table實(shí)現(xiàn)自動(dòng)吸頂效果,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09修改vue源碼實(shí)現(xiàn)動(dòng)態(tài)路由緩存的方法
這篇文章主要介紹了修改vue源碼實(shí)現(xiàn)動(dòng)態(tài)路由緩存的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01詳解在Vue中如何實(shí)現(xiàn)表單圖片裁剪與預(yù)覽
在前端開(kāi)發(fā)中,表單提交是一個(gè)常見(jiàn)的操作,有時(shí)候,我們需要上傳圖片,但是上傳的圖片可能會(huì)非常大,這會(huì)增加服務(wù)器的負(fù)擔(dān),同時(shí)也會(huì)降低用戶的體驗(yàn),因此,我們通常需要對(duì)上傳的圖片進(jìn)行裁剪和預(yù)覽,本文主要給大家介紹如何在Vue中進(jìn)行表單圖片裁剪與預(yù)覽2023-06-06Vue3使用setup監(jiān)聽(tīng)props實(shí)現(xiàn)方法詳解
這篇文章主要為大家介紹了Vue3使用setup監(jiān)聽(tīng)props實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08