React Proxy 详细流程与配置方式(webpack、setupProxy.js、package.json)

news2024/9/23 9:23:53

一、 package.json 配置方式

  • 全部以 GET 请求为例,每次修改配置后,重启项目,否则不生效

    访问 http://127.0.0.1:6000/api/user/list 接口为例
    
  • 检查自己脚手架版本

    $ create-react-app -V
    
  • 若脚手架版本在 2.0 以下,可以使用对象类型配置代理,在项目的 package.json 文件中配置如下:

    "proxy": {
      "/api": {
        "target": "http://127.0.0.1:6000/api", # 跨域地址
        "changeOrigin": true,              # 是否允许跨域
        "pathRewrite": {                   # 重写路径
          "^/api": ""
        }
      }
    }
    

    举例: 配置好后,按代理标识访问

    useEffect(() => { 
      $get('/api/user/list').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }, [])
    
  • 若脚手架版本在 2.0 以上,只能配置 string 类型

    "proxy": "http://127.0.0.1:6000"
    

    举例: 配置好之后可以直接访问

    // 方式一:不带域名,直接接口地址即可
    useEffect(() => {
      $get('/api/user/config_name').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }, [])
    
    // 方式二:带上域名也没问题,但是这种写法发布到线上就会有问题,需要判断环境切换域名
    useEffect(() => {
      $get('http://127.0.0.1:6000/api/user/list').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }, [])
    

二、 setupProxy.js 配置方式 (推荐方案)

  • 配置一个或多个代理,最好的方式是使用 middleware 中间件进行配置。

  • 检查 package.json 中是否安装了 http-proxy-middleware,如果没有手动安装下:

    # yarn
    $ yarn add http-proxy-middleware
    
    # npm
    $ npm i http-proxy-middleware
    
  • src 中,新建 setupProxy.js(文件名固定,不可自定义,react 脚手架会识别),在文件中写以下配置内容(新项目都是推荐使用高版本,不然可能会无法启动项目)。

    文件路径: /src/setupProxy.js
    
  • http-proxy-middleware1.0 以后):

    const proxy = require('http-proxy-middleware')
    
    module.exports = function (app)  {
      app.use(
        // 代理 1
        proxy.createProxyMiddleware('/api', {             // 匹配到 '/api' 前缀的请求,就会触发该代理配置
          target: 'http://127.0.0.1:6000/api',  // 请求转发地址
          changeOrigin: true,                             // 是否跨域
          /*
            changeOrigin 为 true 时,服务器收到的请求头中的host为:127.0.0.1:6000,也就是代理地址的 host
            changeOrigin 为 false 时,服务器收到的请求头中的host为:localhost:3000,也就是本地站点地址的 host
            changeOrigin 默认 false,但一般需要将 changeOrigin 值设为 true,根据自己需求调整
          */
          pathRewrite: {
            '^/api': ''                                   // 重写请求路径
          }
        }),
        // 代理 2,为什么 2 写前面,因为匹配规则,上面第一个已经是 /api 了,要不然会优先匹配到第一个代理上
        proxy.createProxyMiddleware('/2api', {
          target: 'http://127.0.0.1:6000/api',
          changeOrigin: true,
          pathRewrite: {
            '^/2api': ''
          }
        }),
        // 代理 3,这种写法是最规范的,前后都加 /
        proxy.createProxyMiddleware('/3api/', {
          target: 'http://127.0.0.1:6000/api/',
          changeOrigin: true,
          pathRewrite: {
            '^/3api/': ''
          }
        }),
        // 代理 4,这种代理标识尾部加 / ,代理地址尾部没有
        proxy.createProxyMiddleware('/4api/', {
          target: 'http://127.0.0.1:6000/api',
          changeOrigin: true,
          pathRewrite: {
            // '^/4api/': ''  // 这种替换成空,也没问题,但是不严谨
            '^/4api/': '/'    // 这样写更规范
          }
        })
        // ..... 多个代理
      )
    }
    
  • http-proxy-middleware1.0 以前,老版本):

    const proxy = require('http-proxy-middleware')
    
    module.exports = function (app)  {
      app.use(
        // 代理 1
        proxy('/api', {
          target: 'http://127.0.0.1:6000/api',
          changeOrigin: true,
          pathRewrite: {
            '^/api': ''
          }
        }),
        // 代理 2
        proxy('/2api', {
          target: 'http://127.0.0.1:6000/api',
          changeOrigin: true,
          pathRewrite: {
            '^/2api': ''
          }
        })
      )
    }
    

