IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> create-react-app 使用代理做 mock -> 正文阅读

[JavaScript知识库]create-react-app 使用代理做 mock

在这里插入图片描述

1. 背景

很多情况下,为了测试需要一些接口的 mock 场景,基于 create-react-app 生产的项目 好处在于它内置了这块代理的能力,给用户提供了很大的方便。

2. 代理方式

create-react-app 默认提供了两种方式,关联到 webpack-dev-server 中:

  • 简单方式:在 package.json 中添加 proxy 字段,指定你的 mock server 地址就可以。
  • 高级方式:在 src 下创建 setupProxy.js 文件,使用 http-proxy-middleware 来实现。

这两种方式都不用执行 npm run eject 就可以使用。

2.1 简单方式

如我的 mock server 是 http://localhost:4000,则在 package.json 中配置:

{
	...
	"proxy": "http://localhost:4000"
	...
}

代理流程在 react-script 中内置写好了,流程如下:

Yes
No
Yes
No
Yes
No
Yes
No
请求开始
Get请求?
请求 Public 目录文件?
代理请求
不走代理
sockjs-node 请求?
text/html 类型请求?

只拦截当前域名下的请求。

2.2 高级方式

react-script 在 react-scripts/config/webpackDevServer.config.js 中通过如下判断,将 setupProxy.js 作为中间件放在 dev server 中:

if (fs.existsSync(paths.proxySetup)) {
  require(paths.proxySetup)(app);
}

src 下创建setupProxy.js 文件,基本结构如下:

const proxy = require("http-proxy-middleware");

module.exports = function (app) {
  app.use(
    "/api", // 代理 /api 的请求
    proxy({
      target: "http://localhost:4000",
      logLevel: "debug",
      changeOrigin: true,
    })
  );
};

上例会拦截所有 /api 的请求。此模式可以拦截一切请求,详情参考:文档

无需安装 http-proxy-middleware,已经内置在 react-script 中。
注意 http-proxy-middleware 的版本,上例中的版本是 0.x,新版本改动很大。
不要和 2.1 中的简单方式混用。

3. Mock Server

简单使用的话,直接用 http 创建一个就行。

3.1 创建 Server

可以创建一个 mock.js 文件用来做这个 Server:

const http = require("http");
const PORT = 4000;

http
  .createServer(function ({ method, url }, res) {
    const search = new URL(url, `http://localhost:${PORT}`).searchParams;

    if (method == "POST") {
      // ……
    }

    if (method == "GET") {
      // 模拟延迟
      if (search.get("t")) {
        return setTimeout(() => res.end(), search.get("t"));
      }

      return res.end(
        JSON.stringify({
          success: true,
          content: "from mock",
        })
      );
    }
  })
  .listen(PORT);

3.2 同时启动 Server

package.json 中的 scripts 加一个并行执行就可以了:

  "scripts": {
    "start": "react-scripts start",
    "start:with:mock": "node mock.js & npm run start"
  },

启动:

npm run start:with:mock

? Github 文章地址

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:53:24  更:2022-03-06 12:55:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:42:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码