了解更多请访问http://mockjs.com/
一、为什么要使用Mock.js
对于前后端分离的项目,后端工程师的 API 数据迟迟没有上线,而前端工程师却没有 JSON 数据进行数据填充,自己写后端模拟又太繁重,这个时候,Mock.js 就能解决这个问题,让前端工程师更加独立做自己;
二、什么是Mock.js
- 生成随机数据,拦截 Ajax 请求。
- 通过随机数据,模拟各种场景;不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据;
- 支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等;
- 支持支持扩展更多数据类型,支持自定义函数和正则。
- 非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型。
三、开始&安装
安装方式,提供两种常用的,一种在 node 下运行,另一种在浏览器下运行;
1、使用npm安装(不了解的可以先学习一下node.js)
npm install mockjs
应用
// 引入 mockjsconst Mock = require('mockjs')const data = Mock.mock({// 属性 list 的值是一个数组,其中含有 1 到 10 个元素'list|1-10': [{// 属性 id 是一个自增数,起始值为 1,每次增 1'id|+1': 1}]})// 输出结果console.log(JSON.stringify(data, null, 4))
2、直接使用script标签引入
<script src="http://mockjs.com/dist/mock.js"></script>
应用
<script src="http://mockjs.com/dist/mock.js"></script><script>const data = Mock.mock({'list|1-10' : [{'id|+1' : 1}]})console.log(data)console.log(JSON.stringify(data , null , 4))</script>
四、使用方式&语法规范
Mock.js 的语法规范包括两个部分:
1、数据模板定义规范
2、数据占位定义规范
1、数据模板定义规范
数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值
// 属性名 name// 生成规则 rule// 属性值 value'name|rule': value
注意:
- 属性名 和 生成规则 之间用竖线
|分隔。- 生成规则 是可选的。
- 生成规则 有 7 种格式:
其中,字符串、数值有 7 种生成规则,具体如表说明:
| 生成规则 | 说明 | 示例 |
|---|---|---|
| min-max | 生成 min ~ max之间的字符串 | ‘list | 1-10’ |
| count | 生成count个字符串 | ‘list | 5’ |
| min-max.dmin-dmax | 生成min ~ max之间的浮点数,小数点位数在dmin ~ dmax 之间 | ‘id | 1-10.1-3 ‘ : 1 |
| count.dcount | 生成count个字符串小数点位数为dcount | ‘id | 8.2 ‘ : 1 |
| min-max.dcount | //同上 | ‘id | 1-10.5’ |
| count.dmin-dmax | //同上 | ‘id | 5.1-10’ |
| +step | 每次进行累加 | ‘id | +1’ : 1 |
除了以上几种规则格式,还有布尔值、对象和数组等规则:
| 生成规则 | 说明 | 示例 |
|---|---|---|
| 布尔值 | 生成布尔值,1/2概率为true | ‘flag | 1’ : true |
| 布尔值 min-max | 生成布尔值,概率为min/(min + max) | ‘flag | 1-10’ : true |
| 对象count | 从对象中随机抽取count个属性 | ‘obj | 2’ : obj |
| 对象min-max | 从对象中随机抽取min - max个属性 | ‘obj | 1-3’ : obj |
| 数组1 | 获取一次数组 | ‘arr | 2’ : arr |
| 数组count | 重复count次组成新数组 | ‘arr | 2’ : arr |
| 数组+1 | 累加 | ‘arr | +1’ : arr |
| 数组min-max | 重复 min-max 次组成新数组 | ‘arr | 1-2’ : arr |
也支持函数和正则表达式:
| 生成规则 | 说明 | 示例 |
|---|---|---|
| 函数 | 支持函数 | ‘fn | 1’ : function |
| 正则 | 支持正则 | ‘reg | 1’ : /[a-z]/ |
应用
const Mock = require('mockjs')const obj = {name : 'Mr.Lon',age : 18,gender : '男'}const arr = ['a','b','c','d']const data = Mock.mock({'list|1-10' : [{// 'id|+1' : 1// 'id|1-10' : 1// 'number1|1-10.1-3': 1,// 'flag|1' : true// 'obj|1-3' : obj// 'arr|1-2' : arr// 'fn' : function(){// return '这是一个函数';// }'reg' : /[a-z]/}]})console.log(data);console.log(JSON.stringify(data,null,4))
2、数据占位符定义规范
- 占位符只是在属性值字符串中占个位置,并不出现在最终的属性值中。
- 通过 ‘@占位符’ 这种方式来随机产生各种不同的数据;
有两种方式可以输出这种随机占位符,具体如下:
const Mock = require('mockjs')//第一种输入占位符的方式console.log(Mock.Random.cname());//第二种输入占位符的方式console.log(Mock.mock('@cname'));
注意:
- 用
@来标识其后的字符串是 占位符。- 占位符 引用的是
Mock.Random中的方法。- 通过
Mock.Random.extend()来扩展自定义占位符。- 占位符 也可以引用 数据模板 中的属性。
- 占位符 会优先引用 数据模板 中的属性。
- 占位符 支持 相对路径 和 绝对路径。
Mock.Random 是一个工具类,用于生成各种随机数据。
Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) 。
Mock.Random 提供的完整方法(占位符)如下:
| Type | Method |
|---|---|
| Basic | boolean, natural, integer, float, character, string, range, date, time, datetime, now |
| Image | image, dataImage |
| Color | color |
| Text | paragraph, sentence, word, title, cparagraph, csentence, cword, ctitle |
| Name | first, last, name, cfirst, clast, cname |
| Web | url, domain, email, ip, tld |
| Address | area, region |
| Helper | capitalize, upper, lower, pick, shuffle |
| Miscellaneous | guid, id |
应用
const Mock = require('mockjs')//随机中文人名,不带 c 就是英文console.log(Mock.mock('@cname'));//随机 IDconsole.log(Mock.mock('@id'));//随机中文标题,不带 c 就是英文console.log(Mock.mock('@ctitle'));//随机颜色,十六进制console.log(Mock.mock('@color'));//随机图片,给你一个图片地址console.log(Mock.mock('@image'));//随机 ip 地址console.log(Mock.mock('@ip'));//随机 url 地址console.log(Mock.mock('@url'));//随机字符串console.log(Mock.mock('@string'));//随机数值console.log(Mock.mock('@integer'));//随机日期console.log(Mock.mock('@datetime'));const data = Mock.mock({'list|1-10' : [{cname : '@cname',city : '@city',full : '@cname -- @city'}]})console.log(data);console.log(JSON.stringify(data, null, 4));
扩展
如果没有我们想要的数据格式进行填充,可以使用扩展功能自己扩展
const Mock = require('mockjs')// 自行拓展占位符Mock.Random.extend({game(){return this.pick(['英雄联盟','穿越火线','QQ飞车','生化危机','寂静岭','逃生'])}})console.log(Mock.mock('@game'))
3、mock拦截 axios
这个也是最终的需求功能,我们假设 axios 异步请求的数据尚未上线或不全;
我们可以通过 mock 请求拦截,随机生成填充的数据进行前端设计;
<script src="http://mockjs.com/dist/mock.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>//Mock拦截Mock.mock('https://jsonplaceholder.typicode.com/posts/1',{'list|1-10' : [{'userId|1' : 1,'id|+1' : 1,'title' : '@ctitle','body' : '@sentence'}]});// request请求 通用axios.request({method : 'get',url : 'https://jsonplaceholder.typicode.com/posts/1'}).then(res => console.log(res.data));</script>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号