开源一个超好用的接口Mock工具——Msw-Tools

2023-12-19

作为一名前端开发,是不是总有这样的体验: 基础功能逻辑和页面UI开发很快速,本来可以提前完成,但是接口数据联调很费劲,耗时又耗力,有时为了保证进度还不得不加加班。
为了摆脱这种痛苦,经过一周的努力,从零开发了一个灵活无依赖,且集成简单的数据接口 Mock 工具—— Msw-Tools ,已开源到 NPM ,希望对前端小伙伴有所帮助。

Msw-Tools

一、前言

Msw-Tools (Mock Service Worker Tools)是一个基于 Msw.js Svelte 构建的数据 Mock 工具,用于前后端接口数据联调,方便开发者在不同数据、不同场景下进行功能测试。

  • Msw-Tools 能做什么?
  • Msw-Tools 能做什么?
  • Msw-Tools 能做什么?

Msw-Tools 以浏览器 localStorage 数据库 ,能让开发者分布式的在浏览器上建立一套独立的接口服务,前端人员在不依赖后端接口完成的情况下走正常的开发调试流程,开发者可以很精确自由的控制哪些接口使用 Msw-Tools 提供的本地 Mock 数据服务,哪些接口使用后端提供的接口数据服务。 再也不用担心加班熬夜调接口了,摸鱼什么的统统到碗里来 ^_^

痛点引导需求,需求决定产品。

开发 Msw-Tools 最初为了解决我日常开发中遇到的痛点,也就是前边说的,前后端接口数据联调比较耗时,很容易影响开发进度。
早在以前也使用过很多相应的 Mock 方案,但是总感觉不够灵活,而大部分都需要在项目中写 Mock 数据的逻辑代码,这一点是我比较抵制的。因为这样做很容易造成代码耦合,甚至一不小心就会把Mock代码打包到生产环境。

二、前端常用的MOCK方案

前端常用的常用的MOCK方案有以下几类:

  1. 代码侵入: 直接在代码中写死 Mock 数据,或者请求本地的 JSON 文件,总之,一切需要侵入代码切换环境的行为都是不好的,实际开发中最常用,但不推荐。
  2. 接口管理工具: 代表为 ApifixSwaggerYapiMocoRap 等,配置功能强大,有统一的接口管理后台,查找使用方便。但是重度依赖后端,前端发挥空间小,一般会作为大团队的基础建设而存在,维护成本比较高。
  3. 本地 node 服务器: 代表为 Json-server ,基于本地 json 文件的增删改查,配置简单,自定义程度高。但是无法随着后端 API 的修改而自动修改。
  4. 请求拦截: 代表为 Mockjs ,通过拦截特定的AJAX请求,并生成给定的数据类型的随机数,但是需要在业务代码中调用,有入侵性。
  5. 抓包工具: 代表为 CharlesFiddler 等软件工具,便于混合开发的问题排查、线上问题排查,但是使用和调试相对繁琐。
  6. 组合模式: 代表为 Easy-mock ,提供在线服务和接口代理,官网建设中。
  7. 其他方案: 代表为 Jsonplaceholder ,直接 fetch 远程的数据,文档简单。

三、Msw-Tools 灵感火花

很早以前用过 mockjs 来拦截数据,于是就很好奇,网络请求是怎么拦截的?恰好最近在 npm 上看到一个很不错的开源库 msw ,原来这个也是做 Mock 数据的。于是就大概看了一下 mswjs 官网介绍,其中提供了很灵活的API,让我们以 Express 路由的形式去配置 Mock 接口,但是所有的 mock 数据都是提前在代码中集成的。然后,我就在想能不能由 Mock 调试者或使用者自由的去配置接口 Url 和 Mock 数据,如果能实现,不仅开发者能灵活的配置想要的接口数据,而且测试人员也能很方便的来修改接口数据,以达到测试不同数据、不同场景的情况,并且还能避免修改数据库。

