Vite 环境变量配置与类型处理

59 阅读3分钟

一、环境变量

Vite 支持 .env 文件定义环境变量,需以 VITE_ 开头才能在客户端访问:

# 自定义环境变量(必须以 VITE_ 开头)

# 应用标题
VITE_APP_TITLE='Vite App'

# 打包输出目录
VITE_OUTPUT_DIR='dist'

# 资源基础路径
VITE_PUBLIC_PATH='/'

# API 接口地址
VITE_BASE_API='/api'

# 接口代理地址
VITE_BASE_URL='https://example.com'

# 超时时间(毫秒)
VITE_REQUEST_TIMEOUT='10000'

# 是否移除 console
VITE_DROP_CONSOLE='true'

# 是否自动打开浏览器
VITE_AUTO_OPEN='false'

📌 更多环境变量设置请查看 Vite 官方文档

二、TypeScript 类型声明

为保证环境变量的类型安全,可在 types/vite-env.d.ts 中声明:

/** 原生读取出的环境变量类型 */
interface ImportMetaEnv {
  /** 应用默认标题 */
  VITE_APP_TITLE: string
  /** 后端接口公共路径 */
  VITE_BASE_API: string
  /** 后端接口代理地址 */
  VITE_BASE_URL: string
  /** 指定打包文件的输出目录 */
  VITE_OUTPUT_DIR: string
  /** 部署应用包时的基本 URL */
  VITE_PUBLIC_PATH: string
  /** 路由模式 */
  VITE_ROUTER_MODE: 'hash' | 'history'

  /** 开发服务器的监听端口 */
  VITE_DROP_CONSOLE: string
  /** 打包后移除所有的 console、debugger */
  VITE_SERVER_PORT: string
  /** 请求超时时间 单位秒 */
  VITE_REQUEST_TIMEOUT: string
  /** 是否自动打开浏览器 */
  VITE_AUTO_OPEN: string
  /** 是否开启路由加载时的顶部进度条 */
  VITE_ROUTER_NPROGRESS: string
  /** 是否开启请求接口时的顶部进度条 */
  VITE_REQUEST_NPROGRESS: string
  /** 打包后是否移除所有的注释 */
  VITE_CLEAR_COMMENT: string
}

/** 原生读取出的环境变量经过处理后的类型 */
interface ViteEnv extends Omit<ImportMetaEnv, 'BASE_URL'> {
  /** 当前运行模式 */
  MODE: string
  /** 是否为开发环境 */
  DEV: boolean
  /** 是否为生产环境 */
  PROD: boolean
  /** 开发服务器的监听端口 */
  VITE_SERVER_PORT: number
  /** 请求超时时间 单位秒 */
  VITE_REQUEST_TIMEOUT: number
  /** 是否自动打开浏览器 */
  VITE_AUTO_OPEN: boolean
  /** 打包后移除所有的 console、debugger */
  VITE_DROP_CONSOLE: boolean
  /** 是否开启路由加载时的顶部进度条 */
  VITE_ROUTER_NPROGRESS: boolean
  /** 是否开启请求接口时的顶部进度条 */
  VITE_REQUEST_NPROGRESS: boolean
  /** 打包后是否移除所有的注释 */
  VITE_CLEAR_COMMENT: boolean
}

/** 让 Vite 识别 env 类型 */
interface ImportMeta {
  /** 利用 Readonly 泛型工具类全部修改为只读属性 */
  readonly env: Readonly<ImportMetaEnv>
}

/** 处理后的环境变量(全局可用) */
/** 原生读取出的环境变量经过处理后的类型 src 下任意位置可用此访问 类比 __dirname 使用 */
declare const __RUNTIME_CONFIG__: ViteEnv

三、环境变量处理

3.1 处理 .env 变量

vite.config.ts 处理 .env 变量,转换为正确的类型:

import { defineConfig, loadEnv } from 'vite'

/** 处理环境变量 */
function warpperEnv(envConfing: Recordable<string>, mode: string): ViteEnv {
  const runtimeConfig = {} as ViteEnv
  runtimeConfig.MODE = mode
  runtimeConfig.DEV = mode === 'development'
  runtimeConfig.PROD = mode === 'production'
  for (const [key, value] of Object.entries(envConfing)) {
    // 默认先给原值 其后看情况处理
    runtimeConfig[key] = value
    // 布尔值
    if (typeof value === 'string' && ['true', 'false'].includes(value)) {
      runtimeConfig[key] = value === 'true' ? true : false
    }
    // 数值
    if (typeof value === 'string' && !Number.isNaN(Number(value))) {
      runtimeConfig[key] = +value // 数值类型处理
    }
  }
  return runtimeConfig
}

export default defineConfig(({ mode }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀
  const runtimeConfig = warpperEnv(loadEnv(mode, root, 'VITE_'), mode) // 对原生环境变量进行二次处理
  
  return {
    define: {
      /** 将处理后的环境变量定义为全局常量 */
      __RUNTIME_CONFIG__: runtimeConfig,
    },
    
    // 部署应用包时的基本 URL
    base: runtimeConfig.VITE_PUBLIC_PATH,
    
    esbuild: {
      // 打包后是否移除所有的 console、debugger
      drop: runtimeConfig.VITE_DROP_CONSOLE ? ['console', 'debugger'] : [],
      // 打包后是否移除所有的注释
      legalComments: runtimeConfig.VITE_CLEAR_COMMENT ? 'none' : 'inline',
    }
  }
})

3.2 在 Vue 组件中使用环境变量

src/views/Dashboard/index.vue 组件中:

<script setup lang="ts">
defineOptions({ name: 'Dashboard' })

// 直接访问全局环境变量
const VITE_APP_TITLE = __RUNTIME_CONFIG__.VITE_APP_TITLE
console.log('应用标题:', VITE_APP_TITLE) // Vite App
</script>

3.3 在 TypeScript 代码中使用环境变量

src/utils/request.ts 配置 Axios:

import axios from 'axios'

const request = axios.create({
  // API 基础路径
  baseURL: __RUNTIME_CONFIG__.VITE_BASE_API,
  // 超时时间(转换为毫秒)
  timeout: __RUNTIME_CONFIG__.VITE_REQUEST_TIMEOUT * 1000,
})

export default request

四、总结

  • .env 变量必须以 VITE_ 开头才能在客户端访问
  • ✅ 通过 vite.config.ts 处理环境变量,转换为正确类型
  • ✅ 在 Web 端使用 __RUNTIME_CONFIG__ 访问全局环境变量

这样配置可以提升环境变量的可维护性,同时提高代码的可读性和安全性。🚀