Vue 项目打包优化:使用 webpack-bundle-analyzer 分析包体积并拆分第三方依赖

1. 安装依赖
npm install --save-dev webpack-bundle-analyzer
# 或
yarn add -D webpack-bundle-analyzer

2. 配置 vue.config.js

在项目根目录创建/修改 vue.config.js

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  configureWebpack: {
    plugins: [
      new BundleAnalyzerPlugin({
        analyzerMode: 'server',    // 启动HTTP服务器展示报告
        analyzerHost: '127.0.0.1', // 主机地址
        analyzerPort: 8888,        // 端口号
        openAnalyzer: true,        // 完成后自动打开浏览器
        reportFilename: 'report.html', // 报告文件名
        defaultSizes: 'parsed',    // 显示解析后的大小
      })
    ],
    optimization: {
      splitChunks: {
        chunks: 'all',
        minSize: 20000,           // 最小拆分包大小(20KB)
        maxSize: 250000,          // 最大拆分包大小(250KB)
        cacheGroups: {
          // 拆分第三方依赖
          vendors: {
            test: /[\\/]node_modules[\\/]/,
            name: 'vendors',
            priority: -10,
          },
          // 拆分常用工具库
          utils: {
            test: /[\\/]src[\\/]utils[\\/]/,
            name: 'utils',
            minChunks: 1,
            priority: -20
          }
        }
      }
    }
  }
}

3. 运行分析报告
npm run build --report
# 或
vue-cli-service build --report

构建完成后会自动打开 http://127.0.0.1:8888 显示可视化分析图:


(图中不同颜色区块代表不同模块的体积占比)


4. 优化策略(基于分析结果)
(1) 按需加载第三方库
// 错误示例:全量引入 lodash
import _ from 'lodash';

// 正确示例:按需引入
import debounce from 'lodash/debounce';

(2) CDN 引入大型库

vue.config.js 添加:

module.exports = {
  chainWebpack: config => {
    config.externals({
      vue: 'Vue',
      'vue-router': 'VueRouter',
      axios: 'axios'
    });
  }
}

public/index.html 中引入CDN:

<head>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js"></script>
</head>

(3) 异步加载路由组件
// router.js
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ './views/About.vue');


5. 验证优化效果

重新构建后对比:

指标 优化前 优化后
总包大小 3.2MB 1.4MB
首屏加载时间 2.8s 1.1s
第三方依赖占比 68% 32%

关键公式
首屏加载时间优化率:
$$ \text{优化率} = \frac{T_{\text{before}} - T_{\text{after}}}{T_{\text{before}}} \times 100% $$


6. 注意事项
  1. 优先处理分析图中 大于 100KB 的模块
  2. 使用 webpackChunkName 规范异步组件命名
  3. 定期更新 CDN 链接的版本号
  4. 生产环境关闭分析器:
plugins: process.env.NODE_ENV === 'production' 
  ? [] 
  : [new BundleAnalyzerPlugin()]

通过以上步骤,可显著降低打包体积,提升应用加载性能。建议每次依赖更新后重新分析包结构。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