(02)vite环境变量配置

文章目录

    • 将开发环境和生产环境区分开
    • 环境变量
    • vite处理环境变量
      • loadEnv
    • 业务代码需要使用环境变量
      • `.env`
      • `.env.development`
      • `.env.test`
      • 修改`VITE_`前缀

在这里插入图片描述

将开发环境和生产环境区分开

分别创建三个vite 的配置文件,并将它们引入vite.config.js

vite.base.config.js

import { defineConfig } from "vite"export default defineConfig ({})

vite.dev.config.js

import { defineConfig } from "vite"export default defineConfig ({})

vite.prd.config.js

import { defineConfig } from "vite"export default defineConfig ({})

引入vite.config.js

import { defineConfig } from "vite";
import viteBaseConfig from "./vite.base.config";
import viteDevConfig from "./vite.dev.config";
import vitePrdConfig from "./vite.prd.config";const EnvMap = {build: () => {return Object.assign({}, viteBaseConfig, vitePrdConfig);},serve: () => {return Object.assign({}, viteBaseConfig, viteDevConfig);},
};export default defineConfig(({ command }) => {console.log("command:", command);return EnvMap[command]();
});

在package.json中配置vite的开发命令和打包命令

{"name": "vite","version": "1.0.0","main": "index.js","license": "MIT","scripts": {"dev": "vite","build": "vite build"},"dependencies": {"lodash": "^4.17.21",},"devDependencies": {"vite": "^5.0.0"}
}

分别执行一下以下两行命令

yarn dev
yarn build

可以看到,确实能够根据command这个变量,来区分开发还是生产。
在这里插入图片描述

环境变量

会根据当前当前代码所在环境而发生变化的变量。

代码环境通常包括
开发环境、测试环境、预发布环境、灰度环境、生产环境

比如百度地图的sdk,某些第三方请求特定的密钥或者token,以及小程序的APP_KEY,不同环境请求的后端接口地址也有可能不同。

以上这些举例的变量,都会因为开发周期的变化,用不同的变量值,这个时候,如果这些变量能够根据环境的变化自动变化,就比较完美,减少人工干预,才可能不出错。

vite处理环境变量

vite内置第三方库dotenv来处理环境变量的获取和注入。

dotenv会自动读取.env文件,并解析这个文件的环境变量,并将其挂到process对象(nodejs的process)上。

创建.env文件,vite默认在.env创建全局环境变量,

NAME = "dengxi"
POSITION = "CEO"

更改vite.config.js配置,这里引入了vite自带的方法loadEnv

import { defineConfig, loadEnv } from "vite";
import viteBaseConfig from "./vite.base.config";
import viteDevConfig from "./vite.dev.config";
import vitePrdConfig from "./vite.prd.config";const EnvMap = {build: () => {return Object.assign({}, viteBaseConfig, vitePrdConfig);},serve: () => {return Object.assign({}, viteBaseConfig, viteDevConfig);},
};export default defineConfig(({ command, mode }) => {console.log("command:", command);  console.log("mode:", mode) const env = loadEnv(mode, process.cwd(),"");console.log("env:", env.NAME) return EnvMap[command]();
});

无论是通过vite创建服务器,还是通过vite打包,我们都能获取到。

yarn dev
yarn build

左侧是vite启动开发服务器,右侧是vite打包到生茶环境,它们都能获取到.env配置的环境变量
在这里插入图片描述

loadEnv

这个方法非常重要,通过它我们可以自由配置环境变量的存储文件,vite虽然提供了默认的.env,但这显然是不够用的,实际项目中,可能会有很多环境,需要将不同的环境变量放到不同的文件中。

loadEnv接收三个参数,第一个参数来自我们的启动命令,如果是vite自带的启动服务命令yarn vite 本文中配置的是yarn dev, mode === 'development' // true ,如果vite自带的打包命令 yarn vite build,本文中配置的是yarn buildmode === 'production' // true

左边是启动服务器,右边是打包
在这里插入图片描述

如果你想自由配置这个mode的值怎么办呢?

yarn vite --mode 'test'

在这里插入图片描述

这样就可以通过不同的命令,来控制mode变量了。

loadEnv的第二个参数,其实是用来存放环境变量文件所在的路径,一般这种配置文件,都是放到项目根目录下的,通过process.cwd()方法,可以获取当前node进程所在的位置,也就是vite.config.js文件所在的位置,而vite.config.js也在项目根目录下,所以可以这么直接用。但本质上第二个参数就是一个路径,理论上,通过配置这第二个参数,我们能够将存储变量的文件放到任意路径下。

loadEnv的第三个参数,是用来配置存储环境变量文件的文件名前缀,默认是.env,通过配置它,我们就能有多个不同环境的配置环境变量的文件了。

