总结一些Vite的常用配置,方便后续查阅
alias 配置 #
vite.config.ts 配置
注意事项
- 不建议使用相对路径,建议使用绝对路径
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
"@": "src",
},
},
});绝对路径:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
resolve: {
// ✅ 生成类似 '/Users/me/project/src' 这样的绝对路径
alias: {
'@': path.resolve(__dirname, 'src')
},
},
});tsconfig.json 配置
baseUrl 为项目根目录,paths 为路径别名
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}借助 vite-tsconfig-paths 插件,可以解决路径别名问题
文档:https://github.com/aleclarson/vite-tsconfig-paths
可以直接去掉 vite.config.ts 中的 resolve 配置
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), tsconfigPaths()],
});proxy 配置 #
vite.config.ts 配置
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
server: {
proxy: {
"/api": {
target: "http://localhost:3000",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
},
},
});如果不配置 rewrite,实际访问的地址为:http://localhost:3000/api/xxx
配置 rewrite 后,实际访问的地址为:http://localhost:3000/xxx
sourcemap 配置 #
配合 sentry + sentry-webpack-plugin 插件使用,可以实现源代码错误追踪
插件文档:https://www.npmjs.com/package/@sentry/vite-plugin
// vite.config.js
import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import { sentryVitePlugin } from "@sentry/vite-plugin"; // 引入插件
// 1. 从 package.json 读取版本号
const appVersion = process.env.npm_package_version;
// https://vite.dev/config/
export default defineConfig({
build: {
// 2. 确保 Sourcemap 开启,Sentry 插件才有 .map 文件可传
sourcemap: true,
},
plugins: [
// 3. Sentry 插件配置
sentryVitePlugin({
// 4. 从 .env 文件读取组织和项目
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
// 5. 从 .env 文件读取 Auth Token
authToken: process.env.SENTRY_AUTH_TOKEN,
sourcemaps: {
assets: "./dist/**", // 指定查找 sourcemap 的路径
// 6. (来自你的配置) 上传后删除
filesToDeleteAfterUpload: "./dist/**/*.map",
},
// 7. 关键:定义 release ID
// 格式必须与 main.ts 中 Sentry.init() 的 release 格式完全一致
release: {
name: `vue-project-sentry@${appVersion}`,
},
}),
],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
});terserOptions 配置 #
terser 是用于压缩 JavaScript 代码的工具
安装 terser 插件
pnpm install terser -Dminify 配置项用于压缩代码,terserOptions 配置项用于配置 terser 的压缩选项
vite.config.ts 配置
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import terser from "terser";
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), terser()],
build: {
minify: "terser",
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
},
},
},
});compress 配置项用于压缩代码,drop_console 和 drop_debugger 用于删除 console.log 和 debugger 语句
manualChunks 配置 #
manualChunks 配置项用于将代码分割成多个 chunk,可以提高代码的加载速度
主要是用于第三方库的分割,比如 react 和 react-dom 库,静态资源库的拆分
rollupOptions 配置项用于配置 rollup 的打包选项
vite.config.ts 配置
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import terser from "terser";
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), terser()],
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes("react") || id.includes("react-dom")) {
return "react-libs";
}
},
},
},
},
});会把 react 和 react-dom 库分割到 react-libs 这个 chunk 中
个人文档:https://hujiacheng2003.site/notes/vite-chunk-guide
动态拆包 #
动态拆包主要是用于按需加载,比如按路由拆包,按组件拆包等
一般是通过 import() 语句来动态加载模块,比如:
import("@/utils/sum").then(({ sum }) => {
console.log(sum(1, 2));
});此时 sum 函数会被分割到 sum[hash].js 文件中
环境变量 env #
环境变量配置在 .env 文件中,比如:
需要加前缀 VITE_ ,否则不会被识别为环境变量
VITE_APP_TITLE=vite-project-app
VITE_APP_API_URL=http://localhost:3000在代码中可以通过 import.meta.env 访问环境变量,比如:
console.log(import.meta.env.VITE_APP_TITLE);配置类型提示,需要在 global.d.ts 文件中添加类型提示,比如:
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string;
readonly VITE_APP_API_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}tsconfig.json 配置
{
"compilerOptions": {
"types": ["vite/client"]
},
"include": ["global.d.ts"]
}或者在 tsconfig.app.json 文件中添加类型提示,比如:
{
"compilerOptions": {
"types": ["vite/client"]
},
"include": ["global.d.ts"]
}文档:https://cn.vite.dev/guide/env-and-mode
Q: 文件生成了,但没有提示?
- A: 尝试重启 VS Code 窗口 (
Cmd/Ctrl + Shift + P->Reload Window)。Volar 有时需要重启才能加载新的.d.ts文件。
- A: 尝试重启 VS Code 窗口 (
Q: 手动声明时报错
Module 'vue' has no exported member 'GlobalComponents'?- A: 确保你的 Vue 版本是 3.2+。如果是旧版本或特定环境,尝试将
declare module 'vue'改为declare module '@vue/runtime-core'。
- A: 确保你的 Vue 版本是 3.2+。如果是旧版本或特定环境,尝试将
Q: 自动生成的
components.d.ts经常变动,要提交到 Git 吗?- A: 建议提交。这能确保团队成员拉取代码后,不需要运行项目就能立刻获得准确的类型提示,也有利于 CI/CD 环节的类型检查。
vite.config.ts 使用环境变量 env #
.env.development 文件配置
VITE_APP_TITLE = 'vite-app-title'
APP_TITLE = 'app-title'.env.development 文件配置在 vite.config.ts 中使用,配置项以函数的方式使用
loadEnv 函数用于加载环境变量,mode 为环境,process.cwd() 为当前工作目录
import { defineConfig, loadEnv } from "vite";
import react from "@vitejs/plugin-react";
import tsconfigPaths from "vite-tsconfig-paths";
// https://vite.dev/config/
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd());
console.log(env);
return {
plugins: [react(), tsconfigPaths()],
//...其他配置
};
});
// 打印结果:{ VITE_APP_TITLE: 'vite-app-title' }
// 只打印VITE_开头的环境变量 和 .env.development 文件中配置的环境变量vite官方demo文档:https://cn.vite.dev/config/#using-environment-variables-in-config loadEnv文档:https://cn.vite.dev/guide/api-javascript#loadenv