Vue 项目打包优化通常涉及多个方面,包括但不限于代码分割、懒加载、Tree Shaking、压缩资源、使用 CDN 引入第三方库、服务端 gzip 压缩等。由于你并未提供具体的场景或目标(比如是 Vue CLI 项目还是 Vite 项目)
常用 Vue 打包优化方法概览
1. 使用路由懒加载减少初始 bundle 大小
将不同页面按需加载,只在访问对应路由时才加载其 JS 文件。
const Home = () => import('@/views/Home.vue')
2. 第三方库外链引入(CDN)
对于大型库如 vue, element-ui 或 axios,可通过 CDN 加载并在 webpack 配置中排除它们。
3. 启用 Gzip/Brotli 压缩传输
服务器开启静态资源压缩能显著提升加载速度。
4. Tree Shaking 清除未使用的代码
确保导入方式正确并启用生产环境模式来自动清除无用代码。
5. 分析打包结果 (webpack-bundle-analyzer)
帮助识别哪些模块占用空间较大以便针对性优化。
6. 动态 Polyfill 注入(适用于低版本浏览器适配)
7. 图片压缩和格式转换(WebP)提高渲染效率
8. 构建缓存利用:Webpack5 自带持久化缓存机制加速 rebuild 过程
Vue CLI 项目的 webpack 优化配置:
vue.config.js:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
// 生产环境构建配置
productionSourceMap: false, // 关闭生产环境 source map
// 配置 webpack 优化选项
configureWebpack: {
// 外部扩展配置,通过 CDN 引入减少打包体积
externals: {
'vue': 'Vue',
'element-ui': 'ELEMENT',
'echarts': 'echarts'
},
// 性能提示配置
performance: {
maxAssetSize: 1000000, // 1MB
maxEntrypointSize: 1000000
}
},
// 链式配置 webpack
chainWebpack: config => {
// 图片压缩配置
config.module
.rule('images')
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: [0.65, 0.90], speed: 4 },
gifsicle: { interlaced: false }
})
// 预加载和预获取配置
config.plugin('preload').tap(() => [
{
rel: 'preload',
include: 'initial',
fileBlacklist: [/\.map$/, /hot-update\.js$/]
}
])
config.plugin('prefetch').tap(() => [
{
rel: 'prefetch',
include: 'asyncChunks'
}
])
},
// CSS 相关配置
css: {
extract: process.env.NODE_ENV === 'production' ? {
ignoreOrder: true
} : false, // 生产环境提取 CSS
sourceMap: false
}
})
pubilc/index.html
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<!-- CDN 引入外部依赖 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.15.6/lib/index.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.15.6/lib/theme-chalk/index.css">
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>
src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
// 路由懒加载配置
const routes = [
{
path: '/',
name: 'Home',
component: () => import(/* webpackChunkName: "home" */ '@/views/Home.vue')
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue')
},
{
path: '/dashboard',
name: 'Dashboard',
component: () => import(/* webpackChunkName: "dashboard" */ '@/views/Dashboard.vue')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
package.json
{
"name": "vue-optimization-example",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"analyze": "npm run build --report"
},
"dependencies": {
"core-js": "^3.8.3",
"vue": "^2.6.14",
"vue-router": "^3.5.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"image-webpack-loader": "^8.1.0",
"webpack-bundle-analyzer": "^4.5.0"
}
}
Vite 项目的优化配置:
vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
// 构建优化配置
build: {
// 启用 CSS 代码分割
cssCodeSplit: true,
// 自定义底层 Rollup 打包配置
rollupOptions: {
// 外部依赖配置(通过 CDN 引入)
external: ['vue', 'element-plus'],
// 输出配置
output: {
// 分割 chunks 配置
manualChunks: {
// 将第三方库单独打包
vendor: ['vue', 'vue-router'],
// 将 UI 库单独打包
ui: ['element-plus']
}
}
},
// 禁用 brotli 大小报告,提升构建速度
brotliSize: false,
// 构建后是否生成 source map 文件
sourcemap: false
},
// 优化依赖预构建
optimizeDeps: {
include: ['vue', 'vue-router']
},
// 静态资源处理
assetsInclude: ['**/*.gltf', '**/*.glb'] // 包含 3D 模型等特殊资源
})
src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
// 动态导入减少初始包大小
const app = createApp(App)
// 路由配置
app.use(router)
// 挂载应用
app.mount('#app')
// 生产环境性能监控
if (process.env.NODE_ENV === 'production') {
// 可以在这里添加性能监控代码
console.log('Production mode enabled')
}
package.json
{
"name": "vite-optimization-example",
"private": true,
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.2.25",
"vue-router": "^4.0.12"
},
"devDependencies": {
"@vitejs/plugin-vue": "^2.2.0",
"vite": "^2.8.0"
}
}