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