今天看啥  ›  专栏  ›  前端王睿

Mock.js——强大的后端数据模拟工具

前端王睿  · 简书  ·  · 2019-09-23 06:12

在我们日常开发中,虽然大多都是前后端分离的开发模式,但是还是会遇到一些前后端协调的问题。比如有时候前端页面已经开发好,后端接口却还在开发中,而我们有些样式又必须要有数据才能看效果,这时候该怎么办呢?

通常情况下,我们的做法是自己手动造一些假数据,但是当数据量大且需要考虑到各种极端情况时,这种自造假数据的方式显然不是最好的解决方法。那么,我们能不能让程序自己来随机产生一些符合一定规则的数据呢?

答案当然是肯定的。今天介绍的一款JS插件就是专门用来实现这个功能的,那就是 Mock.js ,它可以用来批量模拟后端数据,并且可以按照我们自己设定的规则来随机产生,非常强大和实用!


一、用法

Mock.js 有两种定义规范,一种是数据模板定义,另一种是数据占位符定义。

1. 数据模板定义

'name|rule': value

其中, name 属性名 rule 生成规则 (可选), value 属性值 。属性名和生成规则之间用 符号 | 隔开。

关于生成规则 rule ,我们可以结合 属性值的数据类型 来看。

① 字符串

1) 'name|min-max': string

通过重复 string 生成一个字符串,重复次数大于等于 min ,小于等于 max 。例如:

// JS代码
Mock.mock({
  "string|1-10": ""    // 重复n次,n为1~10
})
// 生成结果
{
  "string": ""  // 这个的个数是1-10之间(包括1和10)随机的
}
2) 'name|count': string

通过重复 string 生成一个字符串,重复次数等于 count 。例如:

// JS代码
Mock.mock({
  "string|3": ""  // 重复3次
})
// 生成结果
{
  "string": ""
}

② 数字

1) 'name|+1': number

属性值自动加 1,初始值为 number。例如:

// JS代码
Mock.mock({
  "number|+1": 202   // 初始值为202
})
// 生成结果
{
  "number": 202
}

上面这样的单个对象是看不出来自增效果的,但如果换成数组项的话就很清楚了,我们再看看这个例子:

// JS代码
Mock.mock({
  "list|6": [  // list为属性名,因为属性值为数组(后面会讲到),所以6代表数组项个数
    {
      "number|+1": 1   //  +1代表自增步长为1,属性值1代表从1开始自增
    }
  ]
})
// 生成结果
{
  list: [
    {"number": 1},
    {"number": 2},
    {"number": 3},
    {"number": 4},
    {"number": 5},
    {"number": 6}
  ]
}
2) 'name|min-max': number

生成一个大于等于 min、小于等于 max 的整数,属性值 number 仅用于确定类型。例如:

// JS代码
Mock.mock({
  "number|1-100": 100  // 生成1~100之间的随机数(包含1和100),属性值100仅用于确定值类型为数字
})
// 生成结果
{
  "number": 66  // 随机数
}
3) 'name|min-max.dmin-dmax': number

生成一个浮点数,整数部分大于等于 min、小于等于 max,小数部分保留 dmin 到 dmax 位,属性值 number 同样仅用于确定类型。例如:

// JS代码
Mock.mock({
  "number|1-100.1-10": 1  // 属性值1仅用于确定值为数字类型
})
// 生成结果
{
  "number": 4.315285424  //  整数部分为1~100之间随机数,小数部分位数为1~10之间随机数
}

当然还可能有另外两种情况:

'name|count.dmin-dmax': number
'name|min-max.dcount': number

其实情况大同小异,一个是整数部分固定而小数部分位数随机,另一个则是整数部分大小随机而小数部分位数固定。

我们只需牢记:

整数部分为固定值 → 整数部分就是该固定值
整数部分为范围(带符号 - ) → 整数部分就是该范围内的随机值
小数部分为固定值 → 小数部分的 位数 就是该固定值
小数部分为范围(带符号 - ) → 小数部分的 位数 就是该范围内的随机值

③ 布尔型

1) 'name|1': boolean

随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。例如:

// JS代码
Mock.mock({
  "boolean|1": true
})
// 生成结果
{
  "boolean": true   //  随机产生
}
2) 'name|min-max': boolean

随机生成一个布尔值,值为 boolean 的概率是 min / (min + max),值为 !boolean 的概率是 max / (min + max)。例如:

// JS代码
Mock.mock({
  "boolean|1-2": true  // 值为true的概率为1/3
})
// 生成结果
{
  "boolean": false
}

④ 对象

1) 'name|count': object

从属性值 object 中随机选取 count 个属性。例如:

// JS代码
Mock.mock({
  "object|2": {   //  随机选取2个属性
    "310000": "上海市",
    "320000": "江苏省",
    "330000": "浙江省",
    "340000": "安徽省"
  }
})
// 生成结果
{
  "object": {
    "320000": "江苏省",
    "340000": "安徽省"
  }
}
2) 'name|min-max': object

从属性值 object 中随机选取 min max 个属性。例如:

// JS代码
Mock.mock({
  "object|2-4": {   //  随机选取n个属性(n为2~4之间随机数)
    "110000": "北京市",
    "120000": "天津市",
    "130000": "河北省",
    "140000": "山西省"
  }
})
// 生成结果
{
  "object": {
    "120000": "天津市",
    "130000": "河北省",
    "140000": "山西省"
  }
}

