Mock.js:一款用于生成模拟数据的 JavaScript 库

Mock.js:一款用于生成模拟数据的 JavaScript 库

Mock.js 是一款用于生成模拟数据的 JavaScript 库,主要用于前端开发中模拟后端接口返回的数据,解决 “前端开发时后端接口未就绪” 的问题,提高前端开发效率。其核心特点是支持随机生成各种格式的数据,并能拦截 Ajax 请求,返回模拟响应,无需依赖真实后端服务。

一、核心功能

  1. 生成随机数据支持生成文本、数字、日期、图片、地址、姓名等常见数据类型,且可自定义规则(如长度、范围、格式)。

  2. 拦截 Ajax 请求无需修改原有代码,即可拦截 XMLHttpRequest 或 fetch 请求,返回预设的模拟数据,模拟后端接口响应。

  3. 数据模板定义通过简洁的语法定义数据结构模板,支持嵌套、关联数据生成(如根据用户 ID 生成对应的订单信息)。

  4. 扩展能力可自定义随机数据生成函数,满足特定业务场景(如生成符合规则的手机号、身份证号)。

二、安装与引入

1. 浏览器直接引入

<!-- 引入 Mock.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/Mock.js/1.0.1-beta3/mock-min.js"></script>

2. Node.js 或前端工程化项目

# 安装依赖
npm install mockjs --save-dev

引入:

const Mock = require('mockjs'); // CommonJS
// 或 ES6 模块
import Mock from 'mockjs';

三、基础语法与数据生成

Mock.js 生成数据的核心是 Mock.mock() 方法,其语法为:Mock.mock(template) 或 Mock.mock(rurl, rtype, template)(拦截请求时)。

1. 基本数据类型生成

(1)随机文本
// 生成指定长度的随机字符串
const text1 = Mock.mock({
  "string|5": "★" // 重复 "★" 5 次 → "★★★★★"
});

// 生成随机汉字(长度 3-5)
const text2 = Mock.mock({
  "string|3-5": "中" // 生成 3-5 个 "中" → 如 "中中中"
});

// 生成随机标题(1-3个词)
const title = Mock.mock({
  title: "@ctitle(1,3)" // @ctitle 是内置占位符,生成中文标题
});
(2)随机数字
const num = Mock.mock({
  "number1|1-100": 1, // 1-100 之间的整数 → 如 42
  "number2|1-100.2-5": 1, // 1-100 之间的小数,保留 2-5 位 → 如 36.729
  "number3|+1": 100 // 自增 1 → 100, 101, 102...(多次调用时)
});
(3)随机日期时间
const date = Mock.mock({
  date1: "@date", // 日期 → 如 "2023-08-15"
  date2: "@time", // 时间 → 如 "14:30:25"
  date3: "@datetime", // 日期时间 → 如 "2023-08-15 14:30:25"
  date4: "@now('yyyy-MM-dd HH:mm:ss')" // 自定义格式
});
(4)随机布尔值
const bool = Mock.mock({
  "bool|1": true // 50% 概率为 true,50% 为 false
});
(5)图片
const image = Mock.mock({
  img: "@image('200x100', '#50B7C1', '#FFF', 'Mock.js')" 
  // 生成 200x100 的图片,背景色 #50B7C1,文字 #FFF,内容 "Mock.js"
});
(6)姓名、地址等
const user = Mock.mock({
  name: "@cname", // 中文姓名 → 如 "张三"
  id: "@id", // 身份证号 → 如 "110101199001011234"
  phone: "@phone", // 手机号 → 如 "13812345678"
  address: "@city(true)", // 完整地址(省+市)→ 如 "江苏省南京市"
  email: "@email" // 邮箱 → 如 "zhangsan@example.com"
});

2. 复杂数据结构(对象、数组)

(1)对象
const user = Mock.mock({
  id: "@id",
  name: "@cname",
  age: "@integer(18, 60)", // 18-60 岁
  "gender|1": ["男", "女"], // 随机选择数组中的值
  isVip: "@boolean",
  regTime: "@datetime"
});
console.log(user);
// 输出示例:
// {
//   id: "620000199507151234",
//   name: "李四",
//   age: 32,
//   gender: "男",
//   isVip: false,
//   regTime: "2023-01-15 08:30:45"
// }
(2)数组
// 生成 3-5 个用户的数组
const userList = Mock.mock({
  "list|3-5": [{ // 数组长度 3-5
    id: "@id",
    name: "@cname",
    "score|80-100": 1 // 80-100 分
  }]
});
console.log(userList.list); // 数组形式的用户列表

3. 自定义数据模板(高级)

