vite.config.ts

当以命令行方式运行 vite 时,Vite 会自动解析 项目根目录 下名为 vite.config.js 的文件

最基础的配置文件是这样的:

  1. // vite.config.js
  2. export default {
  3. // 配置选项
  4. }

配置 TS 智能提示

Vite 本身附带 TypeScript 类型,所以你可以通过 IDE 和 jsdoc 注解的配合来实现智能提示

  1. /** @type {import('vite').UserConfig} */
  2. export default {
  3. // ...
  4. }

配置智能提示还可以使用 defineConfig 工具函数,我们使用模板创建的项目中配置文件 vite.config.ts 就是使用的 defineConfig 工具函数。

  1. import { defineConfig } from 'vite'
  2. export default defineConfig({
  3. // ...
  4. })

情景配置 开发/生产环境设置不同配置

如果配置文件需要基于(dev/serve 或 build)命令或者不同的 模式 来决定选项,亦或者是一个 SSR 构建(ssrBuild),则可以选择导出这样一个函数:

  1. export default defineConfig(({ command, mode, ssrBuild }) => {
  2. if (command === 'serve') {
  3. return {
  4. // dev 独有配置
  5. }
  6. } else {
  7. // command === 'build'
  8. return {
  9. // build 独有配置
  10. }
  11. }
  12. })

在 Vite 的 API 中,在开发环境下 command 的值为 serve(在 CLI 中, vite dev 和 vite serve 是 vite 的别名),而在生产环境下为 build(vite build)

vite.config.ts 配置文件中使用环境变量

环境变量通常可以从 process.env 获得。

另一种方式是使用 Vite 导出的 loadEnv 函数来加载指定的 .env 文件 (具体见下面的 环境变量与模式 一节)

  1. import { defineConfig, loadEnv } from 'vite'
  2. export default defineConfig(({ command, mode }) => {
  3. // 根据当前工作目录中的 `mode` 加载 .env 文件
  4. // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
  5. const env = loadEnv(mode, process.cwd(), '')
  6. console.log("🚀 ~ file: vite.config.ts:10 ~ defineConfig ~ env", env);
  7. return {
  8. // vite 配置
  9. }
  10. })

image.png

常用配置项

resolve.alias 路径别名

在我们项目开发过程中,会有很多嵌套层级的目录,所以要找到某个目录经常用相对路径../../..,层级一多就显得眼花缭乱,通过 alias 别名,我们可以快速地指定首层的目录,并且相比相对路径减少了路径索引的消耗,在性能上来说也是更优解。

Vite 配置 - resolve-alias 说明

官网原文:

  • 类型:
  1. Record<string, string> | Array<{ find: string | RegExp, replacement: string }>

Vite 基础配置 - 图3

🙌🌰:

  1. import { defineConfig } from "vite";
  2. import vue from "@vitejs/plugin-vue";
  3. // 指定解析路径
  4. import { resolve } from 'path'
  5. const pathResolve = (dir: string) => resolve(__dirname, dir)
  6. // 可以是一个对象
  7. resolve: {
  8. alias: {
  9. '@': pathResolve('src'), // 设置 `@` 指向 `src` 目录
  10. views: pathResolve('src/views'), // 设置 `views` 指向 `./src/views` 目录,下同
  11. components: pathResolve('src/components'),
  12. assets: pathResolve('src/assets')
  13. }
  14. },
  15. // 也可以是一个 { find, replacement } 的数组
  16. resolve: {
  17. alias: [
  18. // /@/xxxx => src/xxxx
  19. { find: '@', replacement: pathResolve('src') },
  20. // /#/xxxx => types/xxxx
  21. { find: '#', replacement: pathResolve('src/types') },
  22. { find: 'api', replacement: pathResolve('src/api') },
  23. {
  24. find: 'components',
  25. replacement: pathResolve('src/components')
  26. },
  27. { find: 'utils', replacement: pathResolve('src/utils') }
  28. ]
  29. }

指定解析路径使用的 path module 需要先安装nodejs的类型声明 @types/node

点击安装

Vite 基础配置 - 图4

Vite 基础配置 - 图5

或者直接手动安装

  1. pnpm add @types/node -D

