vite 将 react/antd 核心包变成 external/umd 方式

Vite 里将一些常用组件包,外置,加速打包体积

01 添加依赖

核心依赖

  • 选装
  • 必装
# 打包前、后对比 -> 会在根目录产生一个 stats.html 文件
yarn add --dev rollup-plugin-visualizer
# 必装
yarn add --dev vite-plugin-externals

02 核心 vite 配置

常用配置 vite.config.ts

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { viteExternalsPlugin } from 'vite-plugin-externals';
import { visualizer } from 'rollup-plugin-visualizer';

// import { VitePWA } from 'vite-plugin-pwa';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    visualizer(),
    react(),
    viteExternalsPlugin({
      'js-beautify': 'jsBeautify',
      'sortablejs': 'Sortable',
      'prismjs': 'Prism',
      'lodash': '_',
      'axios': 'axios',
      'react': 'React',
      'react-dom': 'ReactDOM',
      'antd': 'antd'
    })
  ],
  build: {
    rollupOptions: {
      // plugins: [visualizer()],
      external: ['react', 'react-dom', 'antd', '@ant-design/icons', 'dayjs'],
      output: {
        format: 'umd',
        globals: {
          'react': 'React',
          'react-dom': 'ReactDOM',
          'antd': 'antd',
          'dayjs': 'dayjs',
          '@ant-design/icons': 'icons'
        }
      }
    }
  }
});

03 对应 umd 在 global 中添加

核心 HTML 引入对应在的 UMD 包

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="referrer" content="never" />
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
  <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
  <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.7/dayjs.min.js"></script>
  <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/ajax/libs/antd/5.3.1/antd.min.js"></script>
  <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/ajax/libs/ant-design-icons/5.0.1/index.umd.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.3/beautify.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.8.4/axios.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.15.6/Sortable.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://unpkg.com/@jswork/loading-screen@1.0.7/dist/lskit.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <link crossorigin="anonymous" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/antd/5.3.1/reset.min.css" />
  <link rel='stylesheet' type='text/css' href='https://unpkg.com/@jswork/loading-screen@1.0.7/dist/index.css' />
  <title>Admin</title>
</head>
<body>
<div id="root"></div>
<script>
  if (global === undefined) var global = window;
</script>
<script type="module" src="/src/main.tsx"></script>
<script>
  window.lskit();
</script>
</body>
</html>