前端 mock 数据的几种方式

这篇具有很好参考价值的文章主要介绍了前端 mock 数据的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

接口demo

Better-mock

just mock

koa

webpack

Charles

总结


        具体需求开发前,后端往往只提供接口文档,对于前端,最简单的方式就是把想要的数据写死在代码里进行开发,但这样的坏处就是和后端联调前还需要再把写死的数据从代码里删除,最好的方式是无侵入的 mock 。下边介绍几种常用的方式,大家可以结合自己的项目来选取。

        大致分为三类,重写 xhr/fetchnode.js 服务中转、系统层面拦截。

接口demo

        为了后边方便的安装 node 包,可以用 webpack 进行打包,具体配置可以参考 2021年从零开发前端项目指南,看到 React 配置的前一步就够了,只需要配置一个 html 和一个接口请求。 需要注意下 webpack 的版本,不同版本后续的配置会不同,这里我用的是 5.75.0 。

最终目标是通过 mock 让下边还没有开发好的接口正常返回数据:

fetch("/api/data", {
  body: JSON.stringify({ id: 10 }),
  method: "POST",
})
  .then((response) => response.json())
  .then((json) => console.log(json));

现在肯定是 404 。

前端 mock 数据的几种方式,前端,前端,mock

Better-mock

        better-mock fork 自 Mock.js,使用方法和 Mock.js 一致,用于 javascript mock 数据生成,它可以拦截 XHR 和 fetch 请求,并返回自定义的数据类型。

        https://github.com/lavyun/better-mock

只需要在调用接口前,引入 better-mock 。

import Mock from "better-mock";

// mock list 返回数组,大小是 1 到 10,对象中的 id 自动加 1
Mock.mock("/api/data", {
  "list|1-10": [
    {
      "id|+1": 1,
    },
  ],
});

fetch("/api/data", {
  body: JSON.stringify({ id: 10 }),
  method: "POST",
})
  .then((response) => response.json())
  .then((json) => console.log(json));

控制台此时就会输出数据了。

前端 mock 数据的几种方式,前端,前端,mock

    better-mock 一个好处就是可以通过它既有的语法来生成一些随机的数据,每次请求都会返回不同的数据。

        坏处是会在请求发送前就拦截,导致在 Chrome 控制台就看不见请求了。

前端 mock 数据的几种方式,前端,前端,mock

just mock

        just mock 是一个浏览器插件,在代码中什么都不需要更改,只需要添加相应的接口和数据即可实现拦截。

        https://just-mock.vercel.app/

插件安装好后添加相应的域名就可以拦截到相应的请求。

前端 mock 数据的几种方式,前端,前端,mock

接着进行相应的编辑添加对应的 mock 数据就好。

前端 mock 数据的几种方式,前端,前端,mock

这样接口就会被拦截,控制台输出预设的数据:

前端 mock 数据的几种方式,前端,前端,mock

        浏览器插件原理和 Better-mock 是一样的,但会更加轻便,无需融入到代码中。两者的原理是一样的,都是在网络请求前重写了全局的 xhr 和 fetch ,具体可以参考 油猴脚本重写fetch和xhr请求。

koa

本地通过 koa 开启一个接口服务。

// serve.js
const Koa = require("koa");
const router = require("koa-router")();
const app = new Koa();

router.post("/api/data", async (ctx, next) => {
  ctx.response.body = {
    status: true,
    data: [1, 2, 3],
    msg: "获取数据成功",
  };
});
// add router middleware:
app.use(router.routes());

app.listen(3000);

        本地开启运行:node server.js,接口提供的地址是 localhost:3000,但是请求的地址是 loacalhost:8080 ,当然可以直接修改代码里的地址为 localhost:3000 ,但还可以通过 webpack  的配置,将请求转发到 localhost:3000 。

const path = require("path");
module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "./dist"),
    filename: "bundle.js",
  },
  devServer: {
    static: path.resolve(__dirname, "./dist"),
    proxy: {
      // 将 /api 开头的 http 请求,都代理到 localhost:3000 上,由 koa 提供 mock 数据
      "/api": {
        target: "http://localhost:3000",
        secure: false,
      },
    },
  },
};

这样就可以看到控制台输出了:

前端 mock 数据的几种方式,前端,前端,mock

此外,Chrome 的 Network 也可以正常看到这个请求:

前端 mock 数据的几种方式,前端,前端,mock

这种方法也可以用来解决跨域问题,举个例子:

如果本地想访问一个具体域名的接口,比如请求知乎的热榜接口:

