Vue 打包优化

Vue 项目打包优化通常涉及多个方面,包括但不限于代码分割、懒加载、Tree Shaking、压缩资源、使用 CDN 引入第三方库、服务端 gzip 压缩等。由于你并未提供具体的场景或目标(比如是 Vue CLI 项目还是 Vite 项目)

常用 Vue 打包优化方法概览

1. 使用路由懒加载减少初始 bundle 大小

将不同页面按需加载,只在访问对应路由时才加载其 JS 文件。

复制代码
const Home = () => import('@/views/Home.vue')
2. 第三方库外链引入(CDN)

对于大型库如 vue, element-uiaxios,可通过 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"
  }
}
相关推荐
木斯佳2 小时前
前端八股文面经大全:快手前端一面 (2026-03-29)·面经深度解析
前端·宏任务·原型链·闭包
皙然2 小时前
Redis配置文件(redis.conf)超详细详解
前端·redis·bootstrap
卷帘依旧3 小时前
JavaScript中this绑定问题详解
前端·javascript
dweizhao3 小时前
突发!Claude Code源码泄露了
前端
sunny_4 小时前
💥 Claude Code 源码泄露?我把这个最强 AI Coding Agent 的架构扒干净了
前端·agent·claude
西洼工作室4 小时前
React轮播图优化:通过延迟 + 动画的组合,彻底消除视觉上的闪烁感
前端·react.js·前端框架
yaaakaaang4 小时前
(八)前端,如此简单!---五组结构
前端·javascript
我是若尘4 小时前
我的需求代码被主干 revert 了,接下来我该怎么操作?
前端·后端·代码规范
魁首4 小时前
Claude Code 源码泄露的背后,到底与Codex,Gemini 有啥不一样?
前端·openai·claude