环境变量在 Vite 中的使用
问题描述
许多开发者在 Vite 项目中尝试使用环境变量时遇到问题。例如,在 .env
文件中定义了环境变量:
TEST_VAR=123F
但在代码中使用 import.meta.env.TEST_VAR
访问时却返回 undefined
。这通常是由于对 Vite 环境变量机制的误解造成的。
解决方案
1. 使用正确的变量前缀
Vite 默认只暴露以 VITE_
为前缀的环境变量到客户端代码。这是为了防止意外泄露敏感信息。
安全提示
Vite 的这种设计是有意的安全措施,避免将所有环境变量暴露给客户端。
将你的 .env
文件改为:
env
VITE_TEST_VAR=123F
然后在代码中访问:
javascript
console.log(import.meta.env.VITE_TEST_VAR); // 输出 "123F"
2. 自定义环境变量前缀
如果你不想使用 VITE_
前缀,可以在 vite.config.js
中配置自定义前缀:
javascript
export default defineConfig({
envPrefix: 'TEST_', // 现在可以使用 TEST_ 前缀
// 其他配置...
})
重要限制
不能将 envPrefix
设置为空字符串 ''
,这会暴露所有环境变量,导致敏感信息泄露。
3. 在 Vite 配置文件中访问环境变量
如果需要在 vite.config.js
中访问环境变量,需要使用 loadEnv()
函数:
javascript
import { defineConfig, loadEnv } from 'vite'
export default ({ mode }) => {
// 加载环境变量
const env = loadEnv(mode, process.cwd())
return defineConfig({
// 使用 env.VARIABLE_NAME 访问变量
define: {
__API_URL__: JSON.stringify(env.VITE_API_URL)
}
})
}
4. 处理特殊需求的高级配置
如果需要在客户端代码中使用没有前缀的变量名,可以使用以下配置:
javascript
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), '')
const processEnv = Object.keys(env).reduce((acc, key) => {
acc[key] = JSON.stringify(env[key])
return acc
}, {})
return {
define: {
'process.env': processEnv
}
}
})
安全警告
这种方法会将所有环境变量暴露给客户端,可能造成安全风险,请谨慎使用。
5. 使用系统环境变量
你可以在 .env
文件中引用系统环境变量:
env
# 直接引用系统变量
VITE_MY_VAR=${SYSTEM_VAR}
# 带默认值的引用
VITE_MY_VAR=${SYSTEM_VAR:-default_value}
6. 常见问题排查
如果环境变量仍然无法正常工作,请检查以下几点:
- 文件位置:确保
.env
文件位于项目根目录,而不是src
目录 - 服务器重启:修改
.env
文件后需要重启开发服务器 - 变量名匹配:检查代码中的变量名与
.env
文件中的名称是否一致 - 模式匹配:Vite 支持不同模式的环境文件(如
.env.development
,.env.production
)
总结
Vite 的环境变量系统设计注重安全性,默认只暴露带有 VITE_
前缀的变量。通过正确使用前缀、适当配置 Vite 以及在需要时使用 loadEnv()
函数,你可以灵活地在项目中使用环境变量。
最佳实践建议
- 始终使用
VITE_
前缀标识需要暴露给客户端的环境变量 - 敏感信息应保持在服务器端,不要通过环境变量暴露给客户端
- 为不同环境创建不同的
.env
文件(如.env.development
,.env.production
) - 在团队协作项目中,提供
.env.example
文件说明所需的环境变量