Webpack 迁移到 Vite 笔记

Rain2021-03-16 11:06webVueWebpackVite配置

TIP

项目环境: vue-cli 创建的基于 webpack 的 vue3 项目

记录从 webpack 迁移到 vite 踩过的坑

主要完成

  • 配置 Vue3 官方插件
  • 添加兼容 CMD 规范及传统浏览器的 vite 官方插件
  • 添加支持 Vue3 TSX 的官方插件
  • 配置项目目录别名
  • 配置组件库的按需加载
  • 配置组件库的样式覆盖

第一步

将 public 文件夹下的 index.html 移动到根目录下并添加如下代码片段

<script type="module" src="/src/main.ts"></script>

第二步

删除已经不再需要的 vue-cli 相关插件和 vue.config.js 文件

  • "@vue/cli-plugin-babel": "~5.0.0-alpha.2",
  • "@vue/cli-plugin-eslint": "~5.0.0-alpha.2",
  • "@vue/cli-plugin-router": "~5.0.0-alpha.2",
  • "@vue/cli-plugin-typescript": "~5.0.0-alpha.2",
  • "@vue/cli-plugin-vuex": "~5.0.0-alpha.2",
  • "@vue/cli-service": "~5.0.0-alpha.2",

安装如下插件并添加 vite.config.ts 文件

  • "@vitejs/plugin-legacy": "^1.3.1", // 兼容 CMD 规范及传统浏览器,类似于 babel
  • "@vitejs/plugin-vue": "^1.1.5", // Vue3 官方插件
  • "@vitejs/plugin-vue-jsx": "^1.1.2", // 支持 Vue3 TSX 的官方插件

第三步

配置 vite.config.js

import { resolve } from "path";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import vitePluginImp from "vite-plugin-imp";
import legacy from "@vitejs/plugin-legacy";

export default defineConfig({
  base: "./",
  resolve: {
    alias: [
      { find: "~", replacement: resolve(__dirname, "./") }, // 配置别名
      { find: "@", replacement: resolve(__dirname, "./src") },
    ],
  },
  // css加载器相关配置
  css: {
    preprocessorOptions: {
      less: {
        lessOptions: {
          modifyVars: {
            // 通过hack方式覆盖组件库样式
            hack: `true; @import "./src/assets/style.less"`,
          },
        },
      },
    },
  },
  plugins: [
    vue(),
    vueJsx(),
    // 利用vitePluginImp配置组件库的按需加载。参考组件库官网
    vitePluginImp({
      libList: [
        {
          libName: "vant",
          style(name) {
            if (/CompWithoutStyleFile/i.test(name)) {
              // This will not import any style file
              return false;
            }
            return `vant/es/${name}/index.css`;
          },
        },
      ],
    }),
    legacy({
      targets: ["defaults", "not IE 11"],
    }),
  ],
});

Last Updated 4/4/2022, 11:33:25 AM