1. 基础概念对比
Webpack 环境变量
- 访问方式:
process.env.XXX
- 定义文件:
.env
、.env.production
、.env.development
等 - 变量注入:通过
DefinePlugin
在构建时注入 - 默认变量:
NODE_ENV
(development/production/test)
Vite 环境变量
- 访问方式:
import.meta.env.XXX
- 定义文件:
.env
、.env.production
、.env.development
等 - 变量注入:开发时直接可用,生产时构建注入
- 默认变量:
MODE
:当前模式PROD
:是否生产环境(布尔值)DEV
:是否开发环境(布尔值)SSR
:是否服务端渲染
2. 环境文件配置
文件命名规则(两者通用)
1 | .env # 所有环境都会加载 |
加载优先级(从高到低)
.env.[mode].local
.env.[mode]
.env.local
- .env
3. Webpack 环境配置(Vue CLI)
基本配置
1 | # .env.development |
1 | # .env.test |
1 | # .env.production |
变量命名规则
- 必须以
VUE_APP_
开头才会被 Vue CLI 暴露给客户端代码 NODE_ENV
和BASE_URL
是内置变量
在代码中使用
1 | // Webpack 项目 |
构建命令
1 | # 开发环境 |
4. Vite 环境配置
基本配置
1 | # .env.development |
1 | # .env.test |
1 | # .env.production |
变量命名规则
- 必须以
VITE_
开头才会暴露给客户端代码 - Vite 提供内置变量:
MODE
,DEV
,PROD
在代码中使用
1 | // Vite 项目 |
构建命令
1 | # 开发环境 |
5. 完整项目配置示例
Vue 3 + Vite 项目
目录结构
1 | project/ |
环境文件内容
1 | # .env (基础配置) |
1 | # .env.development |
1 | # .env.test |
1 | # .env.production |
vite.config.ts
1 | import { defineConfig, loadEnv } from 'vite'; |
请求配置 (src/utils/request.ts)
1 | import axios from 'axios'; |
6. 从 Webpack 迁移到 Vite 的注意事项
环境变量前缀变更
- Webpack:
VUE_APP_*
→ Vite:VITE_*
- Webpack:
访问方式变更
- Webpack:
process.env.*
→ Vite:import.meta.env.*
- Webpack:
环境判断方式
- Webpack:
process.env.NODE_ENV === 'production'
- Vite:
import.meta.env.PROD
(布尔值)
- Webpack:
环境变量类型
- Webpack 中所有环境变量都是字符串
- Vite 中
PROD
、DEV
是布尔值
更改代码示例
1
2
3
4
5
6
7// 修改前 (Webpack)
const isProd = process.env.NODE_ENV === 'production';
const apiUrl = process.env.VUE_APP_API_URL;
// 修改后 (Vite)
const isProd = import.meta.env.PROD;
const apiUrl = import.meta.env.VITE_APP_API_URL;
7. 最佳实践
创建环境工具函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27// src/utils/env.ts
export const getEnv = (): string => import.meta.env.MODE;
export const isProd = (): boolean => import.meta.env.PROD;
export const isDev = (): boolean => import.meta.env.DEV;
export const isTest = (): boolean => getEnv() === 'test';
// 获取环境变量,提供默认值和类型转换
export const getEnvValue = <T extends string | boolean | number>(
key: string,
defaultValue: T
): T => {
const value = import.meta.env[key] as unknown;
if (value === undefined) return defaultValue;
// 根据默认值类型进行转换
if (typeof defaultValue === 'boolean') {
return (value === 'true') as unknown as T;
}
if (typeof defaultValue === 'number') {
return Number(value) as unknown as T;
}
return value as T;
};
// 使用示例
export const getApiUrl = () => getEnvValue('VITE_APP_API_URL', '');
export const getAppTitle = () => getEnvValue('VITE_APP_TITLE', '默认应用名称');在组件中使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<script setup lang="ts">
import { getAppTitle, isProd, isTest } from '@/utils/env';
// 根据环境显示不同内容
const showDebugInfo = !isProd();
const showTestBanner = isTest();
const appTitle = getAppTitle();
</script>
<template>
<div>
<h1>{{ appTitle }}</h1>
<div v-if="showTestBanner" class="test-env-banner">测试环境</div>
<div v-if="showDebugInfo" class="debug-info">Debug模式已启用</div>
</div>
</template>
通过这种环境配置和使用方式,可以在 Vue 3 项目中灵活处理不同环境的配置需求,同时保持代码的可维护性和清晰度。