首页 > 其他分享 >一文理清环境变量的使用与代理的管理

一文理清环境变量的使用与代理的管理

时间:2024-09-26 10:25:38浏览次数:8  
标签:http 一文 接口 api 理清 env com 环境变量 跨域

早在2020年就想写一篇类似的总结,但一直想的到没做到

这两天又遇到了此类问题,索性直接来一篇

项目里有envenv.devlopment env.prodction等等文件,此类.env开头的文件统称为开发环境配置文件,目的是什么?目的是为了基于启动时所选择的环境来配置不同的地址或者数据(是的就是你心中所想的在package.json中配置的script项)

.env优先级小于所有env.xxx文件,也就是说在找不到所有类似文件的情况下.env会被最终解析

在vite项目中,可以控制台输出 import.meta.env来获知当前所处的环境,webpack中其实也差不多,输出的语句不同罢了。
如何区分开发或者生产
项目执行运行本地服务器localhost是在本地 npm run xxx
项目执行构建命令是在线上npm build xxx

env与proxy的关系:

举个例子

项目中,有时候要连接几个不常用的接口
假设我需要在项目中访问一个与后端不同的的接口,本质上是将跨域接口伪装成了本地接口以规避浏览器跨域问题, 它的地址可能是这样:http://www.wzdxcsk2.com/xxxx/yy
如何在项目中访问这个接口?它作为一个额外的接口,并不与后端接口一致

项目分为线上版与开发版本(万变不离其宗)两种。
为了保证我们可以在开发环境可以正确调用api,
脚手架通常会提供一个proxy对象,用以暂时屏蔽浏览器端的跨域问题
一个最简单的proxy:

  '/api': {
        target: 'http://jsonplaceholder.typicode.com',
        changeOrigin: true,
        rewrite: (path: string) => path.replace(new RegExp(`^/api`), ''),
      }

它的意思是说,如果遇到一个/api作为前缀的api接口,就将其转换为target指定的地址,
如:发出的请求应该是"http://jsonplaceholder.typicode.com/sayhi ",而在定义接口的时候应该用"/api/sayhi",这样脚手架在捕获到这个接口时,就会将其转换成"localhost:port/api/sayhi",但只是伪装,本质上也只是为了欺骗浏览器的跨域机制用于开发

线上环境若需要访问不属于后端的接口,则需要接口提供方提供跨域支持,因为前端在线上其实也仅仅是一个个静态资源,这时候就得需要接口服务端在他们的代码中允许访问跨域请求

BOOM

有了这么多前置知识,接下来就可以理清环境变量与env在日常环境中的配合使用了

假设有这样一个外来接口http://jsonplaceholder.typicode.com/define/problem需要调用,

在此可以提供一个基础范式:不保证完全优雅,但保证可用

前面说过了env开发与线上的区别,对此,我们可以分别在env的不同环境配置相同的数据:

 # env开发环境下:
 # env.development 
VITE_API_URL_PREFIX_YY=/WZDXCSK

 # env生产环境下:
 # env.produect
VITE_API_URL_PREFIX_YY=http://jsonplaceholder.typicode.com

而我们在定义接口时,则需要使用import.meta.env.VITE_API_URL_PREFIX_YY来确定此刻的接口究竟是什么,如果以上述配置来看,假设fetch接口为http://jsonplaceholder.typicode.com/define/problem
则开发时import.meta.env.VITE_API_URL_PREFIX_YY + '/define/problem'url为:/WZDXCSK/define/problem
则生产时import.meta.env.VITE_API_URL_PREFIX_YY + '/define/problem'url为:http://jsonplaceholder.typicode.com/define/problem

是的也许会很疑惑:开发时的接口全路径为/WZDXCSK/define/problem,这并不是一个完整的合法的api,是的,但是由于是在开发环境,而我们则可以使用脚手架下的proxy来规避这个问题:

//脚手架的配置文件 config.js
proxy:{
//以上述为例,开发环境下import.meta.env.VITE_API_URL_PREFIX_YY被统一替换成了/WZDXCSK,那么我们直接对其代理转换即可
'/WZDXCSK':{
    target:'http://jsonplaceholder.typicode.com'  //将指定的前缀替换成真正的api接口
    rewrite: (path: string) => path.replace(new RegExp(`^/WZDXCSK`), ''), // 将匹配完毕后将原本的替换成空,因为'/WZDXCSK'是我们臆想出来的
    changeOrigin: true,// 是否跨域
}
}