fetch(
  "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true",
  {
    headers: {
      accept: "*/*",
      "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
      "sec-ch-ua":
        '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"',
      "sec-ch-ua-mobile": "?0",
      "sec-ch-ua-platform": '"macOS"',
      "sec-fetch-dest": "empty",
      "sec-fetch-mode": "cors",
      "sec-fetch-site": "same-origin",
      "x-ab-param": "",
      "x-ab-pb":
        "CpoBCAAbAD8ARwC0AGkBagF0ATsCzALXAtgCoAOhA6IDtwOmBNYEEQVRBYsFjAWeBTAGMQbrBicHdAh2CHkI2gg/CWAJwwnECcUJxgnHCcgJyQnKCcsJzAnRCfQJBApJCmUKawqYCqUKqQq+CsQK1ArdCu0K/go7CzwLQwtGC3ELhwuNC9cL4AvlC+YLLAw4DHEMjwysDMMMyQz4DBJNAQAAAAAAAAAAAAAAAAAAAAAEAAEAAAEAAAEAAAIGAAABAAAAAAAAAAAAAAADAAAAAAEAAAABAQAAAAEAAQAAAAUCAQAABgIEAAACAAA=",
      "x-api-version": "3.0.76",
      "x-requested-with": "fetch",
      "x-zse-93": "101_3_3.0",
      "x-zse-96":
        "2.0_LYJSVCX+9b1YXp/sG1Azyi5tC5RpabLbkXb3w5s6rv=Gxy9uMXqMXm4LjYWRdoIz",
      "x-zst-81":
        "3_2.0aR_sn77yn6O92wOB8hPZnQr0EMYxc4f18wNBUgpTQ6nxERFZfRY0-4Lm-h3_tufIwJS8gcxTgJS_AuPZNcXCTwxI78YxEM20s4PGDwN8gGcYAupMWufIoLVqr4gxrRPOI0cY7HL8qun9g93mFukyigcmebS_FwOYPRP0E4rZUrN9DDom3hnynAUMnAVPF_PhaueTF4C8IhwVIDO_8ioC0JXfW9CKpCwCs4OBQAc0uBefagCKGMo1yroBh9CKe_STVHC1IqLKHJL_chSflqHCOqgYPhYKVwH8M4Lqqq9y1wH967NC7vH80UC8wCHswgHBDgY_ovg9r0wBcJO8s9OCzcLMNgLfkgNByqCLhhUf_veOQRY_dvxmCg_zugS8iBtBFgOZkwNLDw2skTX18XSYuJLqpCYBo_pMWbS8Pv3YtGFBaqL9AwCYhbL9eGVV2rNClDL1wJLmxCgKagNBUwSqYrHBbGp8e8HGggSMQ7xC3rOs",
    },
    referrer: "https://www.zhihu.com/hot",
    referrerPolicy: "no-referrer-when-downgrade",
    body: null,
    method: "GET",
    mode: "cors",
    credentials: "include",
  }
);

由于本地域名是 http://localhost:8080/ ,此时浏览器就会报跨域的错了。

前端 mock 数据的几种方式,前端,前端,mock

        此时后端可以通过 CORS 策略解决跨域的问题,但因为是测试环境,后端可能会说你自己解决吧,此时就可以通过 Koa 进行中转。

改写一下 Koa 的代码,先请求后端的接口,接着将收到的数据拿到后返回。

import Koa from "koa";
import fetch from "node-fetch";
import Router from "koa-router";