三、 webpack 配置方式

  • 如果是新建项目,可以了解下 $ npm run eject 命令的作用,文章底部。

  • 执行解包命令,如果已经解包,忽略。

    $ npm run eject
    
  • 找到 webpack 代理相关配置,在 /config/webpackDevServer.config.js 文件中搜索 proxy

    image.png

  • proxy 修改为

    proxy: {
      '/api': {
        target: 'http://127.0.0.1:6000/api',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
      // 更多代理配置
    },
    

    image.png

四、 自定义 webpack 配置文件方式

  • 这种就不写了,写个 demo 麻烦,比如用最新版本的 webpack 搭建一个 React 项目,脚手架可能还不支持,或者手痒想全部走自定义的 webpack 配置,这个时候就需要单独 webpack 各个环境的配置文件,然后修改 package.json 中的执行命令,走自定义的 webpack 配置文件。

    image.png

土、上面几种代理配置方式,配置后的使用案例代码

  • 案例代码

    useEffect(() => {
      // '/api'
      $get('/api/user/config_name').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
      // '/2api'
      $get('/2api/user/config_name').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
      // '/3api/'
      $get('/3api/user/config_name').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
      // '/4api/'
      $get('/4api/user/config_name').then(res => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }, [])
    

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

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

相关文章

【C++】deque的实现原理简单介绍

前言 deque被称为双端队列,它的出现主要是为了结合vector和list的优点并减小它们的缺点,实际上deque确实结合了vector和list的优点减小了它们的缺点,但是它的结合也让它自己的优点没有原始的vector和list那么极致,导致deque变得很…

C++好难(1):C++的入门

目录 前言: C的历史: c的领域 1.C的关键字: 2.命名空间 2.1命名空间的定义: 1)命名空间的普通定义: 2)命名空间的嵌套定义: 3)命名空间相同的处理: …

没有公网IP,自建网站如何让外网访问?

受创业潮影响,身边很多朋友都自己开公司创业了,作为一个IT行业从业者,我就莫名的开始忙起来了,因为掌握编程技术,朋友们经常找到我,让我帮他们做公司网站。但是存在一个无法回避的问题,就是我的…

0/1背包问题——从LeetCode题海中总结常见套路

目录 问题讨论 01背包问题公式 为什么状态压缩到一维时候需要逆序? 怎样求次数? 转化成最大和sum/2的01背包:LeetCode.416.分割等和子集 转化成最大和sum/2的01背包:LeetCode1049.最后一块石头的重量II LeetCode.494.目标和…

微软文字转语音不能试用了,分享三个方法给大家!

最近很多小伙伴告诉我,微软文字转语音不能在线试用了,这是因为微软关闭了官方的使用页面,所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢? 答案是肯定的&#xf…

初识NoSQL(一文读懂)

最近参加了Oracle的数据库培训,对NoSQL非常好奇,总结一下关于NoSQL的认识。 NoSQL是Not Only SQL,并不是去除掉SQL,泛指非关系型的数据库。关系,指关系模型,具体指同一个对象在不同属性上的值 以及 不同对…

一个AK/SK泄露检测的实现思路

01、简介 在企业上云的过程中,AK/SK泄露导致的数据泄露事件屡见不鲜。在企业混合云架构下,公有云和私有云都存在大量的AccessKey,如何有效地检测可能的AK/SK泄露事件,一直困扰着企业的安全人员。 本文提供了一种比较容易实现的思路…

UART协议学习——异步全双工串行通信方式