四、Msw-Tools 功能特点

  • 无框架限制: 使用 Svelte 独立封装的 Custom Web Components ,像使用 div、span 等原生标签一样无感使用,不管是 Vue2/Vue3、React、Angular、Svelte、SolidJs 等流行框架,还是传统的多页面 HTML、JQuery、JSP、PHP 都可以轻松集成。
  • 无侵入性: 根据开发环境动态加载,与业务功能代码无依赖、无耦合、无关联。
  • 配置范围广: 个性化配置 Mock 接口,Response Data、Status Code、Request Pending Time。
  • 控制粒度细: 可以精确控制到每一个数据接口是否使用 Mock。
  • 操作友好性: 一键编辑,数据格式化,一键配置,即刻生效。
  • 数据便捷性: Mock 数据支持以 JSON 文件的形式一键导入,一键导出。

五、接入使用

Method 1: Using npm:(Recommended)

  • install msw-tools msw
npm install -D msw-tools

npm install -D msw
  • install mockServiceWorker.js 。每个脚手架生成的项目,静态文件目录可能不同,具体请参考: Common public directories
npx msw init public/ --save

Method 2: Using CDN in HTML:

<body>
  <msw-tools base="/"></msw-tools>

  <script src="https://unpkg.com/msw-tools@latest/dist/msw-tools.min.umd.js"></script>
</body>

六、Example

Vue3 项目为例:

  1. 在入口文件 main.js 中根据环境来动态加载
// main.js

import { createApp } from 'vue'
import router from './router'
import store from './store'
import App from './App.vue'
import './assets/css/style.scss'

// 只在开发环境使用
if (import.meta.env.MODE === 'development') {
  const MswTools = require('msw-tools')
  new MswTools()
}

const app = createApp(App)

app.use(router).use(store)
app.mount('#app')

  1. 在根组件 App.vue 中使用 <msw-tools /> 导入
<template>
  <msw-tools :base="env.baseUrl" v-if="env.isDev" />

  <router-view />
</template>

<script setup>
  import { reactive } from 'vue'

  const env = reactive({
    baseUrl: '',
    isDev: true,
  })
  
  const { BASE_URL, MODE } = import.meta.env
  env.baseUrl = BASE_URL
  env.isDev = MODE === 'development'
</script>

七、参数配置

base :开发或生产环境服务的公共基础路径。

  • 类型: string
  • 默认: /

使用参照:

  1. 访问 URL: https://tiven.cn , 对应的 Base: / , 使用 <msw-tools base="/" />
  2. 访问 URL: https://tiven.cn/service/ ,对应的 Base: /service/ ,使用 <msw-tools base="/service/" />

需要与打包工具和 Router 路由的 base 保持一致。请参考:

  • Vite base 配置: Vite Base
  • Vue3 Router/base 路由配置: Vue3 Base

八、注意事项

  1. mockServiceWorker.js 文件只能放在静态文件目录中( /public ),作为 Service Worker 服务的注册文件,不参与打包编译,只能以 相对路径 的形式引用,不然 Service Worker 服务无法注册,会导致请求拦截不生效。
  2. 由于浏览器 service Worker API 使用限制:只能在 https(已安装证书)、localhost、127.0.0.1 等服务下使用,否则控制台会出现 [MSW] Mocking enabled (fallback mode) 日志,也就是说 http 域名服务,包括本地 IP 服务,例如: http://10.168.44.123:3000/ 等服务下不可用。

九、演示体验

Msw-Tools 在线体验: msw-tools
Msw-Tools 在线体验: msw-tools
Msw-Tools 在线体验: msw-tools

Msw-Tools

十、TODO

  • 开启控制台的按钮可拖拽移动
  • Msw-Tools 功能持续优化 doing
  • 封装 mswjs 相关API,减小打包体积
  • 规划中…

十一、使用反馈

  • Email: tw.email@qq.com
  • Issues: msw-tools

