当前位置: 首页 > news >正文

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档:https://cn.vitejs.dev/

环境变量

Vite 内置的环境变量如下:

{"MODE": "development",	// 应用的运行环境"BASE_URL": "/",	// 部署应用时使用的 URL 前缀"PROD": false,	//应用是否正在生产环境中运行"DEV": true,	// 与 PROD 相反,表示应用是否在开发环境中运行。"SSR": false	//应用是否在服务器端渲染模式
}

.env 文件

Vite 启动时会根据运行环境(即启动命令--mode [mode]),从环境目录(默认为index.html 文件所在的位置)中的下列文件加载额外的环境变量,同时将其中的变量注入到 import.meta.env 对象中:

.env                # 所有情况下都会加载
.env.local          # 所有情况下都会加载,但会被 git 忽略
.env.[mode]         # 只在指定模式下加载
.env.[mode].local   # 只在指定模式下加载,但会被 git 忽略

注:默认情况下.env文件中的变量需要以 VITE_ 为前缀,自定义变量前缀需要特殊配置。

注:加载的环境变量会以字符串形式注入import.meta.env`,在代码中使用时,需要将其转换为所需的类型。

获取环境变量

在业务代码中获取变量

在项目中使用import.meta.env对象获取环境变量:

<script setup lang="ts">
const title = import.meta.env.VITE_PORT
</script><template><h1>{{ title }}</h1>
</template>

image-20240610200157298

在 HTML 文件中获取变量

在 HTML 文件中获取环境变量时,可以通过%ENV_NAME%语法获取import.meta.env 中的任何属性:

<title>%VITE_APP_TITLE%</title>

注:如果环境变量在 import.meta.env 中不存在,则会将被忽略而不被替换,这与 JS 中不同,在 JS 中会被替换为 undefined

在 vite.config.ts 中获取变量

Vite 默认是不加载 .env 文件的,因为这些文件需要在执行完 Vite 配置后才能确定加载哪一个,举个例子,rootenvDir 选项会影响加载行为。

不过当我们需要在 vite.config.ts 中获取变量时,可以使用 Vite 导出的 loadEnv 函数来加载指定的 .env 文件:

import { defineConfig, loadEnv } from 'vite'export default defineConfig(({ command, mode }) => {// 根据当前工作目录中的 `mode` 加载 .env 文件// 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。const env = loadEnv(mode, process.cwd(), '')return {// vite 配置define: {__APP_ENV__: JSON.stringify(env.APP_ENV),},}
})

自定义变量的前缀

自定义 env 变量的前缀,可以在vite.config.ts文件中配置envPrefix

import { defineConfig } from 'vite'// Vite 配置对象
export default defineConfig({envPrefix: 'ENV_', // 环境变量前缀
})

这样以 envPrefix 开头的环境变量就会被注入到import.meta.env对象中。

注:当检测到envPrefix被设置为空字符串''时,Vite 将会抛出错误,防止敏感信息的意外泄漏。

当我们想暴露一个不含前缀的变量,可以使用define设置变量:

export default defineConfig({define: {'import.meta.env.ENV_APP_TITLE': JSON.stringify("My App")}
})

指定加载 .env 文件目录

需要指定 Vite 加载.env文件目录时,需要在vite.config.ts文件中设置envDir属性:

export default defineConfig({envDir: './env', // 环境变量文件目录,可以是一个绝对路径,也可以是相对于项目根的路径
})

修改 Vite 启动配置

我们可以在vite.config.ts文件中直接修改 Vite 启动配置,只是需要做一些特殊处理:由于 Vite 加载.env文件时其中的环境变量会以字符串形式注入 import.meta.env 对象,所以我们需要对其中的 number、boolean 类型的变量进行类型转换。

例如我们希望在项目启动时,占用端口号从默认的 5173 变为 8080 端口,同时在执行完npm run dev命令后自动弹出浏览器访问页面。

在 .env 文件中添加以下变量:

# 端口号
VITE_PORT = 8080# 是否自动打开浏览器
VITE_OPEN = true

vite.config.ts文件中使用loadEnv函数获取当前环境变量,之后将环境变量由字符串类型转为对应类型,最后将配置对象返回:

import { defineConfig, loadEnv } from 'vite' // 引入 Vite 中的 defineConfig 函数
import vue from '@vitejs/plugin-vue' // 引入 Vite 中的 Vue 插件// Vite 配置对象
export default defineConfig(({ mode }) => {// 获取当前环境变量const env = loadEnv(mode, process.cwd())// 转换环境变量 VITE_PORT 为数字类型const port = Number(env.VITE_PORT)// 转换环境变量 VITE_OPEN 为布尔类型const open = Boolean(env.VITE_OPEN)// 配置 Vite 插件return {plugins: [vue()],// 配置开发服务器server: {port: port,open: open,}}
})

执行命令查看占用端口:

image-20240610195813944

相关文章:

  • 鸿蒙NEXT开发中的知识:构建自己的ArkTS应用工程(Stage模型)
  • Redis面试题自测
  • leetcode34:在排序数组中查找元素的第一个和最后一个位置
  • JMeter的基本使用与性能测试,完整入门篇保姆式教程
  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自由
  • Aidlux 1.4 部署homeassistant core 2024.6实录
  • java试卷练习1
  • 简易版的进程池
  • print(“{}{}“.format())
  • 四、SpringMVC实战:构建高效表述层框架(二)
  • leetcode322零钱兑换(背包问题)
  • 图像分割(三)-RGB转HSV后图像分割方法
  • USB学习——12、usb初始化和插拔驱动软件流程大致框架描述
  • HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)
  • Autodesk Revit产品痛点
  • [数据结构]链表的实现在PHP中
  • CSS 提示工具(Tooltip)
  • download使用浅析
  • ECMAScript入门(七)--Module语法
  • Javascript Math对象和Date对象常用方法详解
  • Java方法详解
  • python3 使用 asyncio 代替线程
  • quasar-framework cnodejs社区
  • React系列之 Redux 架构模式
  • Solarized Scheme
  • supervisor 永不挂掉的进程 安装以及使用
  • ViewService——一种保证客户端与服务端同步的方法
  • vue:响应原理
  • Vue实战(四)登录/注册页的实现
  • vue中实现单选
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 浮动相关
  • 回顾2016
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 警报:线上事故之CountDownLatch的威力
  • 聊聊directory traversal attack
  • 那些被忽略的 JavaScript 数组方法细节
  • 什么软件可以剪辑音乐?
  • ​水经微图Web1.5.0版即将上线
  • #include到底该写在哪
  • $GOPATH/go.mod exists but should not goland
  • $refs 、$nextTic、动态组件、name的使用
  • (160)时序收敛--->(10)时序收敛十
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (ibm)Java 语言的 XPath API
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)关于多人操作数据的处理策略
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net Web项目创建比较不错的参考文章