值得一提的是,proxy只允许开发环境下使用,这是为了方便开发者,而在生产环境下则需要后端开发者配置允许跨域,
换句话说,开发环境下的跨域FE可以自己解决,线上环境下的跨域则需要BE处理:

has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

标签:http,一文,接口,api,理清,env,com,环境变量,跨域
From: https://www.cnblogs.com/hjk1124/p/18432940

相关文章

  • JDK的下载和环境变量的配置
    JDK(JavaDevelopmentKit)是Java开发工具包,是开发和编译Java应用程序所需的软件包。JDK由Java编译器、Java运行时环境(JRE)和Java开发工具组成。JDK提供了开发Java应用程序所需的工具和资源,包括Java编译器(javac)、Java虚拟机(JVM)、调试器(jdb)、应用程序打包工具(jar)等。它还包含了Jav......
  • 红帽认证会过期吗?一文给你解释清楚!
    红帽认证以其权威性、实用性和高含金量受到了广大IT人士的青睐,尤其是Linux领域。然而,许多人在考取红帽认证后,心中都有一个疑问:红帽认证会过期吗?本文将为大家详细解答这个问题。红帽认证是什么?红帽认证是由红帽公司(RedHat)推出的针对Linux系统的专业认证。主要包括红帽认证系统......
  • 一文搞懂XPath查找html dom
     博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。技术范围: 目前专注java体系,以及golang、.Net、软件架构、DDD、微服务、redis、nginx、tomcat、mysql、oracle等业务范围: 从数字医......
  • 一文了解Sublime Text基本 使用教程
    SublimeText是一个非常受欢迎的跨平台源代码编辑器,以其高性能、轻量级和高度可定制性而闻名。下面是一些基本的使用技巧和配置方法,帮助你更高效地使用SublimeText:安装与基本设置安装:访问官方网站下载对应操作系统的版本。按照安装向导提示进行安装。基本设置:调整......
  • 一文夯实并发编程的理论基础
    JMM内存模型定义java内存模型(即javaMemoryModel,简称JMM),不存在的东西,是一个概念,约定主要分成两部分来看,一部分叫做主内存,另一部分叫做工作内存。java当中的共享变量;都放在主内存当中,如类的成员变量(实例变量),还有静态的成员变量(类变量),都是存储在主内存中的。每一个线程都可以......
  • 一文夯实并发编程的理论基础
    JMM内存模型定义java内存模型(即javaMemoryModel,简称JMM),不存在的东西,是一个概念,约定主要分成两部分来看,一部分叫做主内存,另一部分叫做工作内存。java当中的共享变量;都放在主内存当中,如类的成员变量(实例变量),还有静态的成员变量(类变量),都是存储在主内存中的。每一个线程都可......
  • 什么是CPQ?一文讲解什么是CPQ选型配置报价系统
    什么是CPQ选型配置报价?CPQ,是英文名ConfigurePriceQuote的缩写,中文称为配置报价软件。该软件经常出现在销售行业。它是一种可以快速为企业报价的销售工具。企业在报价时,会综合考虑数量、折扣、产品可选功能等。CPQ软件能够整合企业的产品信息和定价策略,使得销售团队能够......
  • 20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理
    ContainerLess理念微服务把应用和它所依赖的组件包、配置文件及附带的运行脚本打包成一个单一、独立、可执行的jar包文件。在实现Web服务器时,几乎不需要任何配置就可以启动Tomcat。你只需要使用java-jar命令就可以让Tomcat成为SpringBoot的一个自包含的可运行组件和单元。同时,这......
  • windows配置环境变量
    环境变量(environmentvariables)是在操作系统中用来指定操作系统运行环境的一些参数。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。Windows和DOS操作系统中的 path 环境变量,当要求系统运行一个程序而没有告诉它程序所......
  • 一文 学透 力扣—N数之和
    题目一:1.两数之和❤题目思路当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是是否出现在这个集合。那么我们就应该想到......