配置仅供参考,可根据实际情况创建对应目录并配置

  1. import { defineConfig } from "vite";
  2. import vue from "@vitejs/plugin-vue";
  3. // 指定解析路径
  4. import { resolve } from "path";
  5. const pathResolve = (dir: string) => resolve(__dirname, dir);
  6. export default defineConfig({
  7. plugins: [vue()],
  8. base: "vite-vue-template-page",
  9. resolve: {
  10. // 路径别名
  11. alias: [
  12. { find: "@", replacement: pathResolve("src") },
  13. { find: "#", replacement: pathResolve("src/types") },
  14. { find: "api", replacement: pathResolve("src/api") },
  15. { find: "components", replacement: pathResolve("src/components") },
  16. { find: "utils", replacement: pathResolve("src/utils") },
  17. { find: "build", replacement: pathResolve("build") },
  18. // 处理 vue-i18n 的控制台警告信息
  19. {
  20. find: "vue-i18n",
  21. replacement: "vue-i18n/dist/vue-i18n.cjs.js",
  22. },
  23. ],
  24. },
  25. });

serve 服务器选项

当我们在没有任何配置的时候,在运行服务的时候,vite2 是会自动跑在本地的3000端口(vite3默认值5173)

  1. server: {
  2. host: true,
  3. port: 4000, // 设置服务启动端口号,如果端口已经被使用,Vite 会自动尝试下一个可用的端口
  4. open: true, // boolean | string 设置服务启动时是否自动打开浏览器,当此值为字符串时,会被用作 URL 的路径名
  5. cors: true, // 为开发服务器配置 CORS,配置为允许跨域
  6. https: false,
  7. // 设置代理,根据项目实际情况配置
  8. proxy: {
  9. "/api": {
  10. target: "http://xxx.x.x.x:xxxx", // 后台服务地址
  11. changeOrigin: true, // 是否允许不同源
  12. secure: false, // 支持https
  13. prependPath: false,
  14. rewrite: (path) => {
  15. console.log(path);
  16. return path.replace(/^/api/, "");
  17. },
  18. },
  19. },
  20. },

proxy

为开发服务器配置自定义代理规则。期望接收一个 { key: options } 对象。如果 key 值以 ^ 开头,将会被解释为 RegExp。

  1. export default {
  2. server: {
  3. proxy: {
  4. // 字符串简写写法
  5. '/foo': 'http://localhost:4567/foo',
  6. // 选项写法
  7. '/api': {
  8. target: 'http://jsonplaceholder.typicode.com',
  9. changeOrigin: true,
  10. rewrite: (path) => path.replace(/^/api/, '')
  11. },
  12. // 正则表达式写法
  13. '^/fallback/.*': {
  14. target: 'http://jsonplaceholder.typicode.com',
  15. changeOrigin: true,
  16. rewrite: (path) => path.replace(/^/fallback/, '')
  17. }
  18. }
  19. }
  20. }

build 构建打包配置

outdir 指定打包目录

  • 类型: string
  • 默认: dist

指定输出路径(相对于项目根目录)

这个输出路径可以直接声明,也可以把它写成一个全局常量方便后面扩展。全局常量保存在:build\constant.ts

  1. export const OUTPUT_DIR = "dist";
  2. export const BASE_NAME = "vite-vue-template-page";

然后在vite.config.ts中引用:

  1. // ...
  2. import { OUTPUT_DIR, BASE_NAME } from './build/constant';
  3. // ...
  4. base: BASE_NAME,
  5. // ...
  6. build: {
  7. outDir: OUTPUT_DIR,
  8. }

minify

  1. pnpm add -D terser
  1. build: {
  2. outDir: OUTPUT_DIR,
  3. minify: 'terser',
  4. }

Vite 基础配置 - 图6

terserOptions 生产环境去除 console、debugger

  1. terserOptions: {
  2. compress: {
  3. keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题
  4. drop_console: true, // 生产环境去除 console
  5. drop_debugger: true, // 生产环境去除 debugger
  6. },
  7. },

指定了terserOptions 一定要设置 minify 为 tersor

Vite 基础配置 - 图7

环境变量与模式

内建变量

