最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3進行打包配置的優(yōu)化指南

 更新時間:2026年06月02日 11:45:54   作者:AI磚家  
隨著 Vue3 項目的業(yè)務(wù)迭代,打包體積過大、首屏加載緩慢逐漸成為影響用戶體驗的核心問題,本文將詳細介紹如何通過精細化的打包配置,實現(xiàn)代碼分包、剔除冗余 Console 日志,并結(jié)合最佳實踐,幫助你將項目打包體積縮減 70%,首屏加載速度提升 60%

隨著 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.logdebugger 語句。Vite 提供了兩種壓縮方式:esbuildterser。

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.warnconsole.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 MB500 KB縮減 80%
首屏加載時間3.2 s1.3 s提升 60%
Vendor Chunk1.8 MB200 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)文章

  • vue中實現(xiàn)彈出層動畫效果的示例代碼

    vue中實現(xiàn)彈出層動畫效果的示例代碼

    這篇文章主要介紹了vue中怎樣實現(xiàn)彈出層動畫效果,由上而下漸漸顯示,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • vue中移動端調(diào)取本地的復(fù)制的文本方式

    vue中移動端調(diào)取本地的復(fù)制的文本方式

    這篇文章主要介紹了vue中移動端調(diào)取本地的復(fù)制的文本方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • QT和vue交互的實現(xiàn)示例

    QT和vue交互的實現(xiàn)示例

    本文主要介紹了QT和vue交互的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • vue3清空let?arr?=?reactive([])的實現(xiàn)示例

    vue3清空let?arr?=?reactive([])的實現(xiàn)示例

    本文主要介紹了vue3清空let?arr?=?reactive([])的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • element?表格多級表頭子列固定的實現(xiàn)

    element?表格多級表頭子列固定的實現(xiàn)

    本文主要介紹了element?表格多級表頭子列固定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • vue bus全局事件中心簡單Demo詳解

    vue bus全局事件中心簡單Demo詳解

    ue-bus 提供了一個全局事件中心,并將其注入每一個組件,你可以像使用內(nèi)置事件流一樣方便的使用全局事件。這篇文章給大家介紹了vue bus全局事件中心簡單Demo,需要的朋友參考下吧
    2018-02-02
  • vue+el-menu實現(xiàn)菜單欄無限多層級分類

    vue+el-menu實現(xiàn)菜單欄無限多層級分類

    這篇文章主要為大家詳細介紹了vue+el-menu實現(xiàn)菜單欄無限多層級分類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vuex之理解Getters的用法實例

    Vuex之理解Getters的用法實例

    這篇文章主要介紹了Vuex之理解Getters的用法實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • webpack+vue.js快速入門教程

    webpack+vue.js快速入門教程

    隨著前端的快速發(fā)展,非常多的js框架被應(yīng)用到項目中。Vue.js本身支持對組件的異步加載,配合Webpack的分塊打包功能,可以極其輕松地實現(xiàn)組件的異步按需加載。 這篇文章是webpack+vue.j的入門教程,有需要的可以參考借鑒。
    2016-10-10
  • 一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解

    一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解

    這篇文章主要為大家介紹了一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論

临桂县| 伽师县| 沛县| 维西| 舒兰市| 洛阳市| 合江县| 安龙县| 芒康县| 聊城市| 泰宁县| 高要市| 鄱阳县| 汽车| 新蔡县| 昌吉市| 江北区| 泗水县| 闸北区| 东平县| 阿荣旗| 汝南县| 康保县| 普兰县| 南靖县| 达孜县| 西和县| 蒙山县| 垣曲县| 孙吴县| 宁都县| 汝州市| 吉水县| 吉首市| 洛宁县| 普陀区| 青州市| 鹰潭市| 珲春市| 象山县| 康保县|