如果第三个参数传入 ENV,那默认的存储全局环境变量的文件就得改名为ENV
生产环境存储环境变量的文件,就得改名为ENV.production
开发环境存储环境变量的文件,就得改名为 ENV.development

创建 .env.development 文件 ,文件名称由上文提到的loadEnv方法的第三个参数 和 上文提到的 mode 组合而成,默认开发环境loadEnv方法的第三个参数是.env,默认开发环境modedevelopment

NAME = "yangxi"
AGE = 20

创建 .env.production 文件 ,文件名称由上文提到的loadEnv方法的第三个参数 和 上文提到的 mode 组合而成,默认生产环境loadEnv方法的第三个参数是.env,默认生产环境modeproduction

NAME = "yangxianddengxi"
AGE = 38

再自定义一个test环境
创建 .env.test 文件

NAME = "firstname lastname"
AGE = "number"

此时的vite.config.js

import { defineConfig, loadEnv } from "vite";
import viteBaseConfig from "./vite.base.config.js";
import viteDevConfig from "./vite.dev.config.js";
import vitePrdConfig from "./vite.prd.config.js";const EnvMap = {build: () => {return Object.assign({}, viteBaseConfig, vitePrdConfig);},serve: () => {return Object.assign({}, viteBaseConfig, viteDevConfig);},
};export default defineConfig(({ command, mode }) => {const env = loadEnv(mode, process.cwd(),"");console.log("env", env.NAME); // 获取当前的环境变量return EnvMap[command]();
});

分别执行以下命令

yarn dev // 或者yarn vite
yarn build // 或者yarn vite build
yarn dev --mode 'test' // 或者 yarn vite --mode 'test'

左边是development ,中间是production,右边是test
在这里插入图片描述

env.POSITION 只有.env文件配置了,所以三个环境都能拿到,没有被覆盖。
env.NAME 每个环境都配置了,.env配置的变量被覆盖了,三个环境拿到的值都不一样。

业务代码需要使用环境变量

上面介绍了在vite中如何配置和使用环境变量,实际开发中,我们在业务中,也常常要使用环境变量。

环境变量,会被vite注入到import.meta.env这个变量中

我们重新配置一下 .env.env.development.env.test

.env

# 上面是服务器所需的环境变量
NAME = "dengxi"
POSITION = "CEO"# 下面是业务中所需的环境变量,业务中的环境变量默认必须带有前缀VITE_,这样的变量才会被vite注入到import.meta.env
VITE_CAN = "全栈开发"
VITE_DO = "全栈开发"

.env.development

# 上面是服务器所需的环境变量
NAME = "yangxi"
AGE = 20# 下面是业务中所需的环境变量,业务中的环境变量默认必须带有前缀VITE_,这样的变量才会被vite注入到import.meta.env
VITE_CAN = "前端开发"

.env.test

# 上面是服务器所需的环境变量
NAME = "firstname lastname"
AGE = "number"# 下面是业务中所需的环境变量,业务中的环境变量默认必须带有前缀VITE_,这样的变量才会被vite注入到import.meta.env
VITE_CAN = "啥也不会"

我们在main.js中尝试打印 import.meta.env

import { count } from "./counter.js";console.log(import.meta.env)console.log(count);

分别启动development环境的服务器和test环境的服务器

yarn build // 或者yarn vite build
yarn dev --mode 'test' // 或者 yarn vite --mode 'test'

在这里插入图片描述
分别打开浏览器查看

development环境
在这里插入图片描述
test环境
在这里插入图片描述

环境变量中,只有VITE_前缀的环境变量才被成功注入到import.meta.env中,供业务端使用
.env的全局配置变量VITE_DO也被注入了,但如果对应的环境变量中,有同名的变量,它VITE_CAN将会被覆盖

修改VITE_前缀

默认强制加一个VITE_才能注入到业务中,也挺恶心的,但必须得有一个前缀,不然如何区分注入服务器的环境变量和业务中使用的环境变量呢

通过配置envPrefix来改变使用的前缀,一般来说不同环境使用的环境变量名称都是相同,不然你就得在不同的环境配置不同名称的环境变量,而且在使用的时候也要用不同的名字,太麻烦了。所以这个envPrefix配置在vite.base.config.js即可。

vite.base.config.js