欢迎广大 Front-ender Tester 体验使用,如有疑问或需求建议请到 Github Issues 提出。

闭门造车造轮子,过程很艰难,坚持才有收获。

Thank you ♪(・ω・)ノ


欢迎访问: 天问博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源一个超好用的接口Mock工具——Msw-Tools 的相关文章

  • 将数组作为 x-www-form-urlencoded 的一部分发送

    I want to send array using postman the request looks like this Im using postman to execute requests I found on the inter
  • 华为OD机试真题-开源项目热榜--Java-OD统一考试(C卷)

    题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单 推荐给社区里面的开发者 对于每个开源项目 开发者可以进行关注 watch 收藏 star fork 提issue 提交合并请求 MR 等 数据库里面统计了每个开源项目关注 收藏
  • 为什么来自 POSTMAN 的 POST 请求返回空?

    我在邮递员中的标题如下 我的身体是这样的 在 Laravel Lumen 路线中 我像这样检查 router gt group middleware gt auth function router router gt post sales
  • JSON 解析错误:无法从字符串反序列化“java.time.LocalDateTime”类型的值

    我正在向具有 updateDate 属性的外部服务发送请求 UpdateTimestamp Column name updated date private LocalDateTime updatedDate 当我在 DTO 中收到响应时
  • 如何将 Postman 集成测试与 TeamCity 集成

    我正在 Postman 中构建一套集成测试来测试一些 RESTful API 我想在 TeamCity 中构建项目时运行这些测试 我正在考虑使用纽曼命令行集成 但我没有找到很好的例子 谁能建议一种方法来实现这一点 我能够使用 newman
  • Postman中如何自动获取token

    我使用 Postman 桌面应用程序进行 Web API 测试 我有很多控制器 每个控制器都需要一个令牌 首先我得到Bearer token然后将其复制到其他请求中 该令牌有时间限制 我可以自动获取令牌 然后自动将其设置为所有其他请求吗 好
  • 我们可以在postman中读取excel中的数据进行js测试吗?

    我们可以在postman中读取excel中的数据进行js测试吗 或者 我们可以编写一个从 excel csv notepad 读取数据的 js 脚本吗 我写了一些 js 脚本来自动化我的 API 测试 我正在使用 Newman 从命令提示符
  • Flask:获取从 Postman 发送的 gzip 文件名

    我正在从 Postman 向 Flask 端点发送 gzip 文件 我可以使用该二进制文件request data并阅读 保存 上传等 我的问题是我不知道它的名字 我怎样才能做到这一点 我的 gzip 文件名为 test file json
  • 与邮递员的 CORS

    这个问题已经被问过几次了 但我还是不明白 当我读到有关的答案时 没有 Access Control Allow Origin 标头 问题 它说应该在请求的服务器上设置一个设置以允许跨域 add header Access Control A
  • 如何为邮递员请求生成未来的日期和时间

    name IronMan phone number 555555555 number of guest 10 tables 2 reservation start at 2020 10 15T10 00 00 861873Z reserva
  • 使用POSTMAN时不会出现CORS问题

    我已经使用 POSTMAN 发送一段时间了HTTP requests like GET POST PUT用于 RESTful Web 服务 最近遇到一种情况 当通过浏览器向我的 REST API 发送请求时 我收到一条消息 请求的资源上不存
  • 如何修复 .Net Core POST 操作中的 400 Bad Request 错误?

    我有一个 Net Core 2 1 API 它使用 EF core 发布数据 当我从 Postman 向 http localhost 3642 task create 发出 POST 请求时 收到 400 Bad Request 错误 由
  • 如何在 Postman 中将 {{$timestamp}} 格式化为 MM/DD/YYYY?

    在 邮递员 中 动态变量 https www getpostman com docs postman environments and globals variables dynamic variables timestamp 插入当前的U
  • 使用 Postman 通过 HTTP POST 上传图像

    一段时间以来 我一直在尝试通过 Postman 将图像发送到一个简单的 PHP 脚本 该脚本应该显示发送的图像 我遵循的步骤是 邮递员 客户端 端 Select POST request 选择标题内容类型有价值多部分 表单数据 在正文选项卡
  • 如何使用邮递员查看返回的 html 呈现为网页

    我正在与邮递员一起测试 Flask 应用程序 我注意到 如屏幕截图所示 我收到了返回的 HTML 我知道过去我能够看到返回的 HTML 呈现为网页 但现在我不能 尽管单击各种按钮 如何将返回的 html 作为网页查看 In order to
  • Instagram 基本显示 API - 出现无效平台应用程序错误

    我在邮递员上点击 oauth access token API 时收到无效平台应用程序错误 注意 对于 app id 我使用 Instagram 应用程序 ID 有什么解决办法吗 error type OAuthException code
  • 使用Postman测试.net core 2页面返回400错误请求

    我创建了 net core 2 Pages 的默认项目模板 然后尝试使用 postman 测试对页面 OnPostAsync 不是 api 控制器 的调用 但我总是收到 400 错误请求 尝试使用标头等 但没有成功 有人设法做到这一点吗 在
  • php 解码 JSON 获取值

    我正在尝试解码 JSON 格式 我要发送的是 id 123 name John surname Smith department 3 我正在通过 Postman 发送带有数据的 POST 如图所示 所以 这是我想要解码的数据 data se
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • 在 Postman 中的后续请求中使用身份验证令牌

    我的应用程序 API 需要通过身份验证令牌进行身份验证 简而言之 我们向 authentication端点 它使用包含令牌的 JSON 对象进行响应 例如 token xxxxxxxxxxxxxxxxxxxxxx 我们应用程序中的每个其他

