Vue3 项目环境变量配置(Vite)
环境变量
它的主要作用让开发者区分不同的运行环境,读取不同环境的相关配置信息,比如开发环境和生产环境使用不同的 API 前缀等。
Vite 是通过 import.meta.env 对象暴露环境变量的。
在组件中获取环境变量方式如下:
<script setup lang="ts">
console.log(import.meta.env);
</script>
<template>
<div>我是一个组件</div>
</template>
输出:
{
"BASE_URL": "/", //部署应用时的URL前缀
"DEV": true, //应用是否运行在开发环境 (永远与 import.meta.env.PROD相反)
"MODE": "development", //应用运行的模式
"PROD": false, //应用是否运行在生产环境(使用 NODE_ENV='production' 运行开发服务器或构建应用时使用 NODE_ENV='production' )
"SSR": false //应用是否运行在 server 上
}
.env
文件
Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量:
.env # 所有情况下都会加载
.env.local # 所有情况下都会加载,但会被 git 忽略
.env.[mode] # 只在指定模式下加载
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略
配置额外的额环境变量
也可以配置额外的额环境变量,我们需要在根目录新建 .env[mode] 文件,并且环境变量必须以 VITE_ 开头,才会暴露给经过 vite 处理的代码。例如下面这些环境变量:
VITE_SOME_KEY=123
DB_PASSWORD=foobar
输出:
console.log(import.meta.env.VITE_SOME_KEY) // "123"
console.log(import.meta.env.DB_PASSWORD) // undefined
只有 VITE_SOME_KEY
会被暴露为 import.meta.env.VITE_SOME_KEY
提供给客户端源码,而 DB_PASSWORD
则不会。
在配置中使用环境变量
环境变量通常可以从 process.env
获得。
注意:Vite 默认是不加载 .env
文件的,因为这些文件需要在执行完 Vite 配置后才能确定加载哪一个,举个例子,root
和 envDir
选项会影响加载行为。不过当你的确需要时,你可以使用 Vite 导出的 loadEnv
函数来加载指定的 .env
文件。
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ command, mode }) => {
// 根据当前工作目录中的 `mode` 加载 .env 文件
// 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
const env = loadEnv(mode, process.cwd(), '')
return {
// vite 配置
define: {
__APP_ENV__: JSON.stringify(env.APP_ENV),
},
}
})
配置TypeScript 的智能提示
在 src
目录下创建一个 vite-env.d.ts
文件,接着按下面这样增加 ImportMetaEnv
的定义:
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string
// 更多环境变量...
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
HTML 环境变量替换
Vite 还支持在 HTML 文件中替换环境变量。import.meta.env
中的任何属性都可以通过特殊的 %ENV_NAME%
语法在 HTML 文件中使用:
<h1>Vite is running in %MODE%</h1>
<p>Using data from %VITE_API_URL%</p>
注意:如果环境变量在 import.meta.env
中不存在,比如不存在的 %NON_EXISTENT%
,则会将被忽略而不被替换
模式
默认情况下,开发服务器 (dev
命令) 运行在 development
(开发) 模式,而 build
命令则运行在 production
(生产) 模式。
这意味着当执行 vite build
时,它会自动加载 .env.production
中可能存在的环境变量:
# .env.production
VITE_APP_TITLE=My App
在你的应用中,你可以使用 import.meta.env.VITE_APP_TITLE
渲染标题。
在某些情况下,若想在 vite build
时运行不同的模式来渲染不同的标题,你可以通过传递 --mode
选项标志来覆盖命令使用的默认模式。例如,如果你想在 staging (预发布)模式下构建应用:
vite build --mode staging
还需要新建一个 .env.staging
文件:
# .env.staging
VITE_APP_TITLE=My App (staging)
由于 vite build
默认运行生产模式构建,你也可以通过使用不同的模式和对应的 .env
文件配置来改变它,用以运行开发模式的构建:
# .env.testing
NODE_ENV=development
注意:NODE_ENV
(process.env.NODE_ENV
)和模式是两个不同的概念,NODE_ENV
和模式的不同值也会反映在相应的 import.meta.env
属性上。