vue3+ts项目中.env配置环境变量与情景配置

一、环境变量配置

官网https://cn.vitejs.dev/guide/env-and-mode.html#intellisense

1. 新建.env开头的文件在根目录

为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码

.env 所有环境默认加载
.env.development 开发模式默认加载
.env.production 生产模式默认加载
.env.check 自定义环境文件

示例:如.env文件

# title
VITE_APP_TITLE = vue-guide-project
a. 模式

默认情况下,开发服务器 (dev 命令) 运行在 development (开发) 模式,而 build 命令则运行在 production (生产) 模式。
这意味着当执行 vite build 时,它会自动加载 .env.production 中可能存在的环境变量。
在某些情况下,若想在 vite build 时运行不同的模式来渲染不同的标题,可以通过传递 --mode 选项标志来覆盖命令使用的默认模式。例如,如果你想在 staging (预发布)模式下构建应用:

vite build --mode staging# package.json
{# ..."type": "module","scripts": {"dev": "vite","build": "vite build --mode staging",},
}

还需要新建一个 .env.staging 文件:

# .env.staging
VITE_APP_TITLE = My App (staging)
b. 简单了解下NODE_ENV和模式Mode
  • NODE_ENV
    定义:技术上讲,NODE_ENV是一个由Node.js暴露给执行脚本的系统环境变量。
    作用:通常用于确定服务器工具、构建脚本和客户端library在开发环境(development)还是生产环境(production)下的行为。它的值通常为"production"或"development",用于区分不同环境下的逻辑行为。
  • 模式(Mode):
    定义:模式指项目运行或构建时的一种特定状态或配置。
    作用:在前端框架中,模式用于定义项目在不同阶段(如开发、生产、测试)下的行为和配置。它可以包含多个环境变量,并通过特定的文件(如.env.production.env.development等)来管理这些变量。

所以,我们所写的.env可以理解为创建的不同的模式变量

2. TypeScript 智能提示,设置全局类型定义

就是在编码过程中应用这些自定义环境变量的时候,给出的智能提示。

  1. src 目录下创建一个 vite-env.d.ts 或者 env.d.ts 文件
  2. src同级别types目录下创建文件env.d.ts
/// <reference types="vite/client" />interface ImportMetaEnv {readonly VITE_APP_TITLE: string// 更多环境变量...
}interface ImportMeta {readonly env: ImportMetaEnv
}interface ViteEnv  extends ImportMetaEnv {}
  1. tsconfig.app.json文件中

专门用于处理项目src文件中的TypeScript配置文件,

  • include配置项加入文件:(会提示自定义设置的环境变量)
"include": [// ...// 第一种方式对应配置"vite-env.d.ts", // 或者 "env.d.ts" // 第二种方式对应配置"types/**.d.ts" // 或者直接 "types" 
],