Vite 在一个特殊的 **import.meta.env** 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量:

  • **import.meta.env.MODE**: {string} 应用运行的模式
  • **import.meta.env.BASE_URL**: {string} 部署应用时的基本 URL。他由[base](https://cn.vitejs.dev/config/shared-options.html#base) 配置项决定。
  • **import.meta.env.PROD**: {boolean} 应用是否运行在生产环境。
  • **import.meta.env.DEV**: {boolean} 应用是否运行在开发环境 (永远与 import.meta.env.PROD相反)。
  • **import.meta.env.SSR**: {boolean} 应用是否运行在 server 上。

.env 自定义环境配置文件

Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量:

  1. .env # 所有情况下都会加载
  2. .env.local # 所有情况下都会加载,但会被 git 忽略
  3. .env.[mode] # 只在指定模式下加载
  4. .env.[mode].local # 只在指定模式下加载,但会被 git 忽略

创建默认配置文件

项目根目录下创建:.env文件

  1. # 运行的端口
  2. VITE_PORT = 4000
  3. # 应用名称
  4. VITE_GLOB_APP_TITLE = Vite Vue Template

创建开发环境配置文件

项目根目录下新建:.env.development 文件:

  1. # just a flag
  2. ENV = 'development'
  3. # public path
  4. VITE_PUBLIC_PATH = '/'
  5. # 应用基本接口地址
  6. VITE_API_BASE_URL = 'http://xxx.xxx.xx.xx:xxxx/'
  7. VITE_PORT = 3100
  8. # 是否使用mock
  9. VITE_USE_MOCK = true
  10. # 跨域代理,你可以配置多个代理。
  11. VITE_PROXY=[["/api","http://localhost:3000"],["/upload","http://localhost:3001/upload"]]
  12. # 是否删除所有日志打印
  13. VITE_DROP_CONSOLE = false

创建生产环境配置文件

项目根目录下新建:.env.production 文件:

组件中使用环境变量

  1. console.log(import.meta.env.VITE_API_BASE_URL)

vite.config.ts 完整配置

  1. import { defineConfig, loadEnv } from "vite";
  2. import vue from "@vitejs/plugin-vue";
  3. import { OUTPUT_DIR, BASE_NAME } from "./build/constant";
  4. // 指定解析路径
  5. import { resolve } from "path";
  6. const pathResolve = (dir: string) => resolve(__dirname, dir);
  7. export default defineConfig(({ command, mode }) => {
  8. const root = process.cwd();
  9. const env = loadEnv(mode, root);
  10. const isDev = command === "serve"; // 开发环境
  11. const isBuild = command === "build"; // 生产环境
  12. return {
  13. plugins: [vue()],
  14. base: BASE_NAME,
  15. resolve: {
  16. // 路径别名
  17. alias: [
  18. { find: "@", replacement: pathResolve("src") },
  19. { find: "#", replacement: pathResolve("src/types") },
  20. { find: "api", replacement: pathResolve("src/api") },
  21. { find: "components", replacement: pathResolve("src/components") },
  22. { find: "utils", replacement: pathResolve("src/utils") },
  23. { find: "build", replacement: pathResolve("build") },
  24. ],
  25. },
  26. server: {
  27. host: true,
  28. port: +env.VITE_PORT, // 设置服务启动端口号,如果端口已经被使用,Vite 会自动尝试下一个可用的端口
  29. open: true, // boolean | string 设置服务启动时是否自动打开浏览器,当此值为字符串时,会被用作 URL 的路径名
  30. cors: true, // 为开发服务器配置 CORS,配置为允许跨域
  31. https: false,
  32. // 设置代理,根据项目实际情况配置
  33. proxy: {
  34. "/api": {
  35. target: env.VITE_API_BASE_URL, // 后台服务地址
  36. changeOrigin: true, // 是否允许不同源
  37. secure: false, // 支持https
  38. prependPath: false,
  39. rewrite: (path) => {
  40. console.log(path);
  41. return path.replace(/^\/api/, "");
  42. },
  43. },
  44. },
  45. },
  46. // 生产环境打包配置
  47. build: {
  48. outDir: OUTPUT_DIR,
  49. minify: "terser",
  50. terserOptions: {
  51. compress: {
  52. keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题
  53. drop_console: true, // 生产环境去除 console
  54. drop_debugger: true, // 生产环境去除 debugger
  55. },
  56. },
  57. },
  58. };
  59. });