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

2023-10-28

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

Msw-Tools

一、前言

Msw-Tools(Mock Service Worker Tools)是一个基于 Msw.jsSvelte 构建的数据 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-toolsmsw
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 /> 导入
// App.vue

<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 保持一致。请参考:

八、注意事项

  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,减小打包体积
  • 规划中…

十一、使用反馈

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

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

Thank you ♪(・ω・)ノ


欢迎访问:天问博客

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

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

随机推荐

  • python-半省略号、三个点、点点点、...符号的用法小结

    一 符号 省略号 和Ellipsis对象 在Python中 一切皆对象 符号 在python中其实也有相应的对象 Ellipsis 如下面的代码所示 和Ellipsis的地址是相同的 打印 显示的结果是Ellipsis 打印 的类型显示el
  • 直流输入过压保护电路

    在嵌入式产品设计中 许多都为电池供电或者USB接口供电 当误操作使供电电压高于芯片工作电压时 就会导致芯片烧坏 带来严重的后果 因此在电源的输入端到芯片的供电输入端 还是很有必要加一个过压保护电路 当输入电压超过设定值 就切断电源 保护芯片
  • java登录远程服务器

    加入ssh的依赖 ch ethz ganymed ganymed ssh2 262 代码实现 因为执行SHELL脚本的时候可能是给出正常的返回值 也可能是异常的信息 这里需要一个JAVA Bean来接收这两个消息 代码如下 import j
  • OpenMMLab开源库总结——笔记1

    摘要 很高兴能加入OpenMMLab AI实战营 成为第二期4班的一名学员 OpenMMLab经过几年的发展和沉淀 其开源项目已经覆盖到计算机视觉的各个领域 OpenMMLab 为香港中文大学 商汤科技联合实验室 MMLab 开源的算法平台
  • mysql软件架构

    客户端是你的业务应用 怎么连接mysql server 一般都是用jdbc Java odbc C 客户端连接mysql 服务 发指令发sql语句等 文件系统 操作系统的文件系统 比如windows的文件系统 linux的文件系统 综上所述
  • 蓝桥杯模拟-排列序数

    问题 X星系的某次考古活动发现了史前智能痕迹 这是一些用来计数的符号 经过分析它的计数规律如下 为了表示方便 我们把这些奇怪的符号用a q代替 abcdefghijklmnopq 表示0 abcdefghijklmnoqp 表示1 abcd
  • 数据结构例题--迷宫

    迷宫 问题要求 定义一个二维数组N M 其中2 lt N lt 10 2 lt M lt 10 如5x5数组 如下所示 int maze 5 5 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1
  • 记录红米k40解BL、Root、装XPOSED

    一 前言 刚从一加转到红米 不得不吐槽虽然一加系统简陋但社区搞基搞机氛围非常好 官方支持root也保修和第三方ROM下大神层出不群 小米的社区放眼望去基本没人讨论root 第三方ROM 都是各种吐槽提问但没人回复的帖子 既然找不到教程那就按
  • qt,信号槽连接不成功原因

    在 Qt 中 信号槽连接不成功的原因可能有很多 下面是一些可能的原因和解决方法 1 信号和槽的声明不匹配 请确保信号和槽的参数类型和数量完全匹配 如果它们不匹配 连接将不会成功 检查信号和槽的声明 确保它们是兼容的 2 信号和槽的作用域问题
  • JSON数组,JSON对象,数组的区别与基本操作整理

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集 数据在名称 值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称 值对 JSON 数据的书写格式是 名称 值对 名称 值对组合中的名称写在前面
  • 三大WEB服务器对比分析(apache ,lighttpd,nginx)

    一 软件介绍 apache lighttpd nginx 1 lighttpd Lighttpd是一个具有非常低的内存开销 cpu占用率低 效能好 以及丰富的模块等特点 lighttpd是众多OpenSource轻量级的web server
  • 微信小程序开发(七) swiper 组件

    微信小程序swiper组件 banner 图 广告页 splash 实现效果 代码 js Page data iamgeUrls https img zcool cn community 0106445dc28607a801209e1f62
  • C++11右值 &&引用

    C 11右值 引用 2017年06月06日 11 56 25 Ink cherry 阅读数 2394 标签 C 右值引用 完美转发 个人分类 C C 感觉这篇讲的比较深入细致了 存一下 via http www cnblogs com Ti
  • [技术经理]02 什么是技术经理?

    目录 01什么是技术经理 02总结 01什么是技术经理 什么是技术经理 我用一句话概括为 专业技术团队的管理者 技术经理 是一种管理职位 通常是在软件开发 互联网等科技公司或技术团队中担任 技术经理的职责 是管理和协调技术团队 确保团队能够
  • java写一个圆类求面积_java编程:定义一个圆类,属性为半径,方法为对输入的半径计算其周长和面积?...

    展开全部 java编程e68a8462616964757a686964616f31333365633864定义一个类圆属性半径方法 计算周长面积设置半径读取半径急java编程定义一个类 java编程定义一个类圆属性半径 方法计算周长面积设置
  • “3D 元宇宙技术”在汽车新零售领域的应用与实践

    一 引言 随着不久前汽车之家新零售项目震撼发布 我们直击用户看车选车痛点首次提出ABC新体验模式 以元宇宙科技打造沉浸式交互服务 开放元宇宙能源空间站体验店 为用户打造更 有用 的体验 其中 A 是指一站式选车试车服务 All in one
  • python爬虫基础知识的总结

    什么是爬虫 一 爬虫概述 简单来说 爬虫就是获取网页并提取和保存信息的自动化程序 1 获取页面 如urllib requests等 2 提取信息 Beautiful Soup pyquery lxml等 3 保存数据 MySQL Mongo
  • [Pandas]Dataframe中切片常用技巧

    1 根据值在是否在列表中进行切片 方法一 使用isin方法可以根据DataFrame中的某列的值是否在某个列表中来进行切片 注意 这里不要直接使用in 否则会报错 代码如下 pf pd DataFrame 74 27 EA 4D 93 BD
  • 2. Redis持久化、主从哨兵架构详解

    分布式缓存技术Redis 1 Redis持久化 1 1 RDB快照 snapshot 1 1 1 bgsave的写时复制 COW 机制 1 2 AOF append only file 1 2 1 AOF重写 1 3 Redis 4 0 混
  • 努力一周,开源一个超好用的接口Mock工具——Msw-Tools

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