(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", // 更改环境变量注入到业务代码中,所需的前缀名
});

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

在这里插入图片描述

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

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

相关文章

【OpenGauss源码学习 —— 列存储(ColumnTableSample)】

执行算子(ColumnTableSample) 概述ColumnTableSample 类ColumnTableSample::ColumnTableSample 构造函数ColumnTableSample::~ColumnTableSample 析构函数ExecCStoreScan 函数ColumnTableSample::scanVecSample 函数ColumnTableSample::getMaxOffset 函数…

「Qt Widget中文示例指南」如何创建一个计算器?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何使用…

快速幂极简写法快速幂求逆元

快速幂原理介绍 快速幂模板 int qmi(int a, int k, int p) {int res 1;while (k) {//后面的a其实是底数与其指数的运算结果了,是不断迭代的//第一个a其实就是a的2的0次方if (k & 1) res (res * a) % p;a (a * a) % p;//注意,a是一个不断变化的过…

聊一聊Linux动态链接和GOT、PLT

共享动态库是现代系统的一个重要组成部分,大家肯定都不陌生,但是通常对背后的一些细节上的实现机制了解得不够深入。当然,网上有很多关于这方面的文章。希望这篇文章能够以一种与其他文章不同的角度呈现,可以对你产生一点启发。 …

【开源】基于Vue和SpringBoot的服装店库存管理系统

项目编号: S 052 ,文末获取源码。 \color{red}{项目编号:S052,文末获取源码。} 项目编号:S052,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

什么是Jmeter ?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本…

Continuity” of stochastic integral wrt Brownian motion

See https://imathworks.com/math/math-continuity-of-stochastic-integral-wrt-brownian-motion/

5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)

代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是一种新型元启发式优化算法,该算法是受飞蛾围绕火焰飞行启发而提出的,具有搜索速度快、寻优能力强的…

梯度引导的分子生成扩散模型- GaUDI 评测

GaUDI模型来自于以色列理工Tomer Weiss的2023年发表在预印本ChemRxiv上的工作 《Guided Diffusion for Inverse Molecular Design》。原文链接:Guided Diffusion for Inverse Molecular Design | Materials Chemistry | ChemRxiv | Cambridge Open Engage GaUDI模型…

LeSS敏捷框架高效生产力实践

每个团队可能都有一套适合自己的敏捷方法,本文介绍了ResponseTap工程团队通过采用LeSS框架、引入准备周,从而提升迭代冲刺研发效能的实践。原文: LeSS Agile, More Productive — Part 1: Pain[1], LeSS Agile, More Productive — Part 2: Promise, LeS…

开源的进销存系统都有哪些?

开源的进销存系统有很多,以下是其中一些比较流行的: OpenERP:一个集成了多个业务功能的开源ERP软件,可以实现进销存管理,会计,仓库管理,销售管理等业务功能。 Odoo:是OpenERP的一个分支&#x…

【智能优化算法】从蚁群到动物园

目录 引言蚁群优化算法(ACO)ACO 机理ACO 模型描述ACO 移动策略 粒子群优化算法(PSO)PSO 机理PSO 模型描述 萤火虫群优化算法(GSO)GSO 机理GSO 模型描述 群智能优化算法 引言 21世纪,人类社会已经…

Python绘图库Plotly用超简单代码实现丰富的数据可视化图表

文章目录 前言Plotly 概述散点图时间序列分析 高级绘图功能散点图矩阵关系热图自定义主题 在 Plotly 图表工坊(Plotly Chart Studio)里编辑技术交流关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Pyt…

万字长文深入理解 cache,写出高性能代码

CACHE的一致性 Cache的一致性有这么几个层面 1. 一个CPU的icache和dcache的同步问题 2. 多个CPU各自的cache同步问题 3. CPU与设备(其实也可能是个异构处理器,不过在Linux运行的CPU眼里,都是设备,都是DMA)的cache同…

react等效memo的方法

视频教程 前端技术|Dan博客|在你写memo()之前_哔哩哔哩_bilibili 把与ExpensiveTree的无关的dom做成一个组件 第二种情况,color在ExpensiveTree组件的父级dom 创建一个组件,将state的color和input写上,而ExpensiveTr…

接入电商数据平台官方开放平台API接口获取商品实时信息数据,销量,评论,详情页演示

要接入电商数据平台官方开放平台API接口获取商品实时信息数据、销量、评论和详情页演示,需要按照以下步骤进行操作: 找到可用的API接口:首先,需要找到支持查询商品信息的API接口。可以在电商数据平台的官方开放平台上查找相应的AP…

springboot多环境配置

前言 在实际项目研发中,需要针对不同的运行环境,如开发环境、测试环境、生产环境等,每个运行环境的数据库…等配置都不相同,每次发布测试、更新生产都需要手动修改相关系统配置。这种方式特别麻烦,费时费力&#xff0…

n-皇后问题(DFS回溯)

n−皇后问题是指将 n 个皇后放在 nn的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包含整数 n。 输出…

2023年【四川省安全员A证】复审考试及四川省安全员A证考试试题

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证复审考试根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通过…

Gitlab安装与操作

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的…