import { defineConfig } from "vite";export default defineConfig({optimizeDeps: {exclude: [], // 将指定数组中的依赖不进行预构建},envPrefix: "ENV", // 更改环境变量注入到业务代码中,所需的前缀名
});

修改完对应的环境变量名称后,一样能拿到环境变量
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

深入探讨软件测试技术:方法、工具与最佳实践

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 软件测试是软件开发生命周期中至关重要的…

SO3 与so3 SE3与se3 SIM3

文章目录 1 旋转*叉乘1.1 旋转矩阵的导数1.2 物理意义1.3 实例1.4 角轴与反对称矩阵 2 SO3 与so32.1 so3 2 SO32.2 SO3 2 so3 3 SE3 与se33.1 se3 2 SE3:3.2 SE3 2 se3 4 SIM3 与sim35 Adjoint Map 1 旋转*叉乘 1.1 旋转矩阵的导数 根据旋转矩阵的性质: R R T I …

2023年以就业为目的学习Java还有必要吗?

文章目录 1活力四射的 Java2从零开始学会 Java3talk is cheap, show me the code4结语写作末尾 现在学 Java 找工作还有优势吗? 在某乎上可以看到大家对此问题的热议:“2023年以就业为目的学习Java还有必要吗?” 。有人说市场饱和&#xff0c…

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于白冠鸡优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

django ModelSerializer自定义显示字段

文章目录 前言一、问题二、解决 前言 最近在复习django的时候,发现了一个有趣的问题,解决了之后特意记录下来,以供以后参考。 一、问题 相信大家使用django的时候,被其DRF的强大功能所折服,因为它能通过简单的代码就…

威班11月份PMP模拟考试实录

11月份模拟考试于2023年11月18日在深圳市福田区鹏基商务时空大厦成功举办! 本次线下模拟考试依旧是通过线上线下同步的方式进行,在深圳周边的学员直接到达现场参与模拟考试,全国各地不能到达现场的其他学员已提前收到考试所需资料&#xff0…

C++ LibCurl实现Web指纹识别

Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术。这项技术旨在识别Web服务器、Web应用框架、后端数据库、JavaScript库等组件的版本和配置信息。通过分析HTTP响应头、HTML源代码、JavaScript代码、CSS文件等&#x…

【ARM Trace32(劳特巴赫) 使用介绍 2.3 -- TRACE32 进阶命令之 参数传递介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 参数传递命令 ENTRY 参数传递命令 ENTRY ENTRY <parlist>The ENTRY command can be used to Pass parameters to a PRACTICE script or to a subroutineTo return a value from a subroutine 使用示例&am…

《洛谷深入浅出基础篇》P3916 图的遍历——逆向搜索

上链接&#xff1a; P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3916上题干&#xff1a; 题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v) 表示从点 v 出发&#xff0c;能到…

合并区间(排序、贪心)

LCR 074. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

改进YOLOv8:结合Biformer——基于动态稀疏注意力构建高效金字塔网络架构

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

Unity 场景烘培 ——unity灯光和设置天空盒(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神指出。 文章目录 前言一、光源种类1.Directional Light(方向光&#xff0c;平行光)2.Point Light&#xff08;点光源&#xff09;3.Spotlight&#xff08;聚光灯&#xff09;4.Area Light&#xff08;区域光&#xff…

【C++】——多态性与模板(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

import.meta.glob() 如何导入多个目录下的资源

import.meta.glob() 如何导入多个目录下的资源 刚开始用 vite&#xff0c;在做动态路由的时候遇到了这个问题&#xff0c;看到其它教程上都是只引用了一个目录层级的内容&#xff0c;比如这样&#xff1a; let RouterModules import.meta.glob("/src/view/*/*.vue"…

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…

STM32定时器输入捕获测量高电平时间

STM32定时器输入捕获测量高电平时间 输入捕获测量高电平时间CuebMX配置代码部分 本篇内容要求读者对STM32通用定时器有一点理解&#xff0c;如有不解&#xff0c;请看 夜深人静学32系列15——通用定时器 输入捕获 输入捕获是STM32通用定时器的一种功能&#xff0c;可以捕获特定…

axios 请求合集

post 请求 请求负载请求参数&#xff08;Request Payload&#xff09; import axios from axios import qs from query-stringexport function getRoles(data){return axios.post(目标地址,data,{headers:{Content-Type: application/json,},}) }表单请求参数&#xff08;Form…

OGG-01224 Address already in use 问题

ERROR OGG-01224 Oracle GoldenGate Manager for Oracle, mgr.prm: Address already in use. ERROR OGG-01668 Oracle GoldenGate Manager for Oracle, mgr.prm: PROCESS ABENDING. 查看端口被占用情况&#xff1a; [rootcenterone ogg]# lsof -i:7809原因mgr 7809 端口被占…

Spring-IOC-@Value和@PropertySource用法

1、Book.java PropertySource(value"classpath:配置文件地址") 替代 <context:property-placeholder location"配置文件地址"/> Value("${book.bid}") Value("${book.bname}") Value("${book.price}") <bean id&…

MS90C386:+3.3V 175MHz 的 24bit 平板显示器(FPD)LVDS 信号接收器

产品简述 MS90C386 芯片能够将 4 通道的低压差分信号&#xff08; LVDS &#xff09;转换成 28bit 的 TTL 数据。时钟通道与数据通道并行输入。在时钟频率 为 175MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控制数据以 1225Mb…