在 Vite 中,import.meta.env 的环境变量和 vite.config.js 中访问环境变量的机制是不同的,这是导致你在配置文件中无法直接获取 VITE_SOME_KEY 的原因。以下是详细解释和解决方案:
1. 根本原因
(1)vite.config.js 运行时机
- 它是 在 Vite 开发服务器启动之前 执行的(属于 Node.js 环境)。
- 此时,Vite 还没有处理客户端环境变量(
import.meta.env),所以无法直接访问VITE_SOME_KEY。
(2)import.meta.env 的运行时机
- 它是在 浏览器环境(或 Vite 构建后的代码)中运行的。
- Vite 会在构建时静态替换
import.meta.env.*,因此它在组件(如App.vue)中可用。
2. 解决方案
方法 1:使用 process.env + dotenv(推荐)
Vite 允许在 vite.config.js 中通过 process.env 读取 .env 文件,但需要手动加载:
(1)安装 dotenv
npm install dotenv --save-dev
(2)修改 vite.config.js
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig(({ mode }) => {
// 加载当前模式下的 .env 文件
const env = loadEnv(mode, process.cwd(), '')
return {
plugins: [vue()],
build: {
lib: {
entry: resolve(__dirname, 'src/index.js'),
name: 'MyLib',
fileName: (format) => `my-lib.${format}.js`
},
rollupOptions: {
external: ['vue'],
output: {
globals: {
vue: 'Vue'
},
},
},
},
// 测试打印环境变量
define: {
__APP_ENV__: JSON.stringify(env.VITE_SOME_KEY)
}
}
})
(3)验证是否生效
console.log(process.env.VITE_SOME_KEY) // 应该能打印出值
方法 2:直接使用 loadEnv(Vite 内置)
Vite 提供了 loadEnv 工具函数,无需额外安装 dotenv:
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ mode }) => {
// 加载环境变量
const env = loadEnv(mode, process.cwd())
console.log(env.VITE_SOME_KEY) // 打印测试
return {
// ...其他配置
}
})
3. 关键注意事项
-
.env文件命名规则
Vite 会根据当前模式(mode)自动加载对应的.env文件:-
.env# 所有情况下加载 -
.env.local# 本地覆盖,但被 git 忽略 -
.env.[mode]# 只在指定模式下加载(如.env.production) -
.env.[mode].local# 模式下的本地覆盖
-
变量前缀要求
只有以VITE_开头的变量才会被 Vite 暴露给客户端(import.meta.env)。
但vite.config.js中可以读取任意变量(包括非VITE_前缀的)。-
process.env和import.meta.env的区别特性 process.env(Node.js)import.meta.env(浏览器)运行环境 vite.config.js客户端代码(如 App.vue)变量前缀 任意(如 API_KEY)必须 VITE_开头加载方式 需手动 loadEnv或dotenvVite 自动注入
4. 调试技巧
如果仍然无法读取,检查以下问题:
文件位置
确保.env文件在项目根目录(和vite.config.js同级)。变量名拼写
确保.env中的变量名是VITE_SOME_KEY(全大写,VITE_前缀)。模式匹配
如果使用--mode production,确保有.env.production文件。重启 Vite 服务
修改.env后需要重启服务:vite dev。
5. 总结
-
vite.config.js中要用loadEnv()或process.env+dotenv读取环境变量。 -
App.vue中直接用import.meta.env.VITE_SOME_KEY(由 Vite 自动注入)。 - 确保变量前缀正确、文件位置正确,并在修改
.env后重启服务。
这样就能在配置文件和组件中同时访问环境变量了!