import.meta.env

import.meta.env 是vite项目中对外暴露一个环境变量, 可以在项目中任意一处进行访问。

内建变量

内建变量是指import.meta.env自身固有的属性,可以直接访问,常见的内建变量有:

  • import.meta.env.MODE : 当前运行模式(production | development)
  • import.meta.env.BASE_URL : 部署应用时的基本 URL
  • import.meta.env.PROD: 是否处在生产环境下
  • import.meta.env.DEV : 是否处在开发环境下
  • import.meta.env.SSR : 是否运行在server中
非内建变量

import.meta.env除了有内建变量外,还可以通过dotenv从环境目录中读取对应的配置文件中的变量,并将这些变量添加到自身身上。

常见的配置文件有:

bash 复制代码
.env # 所有情况下都会加载 
.env.local # 所有情况下都会加载,但会被 git 忽略 
.env.[mode] # 只在指定模式下加载 
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略

例如,在项目中有.env文件,且处在开发环境下,那么:

ini 复制代码
# .env文件
VITE_NAME='这是开发环境'
arduino 复制代码
# main.js
console.log(import.meta.env)
----
{
    "VITE_NAME": "这是开发环境",
    "BASE_URL": "/",
    "MODE": "development",
    "DEV": true,
    "PROD": false,
    "SSR": false
}

除了.env配置文件外,vite 还支持以下配置文件:

bash 复制代码
.env # 所有情况下都会加载 
.env.local # 所有情况下都会加载,但会被 git 忽略 
.env.[mode] # 只在指定模式下加载 
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略

同时存在多个.env.*文件,加载也会有不同的优先级

bash 复制代码
指定模式的文件(`.env.production`)会比通用形式的优先级更高( `.env`)
另外,Vite 执行时已经存在的环境变量有最高的优先级,不会被 `.env` 类文件覆盖。
.env 类文件会在 Vite 启动一开始时被加载,而改动会在重启服务器后生效。
生产环境替换

vite会根据不同的生产环境加载对应的配置文件。

import.meta.env.MODE = production, 会加载.env.production

import.meta.env.MODE = development, 会加载.env.development

另外,在生产环境中,这些环境变量会在构建时被静态替换,因此,在引用它们时请使用完全静态的字符串。动态的 key 将无法生效。例如,动态 key 取值 import.meta.env[key] 是无效中

环境变量格式

为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码。例如

arduino 复制代码
VITE_SOME_KEY=123 
DB_PASSWORD=foobar
--------------------
console.log(import.meta.env.VITE_SOME_KEY) // 123 
console.log(import.meta.env.DB_PASSWORD) // undefined
总结

在项目开发过程中,可以通过import.meta.env获取当时所处的环境,并加载对应的配置信息。特别适用于开发接口生产接口不一致的时候。

题外话

import.meta.env可以针对不同的环境使用不同的配置,适用于配置信息明确的项目。但是打包过后配置文件就没有了,没办法动态去修改配置信息。

工作中会遇到一种情况:获取到项目的编译包,A项目使用A接口,B项目使用B接口。这时候最好的做法应该是在public文件夹中添加配置文件config.js, 在mian.js中引入,设置为全局变量

相关推荐
Moment4 分钟前
在 React 里面实现国际化实现是太简单了 🙂‍↔️🙂‍↔️🙂‍↔️
前端·javascript·react.js
兜小糖的小秃毛6 分钟前
el-Input输入数字自动转千分位进行展示
前端·javascript·vue.js
兜小糖的小秃毛6 分钟前
文号验证-同时对两个输入框验证
开发语言·前端·javascript
brzhang7 分钟前
代码越写越乱?掌握这 5 种架构模式,小白也能搭出清晰系统!
前端·后端·架构
J总裁的小芒果14 分钟前
el-table 自定义列、自定义数据
前端·javascript·vue.js
晚风予星15 分钟前
简记|React+Antd中实现 tooltip、ellipsis、copyable功能组件
前端·react.js
brzhang22 分钟前
告别『上线裸奔』!一文带你配齐生产级 Web 应用的 10 大核心组件
前端·后端·架构
程序员Bears23 分钟前
深入理解CSS3:Flex/Grid布局、动画与媒体查询实战指南
前端·css3·媒体·visual studio code
David凉宸34 分钟前
凉宸推荐给大家的一些开源项目
前端
袋鱼不重36 分钟前
Cursor 最简易上手体验:谷歌浏览器插件开发3s搞定!
前端·后端·cursor