本指南将基于一个真实的博客项目,通过7个关键优化步骤,将打包体积从初始的3.2MB压缩到最终的412KB,首屏加载时间从4.1秒降至0.8秒。所有操作均可直接在项目中实践验证。
一、项目初始化与基准测试
1. 创建示例博客项目
npm create vue@latest vue3-blog-demo
# 选择基础配置
cd vue3-blog-demo
npm install
2. 安装分析工具
npm install rollup-plugin-visualizer -D
3. 配置vite.config.ts
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { visualizer } from 'rollup-plugin-visualizer'export default defineConfig({plugins: [vue(),visualizer({open: true,filename: 'stats.html'})]
})
4. 首次构建分析
npm run build
初始构建结果:
-
总大小: 3.2MB
-
主要问题:未压缩、未拆分、第三方库未优化
二、基础优化三剑客
1. 代码压缩配置
// vite.config.ts
export default defineConfig({build: {minify: 'terser',terserOptions: {compress: {drop_console: true,drop_debugger: true}}}
})
2. 自动Polyfill检测
npm install @vitejs/plugin-legacy -D
// vite.config.ts
import legacy from '@vitejs/plugin-legacy'export default defineConfig({plugins: [legacy({targets: ['defaults', 'not IE 11']})]
})
3. Gzip压缩支持
npm install vite-plugin-compression -D
// vite.config.ts
import viteCompression from 'vite-plugin-compression'export default defineConfig({plugins: [viteCompression({algorithm: 'gzip',ext: '.gz'})]
})
优化后效果:
-
总体积: 1.8MB (↓43%)
-
JS体积: 1.2MB → 680KB
三、模块拆分与按需加载
1. 手动代码分割
// vite.config.ts
export default defineConfig({build: {rollupOptions: {output: {manualChunks(id) {if (id.includes('node_modules')) {return 'vendor'}if (id.includes('src/components')) {return 'components'}}}}}
})
2. 异步组件实践
<!-- 路由配置示例 -->
const ArticleDetail = defineAsyncComponent(() => import('@/views/ArticleDetail.vue')
)const routes = [{ path: '/article/:id', component: ArticleDetail }
]
3. 动态导入优化
// 传统方式
import marked from 'marked'// 优化后
const marked = await import('marked').then(m => m.default)
优化后效果:
-
首屏体积: 680KB → 420KB
-
可交互时间: 2.8s → 1.9s
四、第三方库深度优化
1. CDN引入示例
<!-- index.html -->
<script src="https://cdn.jsdelivr.net/npm/vue@3.2.37/dist/vue.global.prod.js"></script>
// vite.config.ts
export default defineConfig({build: {rollupOptions: {external: ['vue'],output: {globals: {vue: 'Vue'}}}}
})
2. 按需引入实践
// Element Plus优化示例
import { ElButton, ElInput } from 'element-plus'// 自动按需导入配置
// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({plugins: [AutoImport({resolvers: [ElementPlusResolver()]}),Components({resolvers: [ElementPlusResolver()]})]
})
3. 替换轻量级库
# 替换moment.js为day.js
npm uninstall moment
npm install dayjs
优化后效果:
-
第三方库体积: 1.1MB → 380KB
-
构建时间: 34s → 21s
五、静态资源优化策略
1. 图片压缩方案
npm install vite-plugin-imagemin -D
// vite.config.ts
import viteImagemin from 'vite-plugin-imagemin'export default defineConfig({plugins: [viteImagemin({gifsicle: { optimizationLevel: 7 },optipng: { optimizationLevel: 7 },mozjpeg: { quality: 75 },pngquant: { quality: [0.8, 0.9] },svgo: {plugins: [{ name: 'removeViewBox' },{ name: 'removeEmptyAttrs', active: false }]}})]
})
2. SVG雪碧图生成
npm install vite-plugin-svg-icons -D
// vite.config.ts
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'export default defineConfig({plugins: [createSvgIconsPlugin({iconDirs: [path.resolve(process.cwd(), 'src/icons')],symbolId: 'icon-[dir]-[name]'})]
})
3. 字体文件优化
/* 使用woff2格式 */
@font-face {font-family: 'CustomFont';src: url('/fonts/custom.woff2') format('woff2');
}
优化后效果:
-
图片体积: 820KB → 310KB
-
字体文件: 1.2MB → 480KB
六、进阶优化技巧
1. 预渲染配置
npm install vite-plugin-prerender -D
// vite.config.ts
import { prerender } from 'vite-plugin-prerender'export default defineConfig({plugins: [prerender({staticDir: path.join(__dirname, 'dist'),routes: ['/', '/about', '/articles']})]
})
2. 服务端压缩配置
# Nginx配置示例
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
3. 缓存策略优化
# 静态资源长期缓存
location /assets {expires 1y;add_header Cache-Control "public, immutable";
}
七、最终优化成果
指标 | 优化前 | 优化后 | 提升幅度 |
---|---|---|---|
总体积 | 3.2MB | 412KB | ↓87% |
JS体积 | 2.1MB | 238KB | ↓88.7% |
首屏加载时间 | 4.1s | 0.8s | ↓80.5% |
构建时间 | 45s | 18s | ↓60% |
八、持续优化建议
-
性能监控体系:集成Lighthouse CI
-
按需Polyfill:使用Polyfill.io动态服务
-
现代构建模式:配置
build.modern
选项 -
HTTP/2优化:启用服务器推送功能
-
代码拆分策略:基于路由的智能拆分
结语
通过以上实战步骤,我们系统性地解决了Vue 3应用的打包体积问题。但需要特别注意:优化策略需要根据实际项目需求选择,过度优化可能导致开发体验下降。建议建立性能基准,在每次迭代中进行对比验证。
如果对你有帮助,请帮忙点个赞