【Vite环境变量】import.meta.env 和 loadEnv使用和区别

news/2024/9/12 16:50:54

前言

我们在做项目时需要各种配置信息(如应用标题、API 地址等),这些配置信息可能在不同环境下有所不同(如开发环境和生产环境)。

如果每次更改开发或者更改生产环境需要修改源代码中的相关配置,这会导致应用程序的可维护性变得极低!因此,我们可以将这些配置信息通过环境变量来进行管理。

一、 环境变量和使用场景

所以,环境变量的定义也就是:会根据当前的代码环境产生值的变化的变量就叫做环境变量。

在 Vite 项目中,使用环境变量提供了一种在不同环境下定制化应用行为的方式。通过读取环境变量,我们可以设置不同的配置信息。

开发中常见的场景有:

  1. 区分开发和生产环境

通过环境变量可以方便地区分当前应用运行的是开发还是生产环境。例如,在开发环境下,可以启用控制台日志和调试工具,而在生产环境下,则需要关闭这些功能以提升性能和安全性。

  1. 配置应用访问的 API 地址

应用通过 HTTP 请求与后端 API 进行通信。在开发和生产环境下,API 服务器的地址可能不同。通过环境变量,可以将 API 地址从应用代码中抽离出来,并在不同环境中指定不同的地址。

  1. 其他配置信息

除了 API 地址外,应用还有很多其他的配置信息,例如应用标题、主题颜色、版本号等。这些信息可以使用环境变量进行管理,避免硬编码在应用代码中,提高代码的可维护性和可扩展性。

  1. 构建时的配置

在开发环境下启用调试模式,在生产环境下禁用控制台输出等。此外,还可以使用环境变量来进行资源定位,例如根据当前环境选择不同的 API 地址、CDN 路径等。

二、import.meta.envloadEnv

  • import.meta.env

1. 在 .env 文件中定义环境变量

VITE_APP_TITLE=Hello Vite!

2. 在代码中可以使用 import.meta.env 直接读取环境变量

// main.js
console.log(import.meta.env.VITE_APP_TITLE); // 输出:Hello Vite!
  • loadEnv 

1. 在代码中需要先导入 Vite 提供的环境变量模块

// main.js
import.meta.env.DEV && require('dotenv').config(); // 在开发环境下自动加载 .env 文件
import { loadEnv } from 'vite';
loadEnv();

2. 使用 loadEnv 方法读取环境变量

// main.js
console.log(process.env.VITE_APP_TITLE); // 输出:Hello Vite!

三、使用注意事项

1. import.meta.env 和 loadEnv 的使用场景不同

import.meta.env 是在运行时获取环境变量的值,适用于应用程序代码中需要动态获取环境变量的场合。(配置文件中获取不到,因为配置文件是在构建时被读取!!!)

loadEnv 则是在构建时加载环境变量,适用于打包时(构建时)需要引用环境变量的场合。

2. 环境变量的值必须以 VITE_ 开头

与上面提到的一样,Vite 要求所有的环境变量必须以 VITE_ 开头。如果你想要使用 import.meta.env 或者 loadEnv 获取环境变量的值,需要遵循这个规则。

不过,也可以获取非VITE_ 开头得变量,但是要修改配置文件中的prefixes 配置(不推荐)。

而loadEnv函数可以通过改变第三个参数获取到非VITE_前缀的变量。

function loadEnv(
  mode: string,
  envDir: string,
  prefixes: string | string[] = 'VITE_',
): Record<string, string>

上面的第三个参数就是前缀,默认VITE_ ,不过可以改为 '' 空字符串。


http://lihuaxi.xjx100.cn/news/1216707.html

相关文章

JupyterLab 4.0 发布了

JupyterLab 是 Jupyter Notebook 的下一代版本&#xff0c;它提供了更强大的功能和更灵活的用户界面&#xff0c;6月6日&#xff0c;官方发布了JupyterLab 4.0的说明&#xff0c;并且说该版本是下一个主要的版本。 JupyterLab的主要改进是: 用户界面&#xff1a;Jupyter Note…

直播商品库功能(互动功能接收端JS-SDK)

功能概述 图&#xff1a;边看边买--效果截图 本模块主要处理商品库相关逻辑&#xff0c;如展示商品、商品推送和商品上下架等消息。 初始化及销毁 在实例化该模块并进行使用之前&#xff0c;需要对SDK进行初始化配置&#xff0c;详细见参考文档。 在线文件引入方式 // scri…

“Pull”和“Push”支付的区别

下图展示了“Pull”和“Push”支付的工作原理。 当我们在商家处刷信用卡/借记卡时&#xff0c;这是一种“Pull”支付&#xff0c;资金从持卡人的账户发送到商家。商家从持卡人的账户中取款&#xff0c;而持卡人批准交易。 通过Visa Direct或Mastercard Send&#xff0c;推送支付…

微信开发者工具公众号网页项目实现本地项目调试

背景 最近业务场景中有需要微信H5进行实现,需要网页授权,需要用户进行点击授权的操作,跳转一个微信公众号后台设置的授权域名下的网页后才能获取到code,其他网页授权步骤这里不进行展开,不想频繁的打包上传的服务器看实现效果,所以考虑从微信开发者工具中实现本地调试,搜索过相…

node基础与fs模块学习笔记

了解Node.js与内置模块 什么是Node.js? Node.js is an open-source, cross-platform JavaScript runtime environment. node.js是一个开源跨平台的js运行环境。 前端的运行环境就是浏览器。 注意&#xff1a;Node.js中无法调用DOM和BOM等浏览器内置API。 Node.js中的顶级对象…

【JavaSE】Java(五十四):核心要点总结

文章目录 1. try-catch-finally中 如果 catch 中 return 了&#xff0c;finally 还会执行吗?2. 常见的异常类有哪些3. hashcode 是什么 &#xff0c;有什么作用4. java中操作字符串有哪些类&#xff0c;他们之间有什么区别5. Java 中有哪些引用类型 1. try-catch-finally中 如…

【立体视觉(一)】之成像原理与镜头畸变

【立体视觉&#xff08;一&#xff09;】之成像原理与镜头畸变 一、成像原理一&#xff09;针孔模型二&#xff09;坐标系转换1. 世界坐标系到相机坐标系2. 相机坐标系到图像坐标系3. 图像坐标系到像素坐标系4. 相机坐标系到像素坐标系5. 世界坐标系到像素坐标系 二、镜头畸变一…

基于SSM+JSP的大学生校园兼职系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…