为什么需要一个新的工具?
现有的大部分mock工具,都是“中心化”的。所谓的“中心化”,即为了解决团队协作问题,需要将mock服务器部署在一台中央服务器上。这样,团队创建的mock接口集中到一处,才可以在团队之间共享。典型如大搜车的easy-mock.
这种方式带来的问题是:
- 无法通过本地编辑器编辑。需要通过一个线上的编辑器,来创建API,编辑接口响应内容。
- 版本控制需要付出额外的成本。
- 线上的内容可能被随时编辑改变,导致开发过程中出现冲突等。
- 额外的资源:至少需要准备一台服务器。
这就是为什么我创建了ivormock。
ivormock的解决思路
开发过程中,在IDE中创建mock API是一个很自然的想法。“为什么我要切换到一个浏览器里去创建API?这给我带来了额外的负担”,这是我在日常开发中经常会有的想法。
跟随着项目代码一起编辑mock API,可以使用项目的git来进行版本控制,可以轻松地追踪mock API修改的过程,可以方便地与团队进行共享;当我想要修改接口响应时,直接在IDE中编辑即可,不会影响团队内其他人的使用;同时,这样也不会部署在额外的服务器上--跟随着开发服务器一起启动即可。这样不是很方便吗?
ivormock便是基于这样的想法实现。这赋予了ivormock优秀的特性:
- 去中心化,不再需要中央服务器
- “零成本”的版本控制
- 修改可经过review,不会影响其他开发者协作开发
- 轻量级
在此基础之上,ivormock还支持:
- 从文件生成路由
- 根据需要切换API响应,不再需要频繁的注释代码来获得不同的响应
- 监听mock文件修改,自动重新注册路由,不需要重启服务器
- 支持多项目同时协作
- 提供webpack/vite插件,易于与现有工作流集成
如何使用
ivormock 提供了命令行工具,webpack/vite插件,可通过命令行和插件的方式来使用。后面还计划提供UI界面来维护ivormock项目。
安装
可选择全局安装或者在项目中安装。
# 安装ivormock
npm install -g ivormock
# 安装webpack插件
npm install webpack-plugin-ivormock
# 安装vite插件
npm install vite-plugin-ivormock
API
可通过ivormock -h查看ivormock的API。
$ ivormock -h
Usage: ivormock [options] [command]
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
create <name> 创建项目
delete <name> 删除项目
config <name> 修改项目配置
list 获取所有项目列表
start <name> 启动项目
stop <name> 停止项目
restart <name> 重启项目
doc <cmd> ivormock文档相关管理,TBD
help [command] display help for command
可以看到,ivormock主要是对项目的管理,包括项目的增删改查和启动、停止。
创建mock API
在ivormock里,文件即路由。文件名会被注册成路由,文件内容会作为mock API的响应。
文件名
文件名由方法名和路由组成,以__分割;路由中的/替换为_。文件名规则示例如下:
get__api_v1_users.js // GET /api/v1/users
api_v1_users.js // GET /api/v1/users, 不写方法,默认为get
post__api_v1_user.js // POST /api/v1/user
post__api_v1_user_[id].js // POST /api/v1/user/:id
文件内容
文件内容作为mock API响应。支持三种使用方式,示例如下:
直接返回响应
// post__api_v1_user_[id].js
module.exports = function() {
return {
foo: "sth",
boo: "sth",
// anything
}
}
返回失败的响应,自定义http code
// post__api_v1_user_[id].js
module.exports = function() {
return {
$$status: 400,
$$body: {
foo: "sth",
boo: "sth",
// anything
}
}
}
切换响应内容
// post__api_v1_user_[id].js
module.exports = function() {
return {
$$type: "SWITCH", // tell ivormock to switch response on demand
$$active: 1, // specify current active response index
$$options: [ // all possible responses
{
$$status: 200,
$$body: {
message: "this is a success response"
}
},
{
$$status: 500,
$$body: {
message: "this is a failed response"
}
}
]
}
}
获取请求参数
ivormock使用koa2开发,koa context会作为参数传递给mock函数。可通过context获取请求参数。
module.exports = function(ctx) {
// get params in body
const body = ctx.request.body;
if (!body.name) {
return {
$$status: 400,
$$body: {
message: "name is needed!"
}
}
}
return {
$$status: 204
}
}
与构建工具集成
ivormock提供webpack/vite插件,以方便开发者与现有工作流集成。
与webpack集成
const IvormockWebpackPlugin = require("webpack-plugin-ivormock");
const isDev = process.env.NODE_ENV === "development";
module.exports = {
// ...
plugins: [
//...
// Only used in development envorioment
isDev && new IvormockWebpackPlugin({
mockPath: "mock", // mock file path, relative to project root
port: 3456, // ivormock server port
prefix: "/mock" // request with "/mock" prefix will pass to ivormock
})
]
}
与vite集成
const ivormock = require("vite-plugin-ivormock");
export default {
// ...
plugins: [
//...
ivormock({
mockPath: "mock", // mock file path, relative to project root
port: 3456 // ivormock server port
})
]
}
源码
源码地址github.com/Hquestion/i…, 仓库正在全力完善中,欢迎提PR / Issue。