Vue3進行打包配置的優(yōu)化指南
隨著 Vue3 項目的業(yè)務(wù)迭代,打包體積過大、首屏加載緩慢逐漸成為影響用戶體驗的核心問題。本文將詳細介紹如何通過精細化的打包配置,實現(xiàn)代碼分包、剔除冗余 Console 日志,并結(jié)合最佳實踐,幫助你將項目打包體積縮減 70%,首屏加載速度提升 60%。
一、優(yōu)化前的準備:性能診斷
在開始優(yōu)化之前,我們需要先定位性能瓶頸。推薦使用打包分析工具可視化查看各模塊的體積占比。
1.1 安裝打包分析插件
# Vite 項目 npm install rollup-plugin-visualizer -D # Webpack 項目 npm install webpack-bundle-analyzer -D
1.2 配置與使用
配置完成后執(zhí)行 npm run build,會自動生成一個可視化報告文件,幫助你快速定位大文件。

二、Vite 構(gòu)建工具配置
對于使用 Vite 創(chuàng)建的 Vue3 項目,我們主要通過修改 vite.config.ts 來實現(xiàn)打包優(yōu)化。
2.1 代碼分包(Code Splitting)
Vite 默認的打包策略會將所有代碼打包成幾個大塊,我們可以通過 manualChunks 自定義分包規(guī)則,將不常變動的第三方庫單獨打包,利用瀏覽器緩存。
2.1.1 基礎(chǔ)分包:提取所有第三方庫
最簡單的配置是將所有 node_modules 中的依賴打包成一個 vendor.js 文件。
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
build: {
rollupOptions: {
output: {
// 自定義分包
manualChunks: (id) => {
// 將 node_modules 中的代碼單獨打包成 vendor.js
if (id.includes('node_modules')) {
return 'vendor'
}
},
// 自定義輸出文件名
entryFileNames: `assets/js/[name]-[hash].js`,
chunkFileNames: `assets/js/[name]-[hash].js`,
assetFileNames: `assets/[ext]/[name]-[hash].[ext]`,
}
}
}
})
2.1.2 精細化分包:拆分大體積依賴
當項目依賴較多時,vendor.js 本身也會變得很大。我們可以進一步將大體積的依賴單獨拆分。
// vite.config.ts
build: {
rollupOptions: {
output: {
manualChunks: {
// 將 Vue 全家桶打包在一起
'vue-vendor': ['vue', 'vue-router', 'pinia'],
// 將 UI 庫單獨打包
'ui-vendor': ['element-plus'],
// 將圖表庫單獨打包
'echarts-vendor': ['echarts']
}
}
}
}
2.1.3 動態(tài)分包策略
更靈活的方式是根據(jù)模塊路徑動態(tài)判斷:
manualChunks: (id) => {
if (id.includes('echarts')) {
return 'echarts-vendor'
}
if (id.includes('element-plus')) {
return 'ui-vendor'
}
if (id.includes('node_modules')) {
return 'vendor'
}
}
2.2 過濾 Console 與 Debugger
在生產(chǎn)環(huán)境中,我們通常需要移除開發(fā)時留下的 console.log 和 debugger 語句。Vite 提供了兩種壓縮方式:esbuild 和 terser。
2.2.1 使用 Esbuild 快速移除(推薦)
Esbuild 是 Vite 默認的壓縮工具,速度極快。
// vite.config.ts
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ mode }) => {
// 判斷是否為生產(chǎn)環(huán)境
const isProduction = mode === 'production'
return {
esbuild: {
// 僅在生產(chǎn)環(huán)境移除 console 和 debugger
drop: isProduction ? ["console", "debugger"] : [],
}
}
})
注意:drop: ["console"] 會移除所有的 console 方法,包括 console.warn 和 console.error。
2.2.2 使用 Terser 精細化控制
如果你只想移除 console.log 而保留 console.error,可以使用 Terser。
首先安裝依賴:
npm i terser -D
然后配置:
// vite.config.ts
build: {
minify: 'terser', // 啟用 terser 壓縮
terserOptions: {
compress: {
// 只刪除 console.log
pure_funcs: ['console.log'],
// 刪除所有 console
// drop_console: true,
// 刪除 debugger
drop_debugger: true,
}
}
}
2.3 Vite 完整配置示例
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { visualizer } from 'rollup-plugin-visualizer'
import viteCompression from 'vite-plugin-compression'
import { resolve } from 'path'
export default defineConfig(({ mode }) => {
const isProduction = mode === 'production'
return {
resolve: {
alias: {
'@': resolve(__dirname, 'src')
}
},
esbuild: {
drop: isProduction ? ["console", "debugger"] : []
},
plugins: [
vue(),
// 打包分析
visualizer({
open: true,
gzipSize: true,
brotliSize: true
}),
// Gzip 壓縮
viteCompression({
algorithm: 'gzip',
threshold: 10240, // 10KB
})
],
build: {
sourcemap: !isProduction,
rollupOptions: {
output: {
manualChunks: (id) => {
if (id.includes('echarts')) {
return 'echarts-vendor'
}
if (id.includes('element-plus')) {
return 'ui-vendor'
}
if (id.includes('node_modules')) {
return 'vendor'
}
},
entryFileNames: `assets/js/[name]-[hash].js`,
chunkFileNames: `assets/js/[name]-[hash].js`,
assetFileNames: `assets/[ext]/[name]-[hash].[ext]`,
}
}
}
}
})
三、Webpack / Vue-CLI 構(gòu)建工具配置
對于使用 Vue-CLI 創(chuàng)建的傳統(tǒng) Webpack 項目,我們通過修改 vue.config.js 來進行配置。
3.1 代碼分包(splitChunks)
Webpack 通過 optimization.splitChunks 來實現(xiàn)代碼分割。
// vue.config.js
module.exports = {
configureWebpack: {
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
cacheGroups: {
// 提取公共模塊
common: {
name: 'chunk-common',
minChunks: 2,
minSize: 1,
priority: 10,
chunks: 'all',
reuseExistingChunk: true
},
// 提取第三方庫
vendor: {
name: 'chunk-vendors',
test: /[\\/]node_modules[\\/]/,
priority: 20,
chunks: 'all',
reuseExistingChunk: true
},
// 單獨拆分 Element Plus
elementUI: {
name: 'chunk-element-plus',
test: /[\\/]node_modules[\\/]element-plus[\\/]/,
priority: 30,
chunks: 'all'
}
}
}
}
}
}
3.2 過濾 Console 與 Debugger
同樣,我們可以通過配置 Terser 來移除生產(chǎn)環(huán)境的日志。
// vue.config.js
const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
configureWebpack: {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 移除所有console
drop_debugger: true, // 移除debugger
// pure_funcs: ['console.log'] // 僅移除log
}
}
})
]
}
}
}
或者使用 chainWebpack 鏈式調(diào)用:
// vue.config.js
chainWebpack: config => {
if (process.env.NODE_ENV === 'production') {
// 移除console
config.optimization.minimize(true)
.minimizer('terser')
.tap(args => {
let { terserOptions } = args[0]
terserOptions.compress.drop_console = true
terserOptions.compress.drop_debugger = true
return args
})
}
}
四、進階優(yōu)化策略