const app = new Koa();
const router = new Router();
router.post("/api/data", async (ctx, next) => {
  const res = await fetch(
    "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true",
    {
      headers: {
        accept: "*/*",
        "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
        "sec-ch-ua":
          '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"macOS"',
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "x-ab-param": "",
        "x-ab-pb":
          "CpoBCAAbAD8ARwC0AGkBagF0ATsCzALXAtgCoAOhA6IDtwOmBNYEEQVRBYsFjAWeBTAGMQbrBicHdAh2CHkI2gg/CWAJwwnECcUJxgnHCcgJyQnKCcsJzAnRCfQJBApJCmUKawqYCqUKqQq+CsQK1ArdCu0K/go7CzwLQwtGC3ELhwuNC9cL4AvlC+YLLAw4DHEMjwysDMMMyQz4DBJNAQAAAAAAAAAAAAAAAAAAAAAEAAEAAAEAAAEAAAIGAAABAAAAAAAAAAAAAAADAAAAAAEAAAABAQAAAAEAAQAAAAUCAQAABgIEAAACAAA=",
        "x-api-version": "3.0.76",
        "x-requested-with": "fetch",
        "x-zse-93": "101_3_3.0",
        "x-zse-96":
          "2.0_LYJSVCX+9b1YXp/sG1Azyi5tC5RpabLbkXb3w5s6rv=Gxy9uMXqMXm4LjYWRdoIz",
        "x-zst-81":
          "3_2.0aR_sn77yn6O92wOB8hPZnQr0EMYxc4f18wNBUgpTQ6nxERFZfRY0-4Lm-h3_tufIwJS8gcxTgJS_AuPZNcXCTwxI78YxEM20s4PGDwN8gGcYAupMWufIoLVqr4gxrRPOI0cY7HL8qun9g93mFukyigcmebS_FwOYPRP0E4rZUrN9DDom3hnynAUMnAVPF_PhaueTF4C8IhwVIDO_8ioC0JXfW9CKpCwCs4OBQAc0uBefagCKGMo1yroBh9CKe_STVHC1IqLKHJL_chSflqHCOqgYPhYKVwH8M4Lqqq9y1wH967NC7vH80UC8wCHswgHBDgY_ovg9r0wBcJO8s9OCzcLMNgLfkgNByqCLhhUf_veOQRY_dvxmCg_zugS8iBtBFgOZkwNLDw2skTX18XSYuJLqpCYBo_pMWbS8Pv3YtGFBaqL9AwCYhbL9eGVV2rNClDL1wJLmxCgKagNBUwSqYrHBbGp8e8HGggSMQ7xC3rOs",
      },
      referrer: "https://www.zhihu.com/hot",
      referrerPolicy: "no-referrer-when-downgrade",
      body: null,
      method: "GET",
      mode: "cors",
      credentials: "include",
    }
  );
  const data = await res.json();
  ctx.response.body = {
    status: true,
    data,
    msg: "获取数据成功",
  };
});
app.use(router.routes());

app.listen(3000);

此时还是请求 /api/data 。

fetch("/api/data", {
  body: JSON.stringify({ id: 10 }),
  method: "POST",
})
  .then((response) => response.json())
  .then((json) => console.log(json));

依旧让 Webpack 将数据转发到 Koa 。

devServer: {
    static: path.resolve(__dirname, "./dist"),
    proxy: {
      // 将 `/api` 开头的 http 请求,都代理到 `localhost:3000` 上,由 koa 提供 mock 数据
      "/api": {
        target: "http://localhost:3000",
        secure: false,
      },
    },
  },

现在控制台输出的就是知乎返回的数据了,跨域问题也消失了:

前端 mock 数据的几种方式,前端,前端,mock

当然上边解决跨域只是一个思路,具体的封装还需要结合项目来进行。

webpack

        上边可以通过 webpack 进行转发数据,是因为 webpack 也启动了一个 HTTP 服务器,只不过用的不是 Koa ,是更早的一个框架 Express ,而且它们是同一个团队开发的。

        既然已经有了一个 HTTP 服务器,所以也没必要再开启另一个 Koa 的了,通过给 webpack 传递一个函数,重写 Koa 返回的数据即可。

只需要通过 setupMiddlewares 重写数据即可。

const path = require("path");
module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "./dist"),
    filename: "bundle.js",
  },
  devServer: {
    static: path.resolve(__dirname, "./dist"),
    setupMiddlewares: (middlewares, devServer) => {
      if (!devServer) {
        throw new Error("webpack-dev-server is not defined");
      }

      middlewares.unshift({
        path: "/api/data",
        middleware: (req, res) => {
          // mock 数据模拟接口数据
          res.send({ list: [1, 2, 3], msg: "webpack mock" });
        },
      });

      return middlewares;
    },
  },
};

此时控制台也可以看到输出的内容:

前端 mock 数据的几种方式,前端,前端,mock

同时 Network 也是可以看到网络请求的。

前端 mock 数据的几种方式,前端,前端,mock

Charles

        终极必杀 mock 方法,因为它除了可以拦截浏览器中的请求,也可以拦截任意 App 的数据,甚至还可以拦截手机中的 HTTPS 请求,前段时间很火的羊了个羊就可以通过 Charles 抓取请求然后迅速通关。

        需要注意的是 Charles 抓不到 localhost 的请求,访问的时候需要将 localhost 改为 localhost.charlesproxy.com

前端 mock 数据的几种方式,前端,前端,mock

webpack 需要加一个 allowedHosts 的配置,不然会返回 Invalid Host header 。

devServer: {
    static: path.resolve(__dirname, "./dist"),
    allowedHosts: "all",
},

