vite环境变量处理

环境变量:

  • 会根据当前代码环境产生值的变化的变量就叫做环境变量

代码环境:

  1. 开发环境
  2. 测试环境
  3. 预发布环境
  4. 灰度环境
  5. 生产环境
举例:

百度地图 SDK,小程序的SDK

  • APP_KEY: 测试环境和生产环境还有开发环境是不一样的key

开发环境: 110

生产环境:111

测试环境: 112

我们去请求第三方接口sdk接口的时候需要带上一个身份信息

假设是百度地图的API,获取用户位置:

  • 伪代码
const getUserPosition = () => {axios.post({params: {APP_KEY:110 // 如果这样写死,来回跳环境就很麻烦}    })
}
类比环境变量来说:

我们在和后端同学对接的时候,前端在开发环境中请求的后端API地址和生产环境的后端API地址是一个吗? 肯定不是同一个

  • 开发和测试: http://test.api/
  • 生产: https://api/

获取用户信息

// baseUrl 是后端基础的服务器域名
axios.baseUrl = "http:test.api/"
const getCurrenLoginUserInfo = () => {axios.get({url: "/url/info"  // baseUrl 会自动拼接}) 
}

创建两个环境配置文件:

  • .env.development
APP_KEY = 110BASE_URL = http://test.api/
  • .env.production
APP_KEY = 112
BASE_URL = http://api/

环境变量的意义:

  • 在执行 yarn build的时候自动去换配置属性值

在vite中的环境变量处理:

  • vite内置了 dotenv这个第三方库
dotenv的作用:
  • 第三方库,在启动项目(yarn dev 或者 yarn build)的时候就会去读 配置文件(去找当前目录下的 .env 文件)
  • dotenv会自动读取 .env文件,并解析这个文件中的对应环境变量,并将其注入到process对象下
  • process是node端关于当前的一个进程的一个对象
    • 所以在vite.config.js中就可以通过process去访问到 env文件中的变量了

总结:通过vite内置 dotenv 中的process去注入环境变量


vite.config.js:会在node端运行

node端用的是comment.js规范,但是现在又没有给这个配置文件开es module规范,那为什么 node 在读取 vite.config.js的时候能够认识 import和 export default

原因:

  • vite.config.js可以书写成esmodule的形式,这是因为vite在读取这个vite,config.js的时候会率先去node解析文件语法,如果发现是esmodule规范,就会直接将esmodule规范进行替换变成 commonjs 规范

node 端读出来是字符串,然后使用字符串 replace 替换方法,将所有的 类似 export default 全部换成 module.exports


在vite.config.js中使用process注入env文件中的环境变量

  • 访问process变量
    • 但是vite考虑带和其他配置的一些冲突我呢提,它不会直接注入到process对象下

补充:env文件是普通环境变量文件,是自动会被读取的,具体看后文

使用loadEnv方法,手动注入env环境变量:

涉及到vite.config.js中的一些配置:

  • root
  • envDir: 用来配置当前环境变量的文件地址(用这个变量来改当前环境的)
    • 修改.env 文件所在目录,也就是说替换.env文件为其他文件
    • 简单来说,就是vite编译是有生命周期的,读取环境变量是在读取配置文件之后。
    • vite给我们提供了一些补偿措施:
      • 我们可以调用vite的loadEnv来手动确认env文件
使用loadEnv方法注入:

第二个参数 envDir:

  • process.cwd方法:
    • 返回当前node进程的工作目录(当前执行命令(如yarn dev)的目录)
    • 写工作目录字符串也可以

第三个参数 perfixes:

  • env的文件名: .env是默认值,可以不传

此时可以发现,我们手动注入了env中的环境变量:

为了防止冲突,appkey不会直接放入,而是通过loadEnv手动确认导入,才进行放置。

现在只会读取配置文件中以VITE_开头的配置了,其他的包括node注入进来的都不会被读取

此时可以在服务端根据不同环境做一些处理了

.env:

  • 所有环境都需要用到的环境变量

.env.development:

  • 开发环境需要用到的环境(默认情况下vite将我们的开发环境取名为 development)

.env.production:

  • 生产环境需要用到的环境变量(默认情况下vite将我们的生产环境取名为 production)

mode变量

  • yarn dev的时候
    • vite默认会把mode设置成development
    • vite会将命令后面的 后缀 --mode development 传递给方法中的mode形参(将mode设置为 development传递进来)

  • yarn build:
    • vite默认会把mode设置为production
    • 同样可以通过后缀 --mode,改变默认值

总结:mode区分开发环境还是生产环境,可根据输入指令有默认值,但可手动修改

通过mode,vite就会默认去找 env.development 文件


当我们调用loadenv的时候,会做如下几件事:

  • 直接找到 .env 文件,并解析其中的环境变量,并放进一个对象里
  • 会将传进来的mode这个变量的值进行拼接: ".env.development" ,并根据我们提供的目录去取对应的配置文件并进行解析,并放进一个对象
  • 理解为:
const baseEnvConfig = 读取 .env 的配置
const modeEnvConfig = 读取env相关配置// 如果对象中有重复变量,后面的覆盖前面的
const lastEnvConfig = {...baseEnvConfig, ...modeEnvConfig}

上述操作只是在 vite.config.js中配置


如果是客户端, vite会将对应的环境变量注入到import.meta.env里去

在request中如何使用,也就是我配置axios,如何使用不同的环境变量

将环境变量带到客户端中:

举例:将环境变量带到axios请求中

注意:

vite做了一个拦截,为了防止我们将隐私性的变量直接送进import.meta.env中,所以做了一层拦截,如果你的环境变量不是以vite开头的,它就不会帮你注入到客户端中去

  • 给环境变量添加 VITE_ 前缀,此时就可以调用了
  • 假如环境变量并没有添加 VITE_ 前缀,就不会注入到客户端

  • 效果如下:

修改默认前缀:
  • 使用 envPrefix 去配置

  • 效果如下

完整配置项如下:
  • 恍然大悟啊

上面,我们配置了一个test环境,那么如何访问test环境呢?

  • 如下:

现在我们已经知道如何配置环境变量了,就是防止我们去手动反复的去改一些vite中环境变量的配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7631.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android GLSurfaceView 覆盖其它控件问题 (RK平台)

平台 涉及主控: RK3566 Android: 11/13 问题 在使用GLSurfaceView播放视频的过程中, 增加了一个播放控制面板, 覆盖在视频上方. 默认隐藏setVisibility(View.INVISIBLE);点击屏幕再显示出来. 然而, 在RK3566上这个简单的功能却无法正常工作. 通过缩小视频窗口可以看到, 实际…

Linux 环境变量

目录 一、环境变量的基本概念 1.常见环境变量 2.查看环境变量方法 ​3.几个环境变量 环境变量:PATH 环境变量:HOME 环境变量:SHELL 二、和环境变量相关的命令 三、库函数getenv,setenv 四、环境变量和本地变量 五、命令行…

Redis实战(黑马点评)——涉及session、redis存储验证码,双拦截器处理请求

项目整体介绍 数据库表介绍 基于session的短信验证码登录与注册 controller层 // 获取验证码PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {return userService.sendCode(phone, session);}// 获…

MYSQL数据库 - 启动与连接

MYSQL数据库的启动: 一 在cmd控制界面以管理员身份运行 执行语句: net start mysql80 net stop mysql80 二 MYSQL数据库客户端建立连接: 1 该种方法是使用windows系统的cmd界面,需要配置相关路径path 2 使用MYSQL自带的

【Salesforce】审批流程,代理登录 tips

审批流程权限 审批流程权限问题解决方案代理登录代理登录后Logout 审批流程权限 前几天,使用审批流程,但是是两个sandbox,同样的配置,我有管理员权限。但是profile不是管理员,只是通过具备管理员权限的permission set…

RDMA 工作原理 | 支持 RDMA 的网络协议

注:本文为 “RDMA” 相关文章合辑。 英文引文机翻未校。 图片清晰度受引文所限。 Introduction to Remote Direct Memory Access (RDMA) Written by: Dotan Barak on March 31, 2014.on February 13, 2015. What is RDMA? 什么是 RDMA? Direct me…

hexo + Butterfly搭建博客

Hexo‌是一个基于Node.js的静态网站生成器,主要用于快速搭建博客和个人网站。它使用Markdown语法编写文章,能够迅速生成静态页面并部署到服务器上。 配置node 使用nvm安装node(v16.13.2)后配置镜像 安装并使用node: nvm install 16.13.2 n…

手撕B-树

一、概述 1.历史 B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文

全球网络犯罪与网络安全政策的多维度分析及效能评估 摘要1 Introduction1.1 Problem Background1.2Restatement of the Problem1.3 Literature Review1.4 Our Work 2 Assumptions and Justifications数据完整性与可靠性假设:法律政策独立性假设:人口统计…

【FreeRTOS 教程 四】队列创建与发布项目到队列

目录 一、FreeRTOS队列: (1)队列介绍: (2)用户模型说明: (3)阻塞队列: 二、队列管理 API: (1)uxQueueMessagesWaiti…

如何在data.table中处理缺失值

📊💻【R语言进阶】轻松搞定缺失值,让数据清洗更高效! 👋 大家好呀!今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值,并且提供了一个自定义函数calculate_missing_va…

基于OpenCV实现的答题卡自动判卷系统

一、图像预处理 🌄 二、查找答题卡轮廓 📏 三、透视变换 🔄 四、判卷与评分 🎯 五、主函数 六、完整代码+测试图像集 总结 🌟 在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

docker部署jenkins

环境&#xff1a; centos7.9 jenkins/jenkins:lts-jdk11 1、拉去jenkins镜像&#xff0c;请指明版本号 [rootlocalhost ~]# docker pull jenkins/jenkins:lts 开始拉取 拉取完成 [rootlocalhost ~]# docker pull jenkins/jenkins:lts lts: Pulling from jenkins/jenkins 0a9…

沃尔玛 礼品卡绑定 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分代码参考 func doPost…

【2024年华为OD机试】 (A卷,100分)- 整理扑克牌(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1:分组形成组合牌 炸弹:当牌面数字相同张数大于等于4时。葫芦:3张相同牌面数字 + 2张相同牌面数字,且3张牌与2张牌不相同。三张:3张相同牌面数…

Arduino大师练成手册 --控制 OLED

要在 Arduino 上使用 U8glib 库控制带有 7 个引脚的 SPI OLED 显示屏&#xff0c;你可以按照以下步骤进行&#xff1a; 7pin OLED硬件连接 GND&#xff1a;连接到 Arduino 的 GND 引脚。 VCC&#xff1a;连接到 Arduino 的 5V 引脚。 D0&#xff08;或 SCK/CLK&#xff09;…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧&#xff0c;属于独立按键模式&#xff08;BTN模式&#xff09;&#xff0c;放在左侧为矩阵键盘模式&#xff08;KBD模式&#xff09; 整体结构是一端接地&#xff0c;一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

AWScurl笔记

摘要 AWScurl是一款专为与AWS服务交互设计的命令行工具&#xff0c;它模拟了curl的功能并添加了AWS签名版本4的支持。这一特性使得用户能够安全有效地执行带有AWS签名的请求&#xff0c;极大地提升了与AWS服务交互时的安全性和有效性。 GitHub - okigan/awscurl: curl-like acc…

初识MySQL

文章目录 1.数据库2.查看数据库3.创建数据库4.字符集编码和排序规则6.修改数据库7.删除数据库 1.数据库 MySQL是一款使用率高且免费的数据库&#xff08;使用率仅仅低于Oracle&#xff09; 关系数据库和 NoSQL 数据库管理系统知识库(DB-Engines Ranking -) (此图数据于2025-1…