背景
在项目开发过程中时常会遇到这样一种情况,需求下来以后,前后端并行开发,由于页面中的数据来自后端,后端接口又处于开发中,阻碍了前端开发,为了解决这个问题,需求下来后,前后端
先约定好数据结构
后,在按照约定好的数据结构进行开发,这样前端只需一个本地服务,模拟返回约定好的数据结构。下面通过
mock-service-plugin
这个插件来搭建一个mock服务
mock-service-plugin 工作流程
- mock 服务初始化
-
找到指定的
mocks
文件夹,遍历
mocks
文件夹下所有
.json
文件,并读取文件内容 - 将请求发送到 mock 服务器
-
mock service 服务收到请求,根据请求URL,匹配
.json
文件内容中的
@url
字段的URL - 匹配成功,通过 mockjs 将数据包装后响应
优势
- 兼容 webpack 4/5
- 兼容 常见框架 Vue/React
- 支持 restful api 规范
- 使用简单易与项目集成
使用示例项目
构建 mock 服务
Vue 构建 mock 服务
-
安装
mock-service-plugin
npm i mock-service-plugin --save-dev
-
项目根目录下创建 mock 数据文件夹
mocks
如下图
-
mock-service-plugin
初始化配置// vue.config.js const MockServicePlugin = require('mock-service-plugin'); module.exports = { configureWebpack: { plugins: [ // 初始化插件 new MockServicePlugin({ path: path.join(__dirname, './mocks'), // mock数据存放在 mocks 文件夹中 port: 9090 // 服务端口号 }) ] } }
-
在
mocks
文件夹下创建一个
data.json
文件
-
在 刚创建的
data.json
中添加如下数据/** * @url /login */ { "code": 404, "data|5-10": [ { "name": "@cname", "id": "@guid", "email": "@email" } ], "message": "success" }
约定规范:
-
以获取用户信息接口为例(
www.example.com/user/datail/id
), -
通常会把
www.example.com
作为
baseUrl
-
user/detail/id
作为接口名称 -
头部注释中的
@url
字段是必须的, -
当请求发送到 mock 服务器上时, mock 服务会遍历
mocks
文件夹下所有的
.json
文件, -
将请求url与头部注释 @url 中的字段匹配, 匹配成功返回
json
中的数据
-
以获取用户信息接口为例(
-
添加好以上信息后重启项目 (注意控制台输出)
-
在浏览器中打开
http://localhost:9090
-
点击左侧列表中
/login
-
如果看到上面的页面说明我们 mock 服务搭建成功了,接下来只要把请求发送到 mock 服务器上就可以了下面我们来实现下吧
-
将请求发送到
http://localhost:9090
, 在
vue.config.js
中配下代理 就可以了// 配置代理 devServer: { // 应用端口,避免与mock服务端口冲突 port: 3000, proxy: { '/api': { target: 'http://localhost:9090/', pathRewrite: { // 设置url的重写, 实际过程如下: // http://localhost:5001/api/getData -> http://localhost:3000/getData '^/api': '' } } } }
-
设置 axios 的
baseUrl
为
api
就可以了 这一步很简单,把我的配置贴在下面,根据实际情况自行调整哈
-
在项目中使用
-
在页面上测试下
-
Vue项目的mock服务就搭建完成了
React 构建 mock 服务
CRA 官方并没有开放Webpack的配置,有两种解决方式,第一种弹出webpack配置,第二种社区适配方案,社区适配方案主流有两种
craco
与
customize-cra
因为这两种方式都有人用,分别介绍下,建议将 Vue 配置教程详细阅读一遍,主要看配置流程,原理其实都一样
安装 mock-service-plugin
npm i mock-service-plugin --save-dev
craco 配置
// craco.config.js
import path from 'path';
import { whenDev } from '@craco/craco';
// mock 插件
import MockServicePlugin from 'mock-service-plugin';
const {
REACT_APP_ENV, // 环境标识
} = process.env;
const pathResolve = (pathUrl) => path.join(__dirname, pathUrl);
module.exports = {
webpack: {
plugins: [
...whenDev(
() => [
// 配置mock服务
new MockServicePlugin({
path: path.join(__dirname, './mocks'),
port: 9090,
}),
],
[],
),
],
},
devServer: {
proxy: {
"/mock": {
secure: false,
ws: false,
target: `http://localhost:9090`,
changeOrigin: true,
pathRewrite: {
"^/mock": '',
},
},
},
},
};
customize-cra 配置
// config.overrides.js
const path = require('path');
const {
override, // 覆盖函数
addWebpackAlias, // 别名配置
addLessLoader, // less loader
fixBabelImports, // babel 导入 引入antd-mobile
addWebpackPlugin, // 增加插件
} = require('customize-cra');
// mock 插件
const MockServicePlugin = require('mock-service-plugin');
const {
REACT_APP_ENV, // 环境标识
} = process.env;
/**
* @description: 路径 处理
* @param {String} pathUrl
* @return {String} path
*/
const pathResolve = (pathUrl) => path.join(__dirname, pathUrl);
// override
module.exports = {
webpack: override(
addWebpackPlugin(
// 配置mock服务
new MockServicePlugin({
path: path.join(__dirname, './mocks'),
port: 9090,
}),
),
(config) => {
return config;
},
),
devServer: (configFunction) => (proxy, allowedHost) => {
proxy = {
"/mock": {
secure: false,
ws: false,
target: `http://localhost:9090`,
changeOrigin: true,
pathRewrite: {
"^/mock": '',
},
},
};
return configFunction(proxy, allowedHost);
},
};
好啦, mock 服务配置好了,启动项目试试吧
webpack 通用配置
在工程目录中增加一个
mocks
文件夹
.
├── app //工程目录
├── dist
├── config
├── src
├── mocks //mock数据目录
| ├── data.js
| ├── data.json
...
在
webpack.config.js
中,配置 proxy 和 mock-service-plugin
// 引入插件
const MockServicePlugin = require("mock-service-plugin");
// webpack 配置
module.exports = {
// 配置插件
plugins: [
// 插件的功能是根据配置文件,起一个指定端口的server,将接口请求指向json文件
new MockServicePlugin({
// mock数据的存放路径
path: path.join(__dirname, "./mocks"),
// 配置mock服务的端口,避免与应用端口冲突
port: 3000,
}),
],
// 配置代理,这里的代理为webpack自带功能
devServer: {
// 应用端口,避免与mock服务端口冲突
port: 5001,
proxy: {
// 配置匹配服务的url规则,以及其代理的服务地址,即mock服务的地址
"/": "http://localhost:3000/",
},
},
};
如果想要给 mock 服务指定 URL 前缀,你可以在 webpack 的 proxy 设置进行如下配置:
...
module.exports = {
...
// 配置代理,这里的代理为webpack自带功能
devServer: {
// 应用端口,避免与mock服务端口冲突
port: 5001,
proxy: {
'/api': {
target: 'http://localhost:3000/',
pathRewrite: {
// 设置url的重写, 实际过程如下:
// http://localhost:5001/api/getData -> http://localhost:3000/getData
'^/api': ''
}
}
}
}
};