文章目录 前言一、简介1、优点2、缺点 二、数据格式三、波特率1、定义2、波特率和采样频率 四、常见接口电平1、TTL电平2、RS232(负逻辑)3、RS485 前言 2023.4.22 世界地球日 一、简介 UART:Universal Asynchronous Receiver/Transmitter&a…

Albert-Z-Guo/Deep-Reinforcement-Stock-Trading

深加固股票交易 该项目打算在投资组合管理中利用深度强化学习。框架结构的灵感来自Q-Trader。代理人的奖励是在每个行动步骤评估的未实现净利润(意味着股票仍在投资组合中且尚未兑现)。对于每一步的不作为,投资组合中都会增加负惩罚&#xf…

USMART 函数错误解决方法

身为电子工程师,看了马斯克的星舰飞船,真是太帅了; 深知一个良好的测试环境对产品性能的影响,对工作效率的提升。 小资源MCU调试代码的工具USMART 使用起来。 移植的文章网上有很多,但是对移植过程中使用错误的文章…

mybatisPlus拦截器使用demo

概述 顾名思义,就是一个拦截器,和springmvc的拦截器,servlet的过滤器差不多,就是在执行前拦了一道,里面可以做一些自己的事情。 平时用的mybatisPlus较多,直接以com.baomidou.mybatisplus.extension.plug…

VUE中使用element-china-area-data

使用element-china-area-data的中国省市区级联数据编写城市选择器。以下为解决效果图: (1)安装 npm install element-china-area-data -S (2)引入 import { regionData, CodeToText, TextToCode } from ‘element-ch…

LDO系列--LDO并联扩容

1、不能简单并联(无法电流均衡) 两个LDO的内部的带隙基准源(参考电压),FET的特性,以及误差放大器的噪声不同(如失调电压),实际LDO输出的目标电压依旧是有差异的。 这就导致了,LDO-High的目标输出电压高一些…

STM32F103基于标准库+I2C SSD1306仿数码管RTC时钟显示

STM32F103基于标准库I2C SSD1306仿数码管RTC时钟显示 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。 🍁对于文中所提供的相关资源链接将作不定期更换。 📺显示效果&a…

UWB芯片DW300之CRC模式介绍及代码实现

SPI CRC模式 当启用SPI CRC模式时,可以为SPI传输提供循环冗余校验序列的额外保护。这种操作模式在默认情况下是禁用的,但可以通过SYS_CFG寄存器中的SPI_CRCEN位启用(和禁用)。 虽然SPI CRC检查在主机微处理器必须为每个SPI写入和读取事务计算CRC的附加软件开销方面有缺点,但…

SOFA Weekly|SOFARPC 5.10.0 版本发布、SOFA 五周年回顾、Layotto 社区会议回顾与预告...

SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 3. MyCat3.1 概述 1. 介绍 采用单数据库进行数据存储存在以下瓶颈: IO瓶颈:热点数据太多&#x…

项目管理必备!20个实用技巧全掌握!

即使在最完美的条件下,管理一个项目也是很困难的。 ​项目管理的成败好坏与优秀项目团队密不可分的,建设一个好的团队将会更团结、更坚强、更具有竞争力, 更能适应无限变化的环境。 ​不幸的是,还是有很多项目经理实质上没有没有总结出自己思维方法和运…

进程状态

理念上的状态 新建 子面意思运行 task_struct在运行队列中排队,就叫做运行态阻塞 等待非CPU资源就绪挂起 当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,进程的状态就叫做挂起退出 子面意思 实际上的状态 …

ARM Coresight 及 DS-5 介绍 5 - DS-5 断点设置及常用Debug 命令

文章目录 1.1 DS-5 Debug 方法梳理1.2.1 DS-5 设置断点 Debug1.2.2 DS-5 常用 Debug 命令 1.1 DS-5 Debug 方法梳理 通常在调试过程中需要打断点来进行单步调试,这个时候可以按照下面步骤来进行: 在使用 DS-5 Debug 之前需要先 load 所编译的 elf 文件&…