vite vue3 项目优化

79 阅读2分钟

下面介绍的只是我自己用到的,还有更过的插件参考官网:cn.vitejs.dev/plugins/

vite.config.ts 基础配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  base: './',
  plugins: [vue()]
})

别名

import {resolve} from 'path'
 resolve: {
  alias: {
    '@': resolve(__dirname, 'src/components')
  }
 }

Tree Shaking

vite 已经默认开启了这个功能,无需其他配置

// package.json
  "sideEffects": [
    "**/*.css"
  ]

cdn 加速

npm i vite-plugin-cdn-import -D

//vite.config.js
 plugins: [
    viteCDNPlugin({
      // 需要 CDN 加速的模块
      modules: [
        {
          name: 'lodash',
          var: '_',
          path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
        },
        {
          name: "element-plus",
          var: 'ElementPlus',
          path: "https://unpkg.com/element-plus",
          css: "https://unpkg.com/element-plus/dist/index.css"
        }
      ]
    })
  ]

///////////////////////
npm install rollup-plugin-external-globals -D

import externalGlobals from 'rollup-plugin-external-globals';

const globals = externalGlobals({
  moment: 'moment',
  // 'video.js': 'videojs',
  // jspdf: 'jspdf',
  // xlsx: 'XLSX',
  react:react,
  react-dom:refact-dom
});

export default defineConfig({
    build: {
        rollupOptions: {
            external: ['moment', 'react','react-dom'],
            plugins: [globals],
        }
    }
});

//在 index.html 模版中引入对应库的CDN
    <script src="//cdn.haier.net/assets/overlay/dts-fe/common-assets/es5-shim/4.5.14/es5-shim.min.js"></script>
    <script src="//cdn.haier.net/assets/overlay/dts-fe/common-assets/es5-shim/4.5.14/es5-sham.min.js"></script>
    <script src="//cdn.haier.net/assets/overlay/dts-fe/common-assets/@babel/polyfill/7.21.1/polyfill.min.js"></script>

打包代码压缩

npm i vite-plugin-compression -D

//vite.config.ts
import { createCompression } from 'vite-plugin-compression'

  plugins: [
    vue(),
    viteCompression({
      //生成压缩包gz
      verbose: true, // 输出压缩成功
      disable: false, // 是否禁用
      threshold: 1, // 体积大于阈值会被压缩,单位是b
      algorithm: 'gzip', // 压缩算法
      ext: '.gz',// 生成的压缩包后缀
    }),
  ]

压缩图片

npm i vite-plugin-imagemin -D

// vite.config.ts
npm install vite-plugin-minipic -D
import { defineConfig,loadEnv} from 'vite'
import viteImagemin from 'vite-plugin-imagemin'
export default  ({ mode }) => defineConfig({
  plugins: [
    viteImagemin({
      gifsicle: { // gif图片压缩
        optimizationLevel: 3, // 选择1到3之间的优化级别
        interlaced: false, // 隔行扫描gif进行渐进式渲染
        // colors: 2 // 将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间。
      },
      optipng: { // png
        optimizationLevel: 7, // 选择0到7之间的优化级别
      },
      mozjpeg: {// jpeg
        quality: 20, // 压缩质量,范围从0(最差)到100(最佳)。
      },
      pngquant: {// png
        quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字,类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量,图像将不会被保存。
        speed: 4, // 压缩速度,1(强力)到11(最快)
      },
      svgo: { // svg压缩
        plugins: [
          {
            name: 'removeViewBox',
          },
          {
            name: 'removeEmptyAttrs',
            active: false,
          },
        ],
      },
    }),
  ]
})

生产环境下清空console.log

build: {
  chunkSizeWarningLimit: 1000, // 提高超大静态资源警告大小
	minify: 'terser',
	terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true
      }
    }
}

打包分析插件

打包后,会在根目录下生成一个 stats.html文件

npm install rollup-plugin-visualizer -D

// viet.config.js
import { defineConfig } from 'vite'
import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
    plugins: [visualizer()]
})

监听文件修改

通过监听文件修改,自动重启 vite 服务

npm i vite-plugin-restart -D

//viet.config.js
import ViteRestart from 'vite-plugin-restart'
export default {
  plugins: [
    ViteRestart({
      restart: [
        'vite.config.js',
      ]
    })
  ],
};

跨域

  server: {
    host: "0.0.0.0",
    hmr: true,
    strictPort: false,
    //自定义代理规则
    proxy: {
      // 选项写法
      "/api": {
        target: "",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^/api/, ""),
      },
    },
  },

js最小拆分包

// 配置vite.config 的 output 属性;让打开那个页面,加载那个页面的js ,让之间的关联足够小
  output: {
    // 最小化拆分包
    manualChunks(id) {
      if (id.includes('node_modules')) {
        return id.toString().split('node_modules/')[1].split('/')[0].toString();
      }
    }
  },
  // 不建议配置,未来此配置将废弃