【Vue】从 Vue CLI 到 Vite 的一些变化总结

Vue 官方已经将 Vue CLI 设置为维护模式, Vite 也正式成为了 Vue 官方推荐的构建工具,这里就总结一下这次升级带来的一些简单变化。照例,官方文档地址在这里

Vite 默认的目标平台

Vite 默认的目标平台是现代浏览器,我们引用官方的描述:

用于生产环境的构建包会假设目标浏览器支持现代 JavaScript 语法。默认情况下,Vite 的目标是能够 支持原生 ESM script 标签、支持原生 ESM 动态导入 和 import.meta 的浏览器:

Chrome >=87
Firefox >=78
Safari >=13
Edge >=88

你也可以通过 build.target 配置项 指定构建目标,最低支持 es2015。

最低支持到 es2015 对于很多传统浏览器来说,还是太新了,我们如何支持传统浏览器呢? 官方提供了 @vitejs/plugin-legacy 插件来帮助我们,继续抄一下官方

传统浏览器可以通过插件 @vitejs/plugin-legacy 来支持,它将自动生成传统版本的 chunk 及与其相对应 ES 语言特性方面的 polyfill。兼容版的 chunk 只会在不支持原生 ESM 的浏览器中进行按需加载。

安装方法如下:

npm add -s @vitejs/plugin-legacy
npm add -s terser // Terser 也是需要安装的,因为 plugin-legacy 使用 Terser 做 minification.

然后修改 vite.config.js:

import legacy from '@vitejs/plugin-legacy';

export default defineConfig({
  plugins: [
    vue(),
    legacy(),
  ],
})

关于 @vitejs/plugin-legacy 的更多配置选项,可以参考 @vitejs/plugin-legacy

index.html

相较于 Vue CLI 的中 index.html 默认位于 public 目录下,Vite 的 index.html 是直接在项目最外层的,这是有意为之的变化,在开发期间 Vite 是一个服务器,而 index.html 是该 Vite 项目的入口文件。也就是说,如果你把 index.html 放到了别的位置,那么你的 npm run dev 启动的网页,在默认配置下就无法工作了。

cover

有很多朋友可能更习惯于将 index.html 放到 src 目录下,而不是 Vite 项目的根目录,那么我们需要修改如下配置:

// vite.config.js
export default defineConfig({
  root: './src', // 将 Vite 项目的根目录设置为 ./src
});

该选项拥有相当大的副作用,它实际上是将整个项目的根目录都重新指定到了 ./src 下,这会导致打包输出的结果 ./dist 实际的目录是 ./src/dist, 而和 ./src 同级的 ./public 里的文件,并不会再被作为 public 文件打包了,为了解决这两个问题,我们还需要对配置做如下修改:

// vite.config.js
export default defineConfig({
  root: './src', // 将 Vite 项目的根目录设置为 ./src
  publicDir: '../public', // 此时的相对路径,已经以 `./src` 作为了起点,这样我们才重新指向了原来的 public 文件
  build: {
    outDir: '../dist', // 此时的相对路径,已经以 `./src` 作为了起点,这样我们才重新指向了原来的 dist 文件夹
    emptyOutDir: true, // 由于 build.outDir 被设置在 root 外部,Vite 将默认不清空这个 outDir(这是为了),我们需要开启这个选项,才能让 Vite 在每次打包的时候继续清空 outDir
  },
});

可以看到上面的相对路径起点相当的混乱,对于 root 而言,它显然仍然是以 vite.config.js 所在目录作为起点,而对于 publicDirbuild.outDir, 他们又在以 root 下指定的目录作为起点,为了减少这种混乱带来的心智成本,我们不妨直接全部改用绝对路径,如下:

// vite.config.js
export default defineConfig({
  root: fileURLToPath(new URL("./src", import.meta.url)),
  publicDir: fileURLToPath(new URL("./public", import.meta.url)),
  build: {
    outDir: fileURLToPath(new URL("./dist", import.meta.url)),
    emptyOutDir: true,
  },
});

如果是新开的项目,那么还是推荐直接使用默认的 index.html 位置,减少配置成本。

之前的入口文件 (main.js) 配置去哪里了?

在 Vite 中,main.js 的路径,不再像 Vue CLI 一样,体现在配置文件中了, 其实我们打开 index.html 后不难发现,其实 main.js 在它里面引入了。

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

如果你需要为这个 index.html 指定其他入口文件,那显然只需要修改上面的代码就可以了。 Vite 在打包的时候,会把这一句话去掉,改为引入打包后的 js 文件

base

可以起到和 Vue CLi 中的 publicPath 一样的作用,当你的网站需要在非根目录下访问的时候使用。更详细的介绍可以看这里