⑤ 数组

1) 'name|1': array

从属性值 array 中随机选取 1 个元素,作为最终值。例如:

// JS代码
Mock.mock({
  "array|1": [   // 随机选 1 个
    "AMD",
    "CMD",
    "UMD"
  ]
})
// 生成结果
{
  "array": "CMD"
}
2) 'name|+1': array

从属性值 array 中顺序选取 1 个元素,作为最终值。例如:

// JS代码
Mock.mock({
  "array|+1": [   // 顺序选 1 个
    "AMD",
    "CMD",
    "UMD"
  ]
})
// 生成结果
{
  "array": "AMD"
}

这个和上面例子中的自增情况一样,只有在数组中才能体现顺序选择的效果。例如:

// JS代码
Mock.mock({
  "list|6": [
    {
      "array|+1": [
        "AMD",
        "CMD",
        "UMD"
      ]
    }
  ]
})
// 生成结果
{
  list: [
    {"array": "AMD"},
    {"array": "CMD"},
    {"array": "UMD"},
    {"array": "AMD"},
    {"array": "CMD"},
    {"array": "UMD"}
  ]
}
3) 'name|min-max': array

通过重复属性值 array 生成一个新数组,重复次数大于等于 min,小于等于 max。例如:

// JS代码
Mock.mock({
  "array|1-10": [   // 生成的数组项个数在1~10之间随机
    "Mock.js"
  ]
})
// 生成结果
{
  "array": [
    "Mock.js",
    "Mock.js",
    "Mock.js",
    "Mock.js",
    "Mock.js"
  ]
}
4) 'name|count': array

通过重复属性值 array 生成一个新数组,重复次数为 count 。例如:

// JS代码
Mock.mock({
  "array|3": [  // 生成的数组项个数固定为3
    "Mock.js"
  ]
})
// 生成结果
{
  "array": [
    "Mock.js",
    "Mock.js",
    "Mock.js"
  ]
}

⑥ 函数

'name': function

执行函数 function,取其返回值作为最终的属性值,函数的上下文为属性 'name' 所在的对象。例如:

// JS代码
Mock.mock({
  'foo': 'Syntax Demo',
  'name': function() {
    return this.foo
  }
})
// 生成结果
{
  "foo": "Syntax Demo",
  "name": "Syntax Demo"
}

⑦ 正则表达式

'name': regexp

根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串。例如:

// JS代码
Mock.mock({
    'regexp1': /[a-z][A-Z][0-9]/,
    'regexp2': /\w\W\s\S\d\D/,
    'regexp3': /\d{5,10}/
})
// 生成结果
{
    "regexp1": "pJ7",
    "regexp2": "F)\fp1G",
    "regexp3": "561659409"
}

2. 数据占位符定义

@占位符
@占位符(参数 [, 参数])

数据占位符的种类有很多,可用于随机生成各种类型的数据。例如:

Mock.mock('@boolean')   //  随机生成布尔值
Mock.mock('@natural(60, 100)')   //  随机60~100之间的自然数
Mock.mock('@integer')   //  随机生成整数
Mock.mock('@date')  //  随机生成日期

还有很多很多,这里限于篇幅就不详细罗列了,具体详见→ Mock官网

二、两种规范的综合运用

在实际项目中通常两种规范我们都会用到,下面我们来使用 Mock.js 生成一个用户信息列表。

1. HTML部分

首先先创建表格,目前只包含表头部分

<table class="table">
  <tr>
    <th>姓名</th>
    <th>年龄</th>
    <th>性别</th>
    <th>生日</th>
    <th width="300">简介</th>
    <th>Email</th>
    <th>博客</th>
    <th>住址</th>
  </tr>
</table>

2. 引入Mock.js

<script src="scripts/mock-min.js"></script>

3. 生成用户列表数据

let people = Mock.mock({
  'data|20': [   // 生成20组数据
    {
      'name': '@cname',   // 中文姓名
      'age|0-120': 1,  // 年龄,范围为0~120岁
      'sex': '@cword("男女")',  // 性别,从字符串“男女”中随机选一个字
      'birthday': '@date',  // 生日,默认格式为“yyyy-MM-dd”
      'description': '@csentence(10,100)',  // 简介,字数在10~100之间的中文句子
      'email': '@email',  // Email地址
      'blog': '@url',  // 个人博客链接
      'address': '@county(true)'   // 住址,格式为“省 市 区县”
    }
  ]
});

4. 将数据添加至表格中

let trs = people.data.map(person => {
  let tr = '<tr>';
  for(let item in person){
    tr += '<td>' + person[item] + '</td>';
  }
  tr += '</tr>';
  return tr;
}).join('');

document.querySelector('.table').innerHTML += trs;

当然,由于是虚拟数据,所以并没有把年龄和生日联系在一起,这都是次要的,关键是我们已经把这样一个数据结构成功模拟出来了。


重点总结

① 数据模板定义规范生成的数据均为对象类型,而数据占位符定义规范生成的数据可以是单纯的字符串、数字和布尔型等基本数据类型。
② 字符串玩的是重复;数字玩的是自增和随机,整数随机的是值,小数随机的是位数;布尔型再随机也就真假俩值;对象随机的是属性个数;数组玩的是随机、顺序和重复;函数返回啥就是啥;正则反向匹配生成字符串。




原文地址:访问原文地址
快照地址: 访问文章快照