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 = 110

BASE_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中环境变量的配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用JavaScript实现猜数字小功能

引言: 在学习编程的过程中,通过实际的小项目来巩固知识是非常有效的方法。今天,我们将使用 JavaScript 来实现一个简单的猜数字游戏。这个游戏不仅能让我们熟悉 JavaScript 的基本语法,还能锻炼我们的逻辑思维能力。 游戏规则 …

数据结构——概念与时间空间复杂度

目录 前言 一相关概念 1什么是数据结构 2什么是算法 二算法效率 1如何衡量算法效率的好坏 2算法的复杂度 三时间复杂度 1时间复杂度表示 2计算时间复杂度 2.1题一 2.2题二 2.3题三 2.4题四 2.5题五 2.6题六 2.7题七 2.8题八 四空间复杂度 1题一 2题二 3…

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能

【1】原贴地址:eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下: 更新eclipse-24-09版本后之后,新的搜索功能(CT…

Django基础之ORM

一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…

纯css实现div宽度可调整

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>纯css实现div尺寸可调整</title><style…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

小游戏源码开发搭建技术栈和服务器配置流程

近些年各种场景小游戏开发搭建版本层出不穷,山东布谷科技拥有多年海内外小游戏源码开发经验&#xff0c;现为从事小游戏源码开发或游戏运营的朋友们详细介绍小游戏开发及服务器配置流程。 一、可以对接到app的小游戏是如何开发的 1、小游戏源码开发的需求分析&#xff1a; 明…

Linux C\C++编程-文件位置指针与读写文件数据块

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Linu…

一文简单回顾复习Java基础概念

还是和往常一样&#xff0c;我以提问的方式回顾复习&#xff0c;今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢&#xff1f; Java语言的特点有&#xff1a; 面向对象&#xff0c;主要是封装、继承、多态&#xff1b;平台无关性&#xff0c;“一次编写…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识&#xff0c;了解到最小二乘法可以做线性回归分析&#xff0c;但为何最小二乘法如此准确&#xff0c;这需要从概率论的角度给出依据。 因此从本文起&#xff0c;需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

16.好数python解法——2024年省赛蓝桥杯真题

问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …

2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

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

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

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目&#xff1a;https://github.com/SunStorm2018/Brightness.git 原理&#xff1a;Brightness Controlle 是我在 Ubuntu 发现上调…

STM32简介

STM32简介 STM32是ST公司基于ARMCortex-M内核开发的32位微控制器 &#xff08;Microcontroller&#xff09; MCU微控制器、MPU微处理器、CPU中央处理器 1.应用领域 STM32常应用于嵌入式领域。 如智能车&#xff1a;循迹小车 读取光电传感器或者摄像头的数据&#xff0c;…

qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别

qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别 code review! 参考笔记 1.qt-C笔记之重写QGraphicsItem的paint方法(自定义QGraphicsItem) 文章目录 qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphic…