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

news2024/11/24 20:40:57

作为一名前端开发,是不是总有这样的体验:基础功能逻辑和页面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. 接口管理工具: 代表为 Apifix、Swagger、Yapi、Moco、Rap等,配置功能强大,有统一的接口管理后台,查找使用方便。但是重度依赖后端,前端发挥空间小,一般会作为大团队的基础建设而存在,维护成本比较高。
  3. 本地 node 服务器: 代表为 Json-server,基于本地 json 文件的增删改查,配置简单,自定义程度高。但是无法随着后端 API 的修改而自动修改。
  4. 请求拦截: 代表为 Mockjs,通过拦截特定的AJAX请求,并生成给定的数据类型的随机数,但是需要在业务代码中调用,有入侵性。
  5. 抓包工具: 代表为 Charles 、Fiddler 等软件工具,便于混合开发的问题排查、线上问题排查,但是使用和调试相对繁琐。
  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 /> 导入
<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 保持一致。请参考:

  • Vitebase 配置:Vite Base
  • Vue3Router/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-enderTester 体验使用,如有疑问或需求建议请到 Github Issues 提出。

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

Thank you ♪(・ω・)ノ


欢迎访问:天问博客

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

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

相关文章

uniapp 用于开发H5项目展示饼图,使用ucharts 饼图示例

先下载ucharts H5示例源码&#xff1a; uCharts: 高性能跨平台图表库&#xff0c;支持H5、APP、小程序&#xff08;微信小程序、支付宝小程序、钉钉小程序、百度小程序、头条小程序、QQ小程序、快手小程序、360小程序&#xff09;、Vue、Taro等更多支持canvas的框架平台&#…

掌握电脑开机密码设置技巧,让你的电脑数据更安全!

在现代社会&#xff0c;电脑已经成为了我们日常生活中必不可少的工具。然而&#xff0c;随着科技的发展&#xff0c;我们使用电脑也面临着一些安全隐患。为了保护个人数据的安全&#xff0c;设置开机密码就变得十分重要。本文将为大家介绍电脑怎么设置开机密码&#xff0c;以保…

在RTOS中验证互斥量有效解决优先级反转现象

我们在stm32f103c8t6单片机上验证RTOS互斥量有效解决优先级反转现象&#xff0c;利用stm32cube进行RTOS的配置。在选择TIM2当做RTOS的时钟&#xff0c;裸机的时钟源默认是 SysTick&#xff0c;但是开启 FreeRTOS 后&#xff0c;FreeRTOS会占用 SysTick &#xff08;用来生成1ms…

数组去重及去除指定值,每一个对象添加属性值

1、数组去重ES6写法 Set() // 数组去重 let arr [1,2,4,6,3,2,6,7,7,2,9,0,1,5] arr [...new Set(arr)] console.log(arr); 2、数组去除指定值 filter() // 数组去除指定值 let arr [1,2,4,6,3,2,6,7,7,2,9,0,1,5] const num 7 arr arr.filter(item>item!num) cons…

Go集成elasticsearch8极简demo,光速入门

Go集成elasticsearch8极简demo,光速入门 配置go环境创件go mod工程代码实现配置go环境 编辑器添加goproxy GO111MODULE=on;GOPROXY=https://mirrors.wps.cn/go/,https://goproxy.cn,direct;GOSUMDB=off创件go mod工程 mkdir demo cd demo go mod init demo代码实现 在demo…

测试用例的修改更新

测试用例的修改更新是指测试过程中由于用户需求的改变&#xff0c;或者测试过程中发现有新的需求产生&#xff0c;使得测试用例需要进行修改。修改更新测试用例不仅是一种测试技术&#xff0c;更是一种质量保证的方法。但修改和更新测试用例的技术要点在于&#xff1a; 1、执行…

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中&#xff0c;单例模式是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 这意味着无论何时需要该类的实例&#xff0c;都可以获得相同的实例&#xff0c;而不会创建…

API接口能力不足?Bug处理慢?Lazada开放平台API商品接入

7月30日正式发布的Lazada开放平台2.0&#xff08;Lazada Open Platform 2.0&#xff09;&#xff0c;从商品API、订单API、IM&#xff08;即时通信&#xff09; API、营销工具等几大方向&#xff0c;带来全新升级的API体系&#xff0c;共新增47个接口、优化19个接口&#xff0c…

JVM-9-Class类文件的结构

Java技术能够一直保持着非常良好的向后兼容性&#xff0c;Class文件结构的稳定功不可没。 Class文件是一组以8个字节为基础单位的二进制流&#xff0c;各个数据项目严格按照顺序紧凑地排列在文件之中。 Class文件格式采用一种类似于C语言结构体的伪结构来存储数据&#xff0c…

详细教程 - 从零开发 鸿蒙harmonyOS应用 第八节——鸿蒙操作系统中的文件读写操作封装

一、引言 鸿蒙操作系统是华为自主研发的全场景操作系统。在这篇博客中&#xff0c;我们将探讨如何在鸿蒙操作系统中实现文件读写操作的封装。 二、文件读写操作 在鸿蒙操作系统中&#xff0c;文件读写操作是一个常见的需求。下面是一个简单的文件读写操作的封装示例&#xff1…

数据分析场景下,企业大模型选型的思路与建议

来源/作者&#xff1a;爱分析 随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。本次分享主要围绕数据分析场景下大模型底座的选型思路&#…

上传xml文件进行跨站脚本攻

文件路径或者URL&#xff1a;xxxxx <?xml version"1.0" encoding"iso-8859-1"?> <xsl:stylesheet version"1.0" xmlns:xsl"http://www.w3.org/1999/XSL/Transform"> <xsl:template match"/"> <html…

部署threestudio | stable zero123

选择我在autodl的stable-zero123这个镜像&#xff0c;或者直接选这个基础环境 开机后切换到conda的base环境 这里注意一点就是目前stable-zero123这个镜像还没解决的问题&#xff0c;就是没法使用xformers&#xff0c;所以如果重新配置&#xff0c;在这里就要先安装指定版本的…

liunx下用C++使用freetype库在opencv上打中文字

1、/visualizer.cpp:11:10: fatal error: ft2build.h: 没有那个文件或目录 11 | #include <ft2build.h> freetype安装问题&#xff0c;要把文件拉到根目录&#xff0c;不然找不到文件 2、编译失败找不到定义 /usr/bin/ld: CMakeFiles/interactive_face_detection_de…

树莓派Ubuntu系统安装OpenCV教程

硬件&#xff1a;树莓派4B 2G 内存卡32G 软件&#xff1a;系统是ubuntu-mate-20.04.1-desktop-arm64raspi.img 步骤如下&#xff1a;一、更新系统软件包列表和安装基本工具 sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential cmake git二、安装…

【Linux】Linux运维基础

Linux简介&#xff1a; Linux是一个开源的操作系统内核&#xff0c;最初由Linus Torvalds创建。它通常与GNU工具一起使用&#xff0c;以创建一个完整的操作系统。Linux操作系统有许多基于内核的发行版&#xff0c;如Ubuntu、CentOS、Debian等&#xff0c;每个发行版都有其独特的…

解决docker alpine /bin/sh: ./main: not found

解决docker alpine /bin/sh: ./main: not found golang中编译之后的二进制文件部署在alpine镜像中出现了not found问题解决这种情况是因为动态链接库位置错误导致的&#xff0c;alpine镜像使用的是musl libc而不是gun libc。因而动态链接库的位置不一致。在基础镜像内执行&…

13. 从零用Rust编写正反向代理, HTTP中的压缩gzip,deflate,brotli算法

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring的AOP前奏

第一章 AOP前奏 1.1 代理模式 代理模式&#xff1a;我们需要做一件事情&#xff0c;又不期望自己亲力亲为&#xff0c;此时&#xff0c;可以找一个代理【中介】 我们【目标对象】与中介【代理对象】不能相互转换&#xff0c;因为是“兄弟”关系 1.2 为什么需要代理【程序中…

MQTT中的遗嘱和证明(Last Will and Testament, LWT)

在MQTT中&#xff0c;遗嘱和证明&#xff08;Last Will and Testament, LWT&#xff09;是一个很有用的功能&#xff0c;允许客户端指定一条消息&#xff0c;当非预期的断开连接发生时&#xff0c;由代理&#xff08;broker&#xff09;代替它们自动发布出去。提供了一个可靠通…