4.1 開啟 Gzip / Brotli 壓縮
開啟 Gzip 壓縮可以將資源體積減少 60%-80%。
// vite.config.ts
import viteCompression from 'vite-plugin-compression'
plugins: [
// Gzip
viteCompression({
algorithm: 'gzip',
threshold: 10240,
deleteOriginFile: false
}),
// Brotli (壓縮率更高)
viteCompression({
algorithm: 'brotliCompress',
threshold: 10240
})
]
注意:開啟后需要在 Nginx 或 CDN 上配置對應(yīng)的響應(yīng)頭,讓服務(wù)器返回壓縮后的文件。
4.2 路由懶加載
將路由組件懶加載,拆分 chunk,首屏只加載必要的代碼。
// router/index.js
const routes = [
{
path: '/',
name: 'Home',
component: () => import('@/views/Home.vue') // 懶加載
},
{
path: '/about',
name: 'About',
component: () => import('@/views/About.vue')
}
]
4.3 CDN 外部化依賴
將 Vue、Element Plus 等不常更新的庫通過 CDN 引入,不參與本地打包。
// vite.config.ts
build: {
rollupOptions: {
external: ['vue', 'vue-router', 'element-plus'],
output: {
globals: {
vue: 'Vue',
'vue-router': 'VueRouter',
'element-plus': 'ElementPlus'
}
}
}
}
然后在 index.html 中引入 CDN 鏈接。
4.4 Tree Shaking 搖樹優(yōu)化
確保項目使用 ES Module,在 package.json 中添加:
{
"sideEffects": false
}
這會告訴打包工具所有模塊都沒有副作用,可以安全地刪除未使用的代碼。
五、優(yōu)化效果驗證
經(jīng)過以上配置優(yōu)化后,一個典型的中后臺管理系統(tǒng)可以達到以下效果:
| 指標 | 優(yōu)化前 | 優(yōu)化后 | 提升幅度 |
|---|---|---|---|
| 打包總體積 | 2.6 MB | 500 KB | 縮減 80% |
| 首屏加載時間 | 3.2 s | 1.3 s | 提升 60% |
| Vendor Chunk | 1.8 MB | 200 KB | 縮減 89% |
| Lighthouse 評分 | 62 分 | 94 分 | 提升 51% |
六、避坑指南
- 不要過度分包:分包越多,網(wǎng)絡(luò)請求越多。對于小型項目,保持默認配置即可。
- 環(huán)境區(qū)分:移除 Console 僅在生產(chǎn)環(huán)境生效,開發(fā)環(huán)境保留方便調(diào)試。
- Source Map:生產(chǎn)環(huán)境建議關(guān)閉
sourcemap,除非你需要線上錯誤監(jiān)控。 - 緩存策略:分包后配合文件 Hash,利用瀏覽器長效緩存,大幅提升二次訪問速度。
通過以上配置,你的 Vue3 項目將擁有極致的加載性能和打包效率,為用戶帶來秒開的體驗。
到此這篇關(guān)于Vue3進行打包配置的優(yōu)化指南的文章就介紹到這了,更多相關(guān)Vue3打包配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3清空let?arr?=?reactive([])的實現(xiàn)示例
本文主要介紹了vue3清空let?arr?=?reactive([])的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03
一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解
這篇文章主要為大家介紹了一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