全部配置好后就可以看到 Charles 抓到的请求了。

前端 mock 数据的几种方式,前端,前端,mock

此时只需要提前写好一个 json 文件,然后将右键选择 Map Local 对应的文件即可。

前端 mock 数据的几种方式,前端,前端,mock

{
  "data": [1, 2, 3],
  "msg": "from charles"
}

接下来就可以在控制台看到 mock 成功了。

前端 mock 数据的几种方式,前端,前端,mock

总结

        几种 mock 方式各有优缺点,上边只是提供一个思路,具体的 mock 方案就需要结合项目进行一定的封装了。文章来源地址https://www.toymoban.com/news/detail-583861.html

到了这里,关于前端 mock 数据的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端技术中的几种居中方式

    1、使用margin:0px auto可以使盒子水平居中,但要设置宽度。 2、在父元素中使用text-align:center可以将子元素设置水平居中,但子元素必须为行内元素或行内块元素。 3、使用绝对定位,父相子绝的原则,在子元素中设置left:50%和transform:translateX(-50%)。可以不设置宽高。       这里

    2024年02月04日
    浏览(49)
  • 前端中对象的几种创建方式

    创建对象的几种方式: 1.字面量方式 2.工厂模式 3.构造函数模式 4.原型模式 缺点:创建多个对象时,需要重复代码,不能复用。 作用:批量创建同类型对象,降低代码冗余度。 缺点:创建出的新对象,不知道是什么Person或者Animal类型,需看函数内部代码。 构造函数 是一种特

    2023年04月08日
    浏览(55)
  • html前端的几种加密/解密方式

    一、base64加密 Base64编码:Base64是一种将二进制数据转换为可打印字符的编码方式。在前端,可以使用JavaScript的 btoa() 函数进行Base64编码,使用 atob() 函数进行解码。 二、MD5加密(不可逆)  MD5散列:MD5是一种广泛使用的散列算法,可以将输入转换为固定长度的散列值。在前端,

    2024年04月09日
    浏览(58)
  • springboot接收前端参数的几种方式

    目录 第一种:直接在方法中指定参数 第二种:使用@requesrParam注解 第三种方法:基于@pathVariable  第四种方法:基于@ResquestBody 在开始之前,我们需要一下准备工作,创建数据库,springboot工程,添加依赖,配置文件,使用的技术有mybatisplus,springboot,maven,mysql。 首先,数据库

    2024年02月07日
    浏览(46)
  • 前端div水平居中的几种实现方式

    父元素开启 display:flex 布局,并设置 justify-content:center 主轴的空隙分布 因为是单行,所以使用 align-items:center 设置侧轴上的对其方式 啊啊啊 借助这一条规则 文章: https://www.zhihu.com/question/21644198/answer/42702524 https://www.w3.org/TR/CSS2/visudet.html#blockwidth top、left、right、bottom 设置百分比基

    2024年02月07日
    浏览(66)
  • 【SpringBoot系列】接收前端参数的几种方式

    前言 在现代Web开发中,前后端分离的架构已经成为主流。前端负责展示页面和用户交互,而后端则负责处理业务逻辑和数据存储。在这种架构下,前端需要将用户输入的数据发送给后端进行处理。而Spring Boot作为一种快速开发框架,提供了多种方式来接收前端数据。 本文将介

    2024年02月05日
    浏览(46)
  • 手机web前端调试页面的几种方式

    PC端web页面调试比较容易,这里主要说几种移动端调试的方法,从简单到复杂、从模拟调试到远程调试,大概分为几部分: 1、Chrome DevTools(谷歌浏览器)的模拟手机调试 2、weinre(web inspector remote)远程调试工具 3、微信的“web开发者工具”,集成了Chrome DevTools和weinre,做的比较好

    2024年02月09日
    浏览(43)
  • 记录--盘点前端实现文件下载的几种方式

    前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。 通过 a 标签的 download 属性来实现文件下载,这种方式是最简单的,也是我们比较常用的方式,先来看示例代码: 就上面的这个示例,我们点击下

    2024年02月13日
    浏览(54)
  • 前端下载文件的几种方式使用Blob下载文件

    前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的 网络地址 (一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回 文件流 (一般用在动态文件上,比如根据前端选择,导出不同的

    2024年02月05日
    浏览(53)
  • 前端下载文件(Blob)的几种方式使用Blob下载文件

    在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的网络地址(一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回文件流(一般用在动态文件上,比如根据前端选择,导出不同的统计结果 excel 等) 第一种方式比较简单,但

    2024年02月07日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包