效果图:
在这里插入图片描述

  • 或者compilerOptions中加入types:(只会提示默认环境变量)
{"compilerOptions": {// ..."types": ["vite/client"]}
}

效果图:
在这里插入图片描述

3. 访问环境变量

  1. 客户端源码(就是src文件)中访问:import.meta.env.VITE_APP_TITLE
  2. html中访问环境变量:%VITE_APP_TITLE%,如果环境变量不存在,则会将被忽略而不被替换,
  3. 在配置(src文件外)文件中访问环境变量

Vite 默认是不加载 .env 文件的,因为这些文件需要在执行完 Vite 配置后才能确定加载哪一个,举个例子,rootenvDir 选项会影响加载行为。不过当你的确需要时,你可以使用 Vite 导出的 loadEnv 函数来加载指定的 .env 文件。

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

输出:console.log(env)

在这里插入图片描述

二、情景配置-根据不同模式使用不同插件

1. 新建build/getEnv.ts 文件处理环境文件变量

loadEnv()获取的环境变量env从输出的值可以看出,全是字符串,所以我们可以自定义方法去转换变量类型

/* eslint-disable */
// Read all environment variable configuration files to process.env
export function wrapperEnv(envConf: any): ViteEnv {const ret: any = {}for (const envName of Object.keys(envConf)) {let realName = envConf[envName].replace(/\\n/g, '\n')realName = realName === 'true' ? true : realName === 'false' ? false : realNameif (envName === 'VITE_PORT') {realName = Number(realName)}if (envName === 'VITE_PROXY' && realName) {try {realName = JSON.parse(realName.replace(/'/g, '"'))} catch (error) {realName = ''}}ret[envName] = realName}return ret
}

2. build/plugins/index.ts

新建build/plugins 文件夹处理各种plugins,将每一个plugin配置单独抽离

  • plugins文件目录
    在这里插入图片描述

  • 入口文件build/plugins/index.ts

// 插件配置 入口文件index.ts
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { PluginOption } from 'vite'
import VueDevTools from 'vite-plugin-vue-devtools'import { Px2remPlugin } from './Px2rem' // rem
import { svgLoaderPlugin } from './SvgLoader' // SVG
import { UnocssPlugin } from './Unocss' // unocss
import { VisualizerPlugin } from './Visualizer' // 打包分析
import { ViteCompressionPlugin } from './ViteCompression' // 压缩gzip
import { ViteImageOptimizerPlugin } from './ViteImageOptimizer' // 图片压缩
import { ViteRestartPlugin } from './ViteRestartPlugin' // 修改配置文件自动重启export const usePlugins = (isBuild: boolean, viteEnv: ViteEnv) => {const { VITE_OPEN_VISUALIZER, VITE_OPEN_SVG_LOADER, VITE_OPEN_PX2REM, VITE_OPEN_COMPRESSION } =viteEnvconst plugins: PluginOption[] = [vue(), vueJsx()]plugins.push(UnocssPlugin())if (VITE_OPEN_PX2REM) plugins.push(Px2remPlugin())if (VITE_OPEN_SVG_LOADER) plugins.push(svgLoaderPlugin())// 开发模式下if (!isBuild) {plugins.push(VueDevTools())plugins.push(ViteRestartPlugin())}if (isBuild) {plugins.push(ViteImageOptimizerPlugin())// 压缩gzipVITE_OPEN_COMPRESSION && plugins.push(ViteCompressionPlugin())// 打包分析VITE_OPEN_VISUALIZER && plugins.push(VisualizerPlugin())}return plugins
}
  • 单个plugin示例:
    在这里插入图片描述

4. tsconfig.node.json

专门用于Node.js环境中的TypeScript配置文件,它定义了用于Node.js应用程序的TypeScript编译器选项

tsconfig.node.json文件中:

"include": [// ..."build/**/*.ts","types" // 全局类型
],

5. .eslintrc.cjs中添加:

overrides: [{files: ['*.ts', '*.tsx', '*.vue'],rules: {// 解决 ts 全局类型定义后,eslint报错的问题'no-undef': 'off'}}
],
// ...
'no-unused-expressions': 'off' // 关闭禁止使用表达式

3. vite.config.ts

import { usePlugins } from './build/plugins'
// ...
export default defineConfig(({ command, mode }) => {const isBuild = command === 'build'const root = process.cwd()const env = loadEnv(mode, root)const viteEnv = wrapperEnv(env)return {plugins: usePlugins(isBuild, viteEnv),// ...}
})

三、情景配置-serverbuild配置

build文件夹中创建server.tsbuild.ts文件

1. 将build配置写入build.ts文件中

export const useBuild = () => {return {// 10kb以下,转Base64assetsInlineLimit: 1024 * 10,// chunkSizeWarningLimit: 1500,//配置文件大小提醒限制,默认500rollupOptions: {output: {// 每个node_modules模块分成一个js文件manualChunks(id: string) {if (id.includes('node_modules')) {return 'vendor'// return id.toString().split('node_modules/.pnpm/')[1].split('/')[0].toString()}return undefined},// 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值entryFileNames: 'assets/js/[name].[hash].js', // 用于命名代码拆分时创建的共享块的输出命名chunkFileNames: 'assets/js/[name].[hash].js', // 用于输出静态资源的命名,[ext]表示文件扩展名assetFileNames: 'assets/[ext]/[name].[hash].[ext]'}}}
}

2. 将server配置写入server.ts文件中

import type { ProxyOptions } from 'vite'type ProxyItem = [string, string]
type ProxyList = ProxyItem[]
type ProxyTargetList = Record<string, ProxyOptions>/*** 创建代理,用于解析 .env.development 代理配置*/
const userProxy = (proxyList: ProxyList = []) => {const ret: ProxyTargetList = {}proxyList.forEach((item) => {const [prefix, target] = itemconst httpsRE = /^https:\/\//const isHttps = httpsRE.test(target)ret[prefix] = {target,changeOrigin: true,ws: true,rewrite: (path: string) => path.replace(new RegExp(`^${prefix}`), ''),// https is require secure=false// Verify SSL certificate...(isHttps ? { secure: false } : {})}})return ret
}/*** server 配置* @returns*/
export const useServer = (viteEnv: ViteEnv) => {const { VITE_PORT, VITE_PROXY } = viteEnvreturn {// 监听所有公共ip// host: '0.0.0.0',cors: true,port: VITE_PORT,proxy: userProxy(VITE_PROXY)}
}

3. 完整vite.config.ts文件

import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'import { useBuild } from './build/build'
import { wrapperEnv } from './build/getEnv'
import { usePlugins } from './build/plugins'
import { useServer } from './build/server'export default defineConfig(({ command, mode }) => {const isBuild = command === 'build'const root = process.cwd()const env = loadEnv(mode, root)const viteEnv = wrapperEnv(env)return {plugins: usePlugins(isBuild, viteEnv),server: useServer(viteEnv),build: useBuild(),resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}},css: {preprocessorOptions: {scss: {additionalData: `@use "./src/styles/variables.scss" as *;@use "./src/styles/mixin.scss" as *;`,javascriptEnabled: true}}}}
})

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

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

相关文章

数字化精益生产系统--MRP 需求管理系统

MRP&#xff08;Material Requirements Planning&#xff0c;物料需求计划&#xff09;需求管理系统是一种在制造业中广泛应用的计划工具&#xff0c;旨在通过分析和计划企业生产和库存需求&#xff0c;优化资源利用&#xff0c;提高生产效率。以下是对MRP需求管理系统的功能设…

Raylib 坐标系

draftx 符号调整为正数 发现采样坐标系原点0&#xff0c;0 在左上角&#xff0c;正方向 右&#xff0c;下 绘制坐标系 原点0&#xff0c;0 在左下角&#xff0c;正方向 右&#xff0c;上 拖拽可得 #include <raylib.h> // 重整原因&#xff1a;解决新函数放大缩小之下…

当需要对多个表进行联合更新操作时,怎样确保数据的一致性?

文章目录 一、问题分析二、解决方案三、示例代码&#xff08;以 MySQL 为例&#xff09;四、加锁机制示例五、测试和验证六、总结 在数据库管理中&#xff0c;经常会遇到需要对多个表进行联合更新的情况。这种操作带来了一定的复杂性&#xff0c;因为要确保在整个更新过程中数据…

为什么需要服务器?服务器可以做些什么

目录 一、服务器和电脑的区别二、什么是SSH三、什么是免密码登录四、服务器如何实现SSH免密码登录 一、服务器和电脑的区别 服务器和电脑是两种不同类型的计算机系统&#xff0c;它们在设计、功能和用途上存在明显的区别。首先&#xff0c;从硬件配置上看&#xff0c;服务器通…

vb.netcad二开自学笔记3:启动与销毁

Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.EditorInputImports Autodesk.AutoCAD.RuntimePublic Class WellcomCADImplements IExtensionApplicationPublic Sub Initialize() Implements IExtensionApplication.InitializeMsgBox("net程序已…

JDK都出到20多了,你还不会使用JDK8的Stream流写代码吗?

目录 前言 Stream流 是什么&#xff1f; 为什么要用Steam流 常见stream流使用案例 映射 map() & 集合 collect() 单字段映射 多字段映射 映射为其他的对象 映射为 Map 去重 distinct() 过滤 filter() Stream流的其他方法 使用Stream流的弊端 前言 当你某天看…

基于深度学习LightWeight的人体姿态检测跌倒系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

公务员考试、事业编考试、教师资格证、面试、K12资料、电子书

点击上方△腾阳 关注 作者 l 腾阳 转载请联系授权 你好&#xff0c;我是腾阳。 在这个自媒体的海洋里&#xff0c;我曾是一只迷失方向的小鸟&#xff0c;多次尝试飞翔却总是跌跌撞撞。 但每一次跌倒&#xff0c;都让我更坚定地相信&#xff0c;只要不放弃&#xff0c;总…

【Unity2D 2022:Particle System】添加命中粒子特效

一、创建粒子特效游戏物体 二、修改粒子系统属性 1. 基础属性 &#xff08;1&#xff09;修改发射粒子持续时间&#xff08;Duration&#xff09;为1s &#xff08;2&#xff09;取消勾选循环&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在时间&…

2024全网最全面及最新且最为详细的网络安全技巧五 之 SSRF 漏洞EXP技巧,典例分析以及 如何修复 (上册)———— 作者:LJS

五——SSRF漏洞 EXP技巧&#xff0c;典例分析以及 如何修复 目录 五——SSRF EXP技巧&#xff0c;典例分析以及 如何修复 5.1Apache mod_proxy SSRF&#xff08;CVE-2021-40438&#xff09;的一点分析和延伸 0x01 Apache Module综述 0x02 漏洞原理分析 Apache在配置反代的后端…

Java实现登录验证 -- JWT令牌实现

目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌&#xff08;token&#xff09;生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…

Debezium报错处理系列之第110篇: ERROR Error during binlog processing.Access denied

Debezium报错处理系列之第110篇:ERROR Error during binlog processing. Last offset stored = null, binlog reader near position = /4 Access denied; you need at least one of the REPLICATION SLAVE privilege for this operation 一、完整报错二、错误原因三、解决方法…

微服务: Nacos部署安装与properties配置

Nacos 是阿里巴巴开源的一款用于动态服务发现、配置管理和服务管理的基础设施。Nacos 这个名称源自于 “Dynamic Naming and Configuration Service”。它主要是用于解决微服务架构中服务发现和配置管理的问题。 Nacos 单机模式的部署安装 1. 安装(Windows环境) Nacos是Java…

从入门到深入,Docker新手学习教程

编译整理&#xff5c;TesterHome社区 作者&#xff5c;Ishaan Gupta 以下为作者观点&#xff1a; Docker 彻底改变了我们开发、交付和运行应用程序的方式。它使开发人员能够将应用程序打包到容器中 - 标准化的可执行组件&#xff0c;将应用程序源代码与在任何环境中运行该代码…

InspireFace-商用级的跨平台开源人脸分析SDK

InspireFace-商用级的跨平台开源人脸分析SDK InspireFaceSDK是由insightface开发的⼀款⼈脸识别软件开发⼯具包&#xff08;SDK&#xff09;。它提供了⼀系列功能&#xff0c;可以满⾜各种应⽤场景下的⼈脸识别需求&#xff0c;包括但不限于闸机、⼈脸⻔禁、⼈脸验证等。 该S…

ubuntu22 sshd设置

专栏总目录 一、安装sshd服务 sudo apt updatesudo apt install -y openssh-server 二、配置sshd 使用文本编辑器打开/etc/ssh/sshd_config sudo vi /etc/ssh/sshd_config &#xff08;一&#xff09;配置sshd服务的侦听端口 建议将ssh的侦听端口改为7000以上的端口&#…

【bazel】快速下载教程

bazel下载链接&#xff1a; https://github.com/bazelbuild/bazel/releases?page11 直接在github上下载&#xff0c;会因为网络不稳定&#xff0c;而频繁下载错误 这里提供一个超级快速的方法&#xff01;&#xff01;&#xff01; 用迅雷下载&#xff01; 1.从github上复…

【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、欧拉筛、打表)Golang实现

原题链接 题目描述 给你一个整数数组 nums。 返回两个&#xff08;不一定不同的&#xff09;质数在 nums 中 下标 的 最大距离。 示例 1&#xff1a; 输入&#xff1a; nums [4,2,9,5,3] 输出&#xff1a; 3 解释&#xff1a; nums[1]、nums[3] 和 nums[4] 是质数。因此答…

算法系列--分治排序|再谈快速排序|快速排序的优化|快速选择算法

前言:本文就前期学习快速排序算法的一些疑惑点进行详细解答,并且给出基础快速排序算法的优化版本 一.再谈快速排序 快速排序算法的核心是分治思想,分治策略分为以下三步: 分解:将原问题分解为若干相似,规模较小的子问题解决:如果子问题规模较小,直接解决;否则递归解决子问题合…

策略模式的应用

前言 系统有一个需求就是采购员审批注册供应商的信息时&#xff0c;会生成一个供应商的账号&#xff0c;此时需要发送供应商的账号信息&#xff08;账号、密码&#xff09;到注册填写的邮箱中&#xff0c;通知供应商账号信息&#xff0c;当时很快就写好了一个工具类&#xff0…