(1)关联数据
const order = Mock.mock({
  "orderId|100000-999999": 1, // 订单号
  userId: "@id", // 用户 ID
  userName: "@cname", // 用户名(与 userId 无实际关联,仅模拟)
  "amount|100-10000.2": 1, // 订单金额
  "status|1": ["待支付", "已支付", "已取消"],
  createTime: "@datetime",
  // 嵌套数组:订单商品列表(2-4 件)
  "products|2-4": [{
    "productId|1000-9999": 1,
    "productName": "@ctitle(3, 6)",
    "price|50-500.2": 1,
    "num|1-5": 1 // 购买数量
  }]
});
(2)自定义函数

通过 Mock.Random.extend() 扩展自定义随机数据生成规则:

// 扩展:生成指定格式的学号(如 "2023001")
Mock.Random.extend({
  studentId: function() {
    const prefix = "2023"; // 年份前缀
    const num = Mock.Random.integer(1, 999); // 1-999 的序号
    return prefix + num.toString().padStart(3, "0"); // 补零至 3 位
  }
});

// 使用自定义规则
const student = Mock.mock({
  id: "@studentId", // 调用自定义占位符
  name: "@cname"
});
console.log(student.id); // 如 "2023045"

四、拦截 Ajax 请求

Mock.js 可拦截前端的 Ajax 请求(如 XMLHttpRequestfetch,或 jQuery、Axios 等库的请求),返回模拟数据,无需后端接口即可测试。

1. 基本用法

语法:Mock.mock(rurl, rtype, template|function(option))

  • rurl:匹配请求的 URL(支持字符串、正则)。
  • rtype:请求方法(GET/POST/PUT/DELETE 等)。
  • template:数据模板或返回数据的函数。
示例:拦截 GET 请求
// 拦截 /api/users 的 GET 请求,返回模拟用户列表
Mock.mock("/api/users", "get", {
  "code": 200,
  "message": "success",
  "data|5-10": [{ // 5-10 条用户数据
    "id|+1": 1, // 自增 ID
    "name": "@cname",
    "age|18-60": 1,
    "email": "@email"
  }]
});

// 前端发送请求(以 Axios 为例)
axios.get("/api/users").then(res => {
  console.log(res.data); // 接收 Mock 返回的模拟数据
});
示例:拦截 POST 请求(带参数)
// 拦截 /api/login 的 POST 请求,根据参数返回不同结果
Mock.mock("/api/login", "post", function(option) {
  // option 包含请求参数:{ url, type, body }
  const { username, password } = JSON.parse(option.body);
  
  // 模拟登录逻辑
  if (username === "admin" && password === "123456") {
    return {
      code: 200,
      message: "登录成功",
      data: { token: "@string(32)", user: { name: username } }
    };
  } else {
    return { code: 401, message: "用户名或密码错误" };
  }
});

// 前端发送登录请求
axios.post("/api/login", { username: "admin", password: "123456" })
  .then(res => console.log(res.data));

2. 取消拦截

若需要关闭 Mock 拦截(如后端接口就绪后),可调用:

Mock.restore(); // 清除所有拦截规则

五、常用占位符(内置)

Mock.js 提供了大量内置占位符(以 @ 开头),简化数据生成:

类别示例说明
基础@integer(1, 100)随机整数
文本@cparagraph(2, 4)2-4 段中文段落
姓名@cname中文姓名
日期@date('yyyy年MM月dd日')自定义格式日期
网络@url随机 URL
图片@image('300x200')300x200 的图片 URL
地址@county(true)省 + 市 + 县
ID@guid全局唯一标识符

完整列表可参考 Mock.js 官方文档

六、适用场景

  1. 前端独立开发后端接口未完成时,用 Mock.js 模拟数据,提前进行页面渲染、交互逻辑开发。

  2. 测试数据生成快速生成大量符合规则的测试数据(如用户列表、订单数据),用于功能测试。

  3. 演示原型在产品原型或 Demo 中展示动态数据,提升演示效果。

  4. 隔离前后端依赖前端无需等待后端接口,并行开发,提高团队协作效率。

七、注意事项

  1. 生产环境移除Mock.js 仅用于开发 / 测试环境,上线前需确保移除相关代码,避免拦截真实接口。

  2. 数据关联性Mock 生成的关联数据(如 userId 与 userName)是模拟的,无实际业务关联,复杂场景需手动处理。

  3. 兼容性对 fetch 的拦截支持需额外配置(Mock.js 原生优先支持 XMLHttpRequest)。

总结

Mock.js 是前端开发中高效的模拟数据工具,通过简洁的语法生成各种随机数据,并能拦截请求返回模拟响应,解决了前后端开发不同步的问题。掌握其数据模板定义和请求拦截功能,可显著提升前端开发效率,减少对后端的依赖。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canjun_wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值