随机推荐

  • vtk用户指南 第十一章 随时间变化的数据

    11 1时序支持简介 创建可视化工具包的目的是允许人们可视化 从而探索具有空间范围的数据中的特征 它允许人们回答一些问题 比如 在这些数据中 最大价值的区域在哪里 它们有什么形状和价值 以及 这些形状是如何分布的 VTK提供了大量的技术来显
  • 阿里云一二级域名配置

    一级域名配置 二级域名配置
  • 2023中国品牌节金谱奖荣誉发布 酷开科技获颁OTT行业科技创新奖

    11月17日 19日 以 复苏与腾飞 为主题的2023第十七届中国品牌节 在杭州市云栖小镇国际会展中心成功举行 在18日晚间的荣耀盛典上 TopBrand 2023中国品牌节金谱奖 荣誉发布 酷开科技斩获OTT行业科技创新奖 酷开科技作为O
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 再看参数校验

    作者简介 大家好 我是smart哥 前中兴通讯 美团架构师 现某互联网公司CTO 联系qq 184480602 加我进群 大家一起学习 一起进步 一起对抗互联网寒冬 写一个接口 大致就几个步骤 参数校验 编写Service Dao SQL
  • 如何开发一个免费的App

    开发一个免费App意味着能够在项目启动初期 以更低成本的方式进行业务的迭代和市场化验证 互联网发展到2023年 尤其在生成式AI及大模型技术 跃进式 增长的背景下 一个创新式商业模式的起步变得异常艰难 但如果用好工具 那么不仅能事半功倍 还
  • 网络安全设备概念的熟悉和学习

    什么是网络安全 网络安全技术有哪些 Web应用防火墙 WAF 为什么需要WAF 什么是WAF 与传统防火墙的区别 WAF不是全能的 入侵检测系统 IDS 什么是IDS 跟防火墙的比较 部署位置选择
  • 【网络安全】—Shell编程入门(1)

    文章目录 基础 变量概念介绍 特殊变量进阶 数值计算实践 条件测试比较 条件判断语句 流程控制语句 循环语句应用
  • threejs 解析外部模型关键帧动画

    参考资料 threejs中文网 threejs qq交流群 814702116 解析外部模型关键帧动画 前面几节课 用到的关键帧动画 是借助threejs提供的两个类 KeyframeTrack AnimationClip 自己写代码实现
  • SQL Server 大数据量分页

    1 ROW NUMBER OVER 方式 SQL2012以下推荐使用 SELECT FROM SELECT ROW NUMBER OVER ORDER BY menuId AS RowId FROM sys menu AS r WHERE
  • “jar“:CreateProcess error = 2,系统找不到指定的文件

    起因 系统配置的java环境为jar 或java环境不完整导致 修复 将jar exe拷贝至java环境的bin目录中即可
  • c语言:指针作为参数传递

    探究实参与形参它们相互独立 由于主调函数的变量 a b 与被调函数的形参 x y 它们相互独立 函数 swap 可以修改变量 x y 但是却无法影响到主调函数中的 a b 现在利用取地址运算符 分别打印它们的首地址 让我们从内存的角度 来分
  • 使用小程序实现App灰度测试的好处

    灰度测试 Gray Testing 是一种软件测试策略 也被称为渐进性测试或部分上线测试 在灰度测试中 新的软件版本或功能并非一次性推送给所有用户 而是仅在一小部分用户中进行测试 这可以帮助开发团队逐步暴露新功能或版本 以便及时发现和修复问
  • 网络安全基础知识

    1 什么是防火墙 什么是堡垒主机 什么是DMZ 防火墙是在两个网络之间强制实施访问控制策略的一个系统或一组系统 堡垒主机是一种配置了安全防范措施的网络上的计算机 堡垒主机为网络之间的通信提供了一个阻塞点 也可以说 如果没有堡垒主机 网络间将
  • Matlab-绘图及其位置摆放

    一 绘图函数 1 绘制二维图形 1 1 plot 函数的应用格式 1 plot x 当x 为一向量时 以x 元素的值为纵坐标 x 的序号为横坐标值绘制曲线 当x 为一实矩阵时 则以其序号为横坐标 按列绘制每列元素值相对于其序号的曲线 例如
  • threejs 机械虚拟装配案例(播放)

    参考资料 threejs中文网 threejs qq交流群 814702116 机械虚拟装配案例 播放 如果你想做一个产品 机械 建筑的虚拟装配动画 可以美术先在建模软件中生成关键帧动画的数据 然后通过threejs加载模型 播放动画数据即
  • 使用AI大模型无损放大照片

    在线体验 点击 图像处理 即可使用 private static final String IMAGE QUALITY ENHANCE https aip baidubce com rest 2 0 image process v1 ima
  • 多线程案例:购买车票

    购票案例 多线程同步 多线程的并发执行虽然可以提高程序的效率 但是 当多个线程去访问同一个资源时 也会引发一些安全问题 并发 同一个对象被多个线程同时操作 处理多线程问题时 多个线程访问同一个对象 并且某些线程还想修改这个对象 这时候我们就
  • 网络安全自学入门:(超详细)从入门到精通学习路线&规划,学完即可就业_网络安全自学从哪里入手

    很多人上来就说想学习黑客 但是连方向都没搞清楚就开始学习 最终也只是会无疾而终 黑客是一个大的概念 里面包含了许多方向 不同的方向需要学习的内容也不一样 算上从学校开始学习 已经在网安这条路上走了10年了 无论是以前在学校做安全研究 还是毕
  • 开源一个超好用的接口Mock工具——Msw-Tools

    作为一名前端开发 是不是总有这样的体验 基础功能逻辑和页面UI开发很快速 本来可以提前完成 但是接口数据联调很费劲 耗时又耗力 有时为了保证进度还不得不加加班 为了摆脱这种痛苦 经过一周的努力 从零开发了一个灵活无依赖 且集成简单的数据接口