【Mock】前端er 如何优雅快速搭建Mock服务
搭建mock服务
搭建 Mock 服务可以通过使用在线平台(如 Apifox、EasyMock)、本地工具(如 JSON Server、Mock.js)、集成到开发框架中(如 Vite、Webpack 插件)或自建 Mock 服务器(如用 Node.js 和 Express)来实现。选择哪种方式取决于项目需求和技术栈。下面我就来分别讲一讲这三种方式吧😈😈😈
mock.js
mock工作流程:
- 前端引入mock.js
- 定义要模拟的路由、返回结果
- mock.js劫持ajax请求,得到模拟的结果
创建服务
安装mock.js
npm i mockjs --save
在src下新建一个目录_mock
,里面新建一个index.ts,并且引入mockjs
。
import Mock from 'mockjs'
引入完之后我们会发现有红线,这是因为我们这个是ts文件,需要一个再安装一个类型检查才行。
安装类型检查:
npm i --save-dev @types/mockjs
然后写一个简单的mock请求:
import Mock from 'mockjs'
Mock.mock('/api/text', 'get',() =>{
return 'Hello MockJS'
})
前端联调
⚠️mock.js只能劫持
XMLRequest
,不能劫持fetch
,所以我们需要安装axios。
安装axios:
npm i axios --save
随便新建一个页面来发起请求,部分代码如下:
import React, { FC } from "react";
// 引入axios 和 mock文件
import axios from "axios";
import "../../_mock";
const text: FC = () => {
const handleClick = () => {
axios.get("/api/text").then((res) => {
console.log(res.data);
});
};
return (
<button onClick={handleClick}>
发起请求
</button>
)
}
export default Login;
然后发起在前端发起请求,mock就会拦截下来,并且返回mock文件编写的返回值🥳。
Node.js
通过node服务+mock.js
- mock.js量大服务:劫持AJax+全面的Random能力
- 把mock.js用于nodeJS服务端,使用Random能力
创建服务
新建一个文件夹用来存放node服务,然后使用npm init -y
初始化node项目。初始化完成之后会出现一个package.json。
然后我们要继续安装mockJS,这一次使用mock不是为了发起服务的,而是使用mock的Random能力,方便自动生成一些数据。
npm i mockjs --save
在根目录下新建一个test
目录,这个目录用来编写node服务:
const Mock = require('mockjs') // 引入 Mock.js 模块
const Random = Mock.Random // 使用 Mock.Random 实例
// 导出一个包含模拟API接口配置的对象数组
module.exports = [
{
// 定义一个模拟的 API 接口,其访问路径为 '/test'。
url: '/test',
// 定义该接口接受的HTTP请求方法,此处为 'get' 请求。
method: 'get',
// 定义当接收到符合上述URL和方法的请求时返回的响应内容。
response: () => {
// 返回一个 JSON 对象作为模拟接口的响应。
return {
// 响应状态码,200 表示成功。
code: 200,
// 响应的数据部分,使用 Mock.Random.cname() 方法生成一个随机的中文名字。
data: Random.cname()
}
}
}
]
如果需要编写多个服务的话,需要分成多个文件,一个目录代表一个模块服务:
// 在mock目录下新建了一个 testTwo.js 文件
const Mock = require('mockjs')
const Random = Mock.Random
module.exports = [
{
url: '/test/two:id',
method: 'get',
response: () => {
return {
code: 200,
data: {
name: Random.cname(),
age: Random.natural(0, 100),
id: Random.id(10000, 99999)
}
}
}
}
]
启动服务
依旧是在mock目录下新建一个index.js
文件用来汇总所有服务:
const test = require('./test') // 引入本地的 'test' 模块
const testTwo = require('./testTwo') // 引入本地的 'testTwo' 模块
// 使用扩展运算符(...)将两个模块导出的数组合并到一个新的数组中。
// 这样可以将来自 'test' 和 'testTwo' 的所有模拟API接口配置组合在一起。
const mockList = [...test, ...testTwo]
// 导出合并后的模拟API接口配置列表,以便可以在其他地方使用这些模拟接口。
module.exports = mockList
为了让这些模拟接口真正地工作起来,我们需要将以上编写的文件放在一个运行中的服务器来监听HTTP请求,并根据请求的URL和方法来匹配相应的模拟接口配置,然后返回预定义的响应。
所以还需要安装koa
框架来搭建服务器环境。
安装koa
:
npm i koa koa-router --save
在根目录新建一个index.js
用来配置koa
// 引入 Koa 框架和 Koa-Router 路由中间件
const koa = require('koa')
const Router = require('koa-router')
// 引入模拟数据列表
const mockList = require('./mock/index')
const app = new koa() // 创建 Koa 应用实例
const router = new Router() // 创建路由器实例
// 遍历 mockList 并为每个模拟接口注册路由
mockList.forEach(item => {
// 解构赋值获取 url, method 和 response 函数
const { url, method, response } = item
// 根据 method 和 url 注册路由处理函数
router[method](url, async ctx => {
// 执行 response 函数生成响应数据,并赋值给 ctx.body
ctx.body = response()
})
})
// 使用路由器中间件,并将路由绑定到应用中
app.use(router.routes())
app.listen(3001) // 确保此端口不与前端服务冲突
还需要再安装一个热启动模块,保证修改文件之后会自动更新服务:
npm i nodemon --save-dev
安装完成后再package.json
配置一下启动命令,修改代码如下:
"dev": "nodemon index.js"
最后,使用npm run dev
启动服务。
在浏览器中输入访问localhost:3001/test,就可以看到返回回来的内容啦🥳!
访问另一个接口试一试localhost:3001/test/two:10,同样也是有返回数据的,说明我们的代码没有问题😆。
搞一个异步函数让加载有延迟:
const koa = require('koa')
const Router = require('koa-router')
const mockList = require('./mock/index')
const app = new koa()
const router = new Router()
// 延迟一秒钟
async function getRes (fn) {
return new Promise(resolve => {
setTimeout(() => {
const res = fn()
resolve(res)
}, 1000)
})
}
mockList.forEach(item => {
const { url, method, response } = item
router[method](url, async ctx => {
// 模拟网络请求的加载状态,1s
const res = await getRes(response)
ctx.body = res
})
})
app.use(router.routes())
app.listen(3001)
模拟post请求
新增了一个post请求,使用了 Mock.Random.datetime() 方法生成一个随机的日期时间字符串:
const Mock = require('mockjs')
const Random = Mock.Random
module.exports = [
{
url: '/test/two:id',
method: 'get',
response: () => {
return {
code: 200,
data: {
name: Random.cname(),
age: Random.natural(0, 100),
id: Random.id(10000, 99999)
}
}
}
},
// 新增了一个post请求,使用了 Mock.Random.datetime() 方法生成一个随机的日期时间字符串。
{
url: '/test/two',
method: 'post',
response: () => {
return {
code: 200,
data: Random.datetime('yyyy-MM-dd HH:mm:ss')
}
}
}
]
使用接口测试工具发起post请求:
- 请求路径:http://localhost:3001/test/two
然后就能看到随机生成的一个时间(*^▽^*)
。
前端联调
前端联调之前,我们还需要解决一个问题,那就是存在跨域的问题,前端服务启动的端口和我们服务端的端口不能冲突,那这样前端就无法拿到服务端的数据了(?_?)
。强行请求就会发生跨域报错。
跨域问题
声明一下,在这里我们只提供React的解决方案❗️
webpack配置
首先在前端项目中安装craco
npm i -D @craco/craco
在根目录下创建文件:
编写配置文件:
module.exports = {
devServer: {
proxy: {
'/api': 'http://localhost:3001'
}
}
}
在package.json
中替换启动命令:
"script":{
"start":"craco start"
"build":"craco build"
"test":"craco test"
}
然后就可以在前端发起请求:
import React, { FC } from "react";
const text: FC = () => {
const handleClick = () => {
// 在这里使用的是fetch请求,你也可以使用axios
fetch('/api/test')
.then(res => res.json())
.then(data => console.log(data))
};
return (
<button onClick={handleClick}>
发起请求
</button>
)
}
export default Login;
vite配置
你需要在vite.config.ts中这样配置:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
server: {
// 本地开发环境通过代理实现跨域
proxy: {
'/api': {
target: 'http://localhost:3001', // 后端服务实际地址
changeOrigin: true, //开启代理
rewrite: (path) => path.replace(/^\/api/, '') // 路径重写
}
}
}
})
前端请求依旧是和上面一样的:
import React, { FC } from "react";
const text: FC = () => {
const handleClick = () => {
// 在这里使用的是fetch请求,你也可以使用axios
fetch('/api/test')
.then(res => res.json())
.then(data => console.log(data))
};
return (
<button onClick={handleClick}>
发起请求
</button>
)
}
export default Login;
在线mock平台
在线 mock 平台简化了前后端分离开发流程中的数据模拟环节。这类平台允许开发者快速创建和共享 API 模拟,无需搭建真实的服务端环境。优点在于它们能加速开发过程,因为前端团队可以立即获得响应数据进行界面构建,而不必等待后端接口完成。同时,这些平台通常提供图形化界面,使得非技术人员也能轻松上手。
常见的mock平台有:
- Apifox:集成了 API 文档、调试、Mock 和自动化测试功能的一体化协作平台。它支持强大的数据模拟功能,兼容 Mock.js 语法,并允许用户通过简单的配置生成复杂的 JSON 数据。
- YApi:一个高效且易于使用的 API 管理工具,支持数据校验、自定义 URI 和团队协作。YApi 提供了丰富的特性来帮助开发者更好地管理和模拟 API。
- useMock:这是一个在线 Mock 平台,强调团队协作、灵活解耦和接口访问统计等功能,适合希望提高开发效率的团队。
不过,使用在线 mock 平台也有一些局限性。首先,虽然方便快捷,但可能无法完全模拟复杂的业务逻辑或真实的网络条件,这可能导致一些问题在集成时才暴露出来。其次,依赖外部服务意味着可能会遇到稳定性或性能方面的问题,比如平台本身的故障或者响应速度较慢等。最后,对于敏感项目,将数据托管给第三方平台也可能引发安全性和隐私方面的担忧。
总的来说,在线 mock 平台是提高开发效率的好工具,但在选择使用时也需要考虑项目需求、团队协作模式以及安全性等因素。
总的来说就是不!推!荐!使用,所以直接放弃不学。