我学会了,Mockjs

简介: Mock.js**模拟数据**的强大,相信不少朋友都能感受到,它帮助我们更快地“模拟”我们所要各种数据。那么,它怎么知道我们需要什么内容的数据嘞?它又是如何工作的?在这篇文章里,我们一起来看看。

MockJS介绍

mockjs是一款用于模拟随机数据、模拟ajax请求的工具,它的用法简单,模拟数据的种类丰富,一目了然,可用性强、易用性好。

可以让前端开发者可以独立于后端开发者来进行开发。


官网的文档不是很好用,可以使用我自己复刻的doc

下面快速门中的案例可以到我自己复刻的doc中玩一玩。点击标记中的区域或者打开控制台输入代码回车。

快速入门

先安装、再引入、之后调用Mockjs中的方法,它支持两种使用方式:数据模板定义、数据占位符定义。同时它也支持请求的拦截、数据和模板的校验等。

  • 数据模板定义:用Mockjs中内置模板字符串规则来配合Mockjs的mock方法来生成数据,通常它们并不是那么好理解,得结合源码里的实现来理解。
  • 数据占位符定义:直接使用Mockjs中的各种模板占位符和各种模拟数据的API方法来生成数据。
  • 请求的拦截:源码中是劫持了原生的请求对象,然后中间做了一层代理,在这个代理层实现了Mock.js自己的请求对象,然后拦截url等,最后返回你自定义的结果。
import Mock from 'mockjs'

// 数据模板定义的方式
Mock.mock({
  "star|3-5": "⭐",
  
  "size|1-10": 10,
  
  "isOk|1": true,
  
  "object|2": {
       "test1": '测试1',
       "test2": '测试2',
       "test3": '测试3',
  },
          
  "array|1": [
          "one",
          "two",
          "three",
   ],
  
  "who": "我",
   "谁": function () {
     return this.who;
   },
   
   "username": /[a-zA-Z]{1,}[0-9@_]/,
   "password": /[a-zA-Z-0-9_]{6,18}/,
   "path": {
        name: 'test',
        age: 18,
        obj: {
          name: 'fest',
          age: 17,
          boyfriend: '@/path/name',
          boyfriendAge: '@../age'
        }
   }
})

// 数据占位符

// Basic 基础
/**
    boolean
    natural
    integer
    float
    character
    string
    range
*/

// Date 时间
/**
    date
    time
    datetime
    now
*/

// Image 图片
/**
    image
    dataImage
*/

// Color 颜色
/**
     color
     hex
     rgb
     rgba
     hsl
*/

// Text 文本
/**
    paragraph
    sentence
    word
    title
    cparagraph
    csentence
    cword
    ctitle
*/

// Name 姓名
/**
    first
    last
    name
    cfirst
    clast
    cname
*/

// Web 网站
/**
    url
    domain
    protocol
    tld
    email
    ip
*/

// Address 地址
/**
    region
    province
    city
    county
    zip
*/

// Helper 帮助
/**
    capitalize
    upper
    lower
    pick
    shuffle
*/

// Miscellaneous 混淆
/**
    guid
    id
    increment
*/

// 请求的拦截

/**
第一步:先调用`Mock.setup`这个方法,这个方法中会去劫持原生的请求对象
第二步:调用`Mock.mock(url, ...)`这个方法,这个方法如果第一个参数不是一个对象,就会进行url拦截。
*/
Mock.setup({
  timeout: 500,
  // timeout: '500-800'
})

// Mock.mock( rurl, template )
// Mock.mock( rurl, function( options ) )
// Mock.mock( rurl, rtype, template )
// Mock.mock( rurl, rtype, function( options ) ),options中包含 url、type 和 body

mockjs是与window.XMLHttpRequest强相关的,如果你使用的浏览器的window.fetch,那mockjs不会去拦截的,你可以通过使用 mockjs-fetch,然后MockFetch(Mock) 一下,Mock就可以支持fetch的拦截。
mockjs拦截并自定义处理过后的请求,不会在浏览器开发工具中的NetWork中显示,因为那个请求没有真正发送出去。

解决的问题

  • 前后端分离:让前端攻城师独立于后端进行开发。
  • 增加单元测试的真实性:通过随机数据,模拟各种场景。
  • 开发无侵入:不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据。
  • 用法简单:符合直觉的接口。
  • 数据类型丰富:支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。
  • 方便扩展:支持支持扩展更多数据类型,支持自定义函数和正则。

使用习惯

一般都是纯前端的使用,mock数据呀,请求的拦截和响应的重写呀,这种使用方式非常的普遍。

当然也可以用作后端数据接口的使用,可以结合webpack-devServer来使用,比如在vue-cli中的devServer中的before中插入一个server-mock模块,在express中使用mockjs来模拟接口所需的数据,非常的nice。

纯前端的案例

这是一个纯前端增删改查的案例

import Mock from ’mockjs‘;

const GET = 'GET';
const POST = 'POST';
const DELETE = 'DELETE';
const PUT = 'PUT';

// ! 新增一个汽车
Mock.mock('/api/addCar', POST,function(config) {
  console.dir(config);
  const { carName, carNo, carImg } = config.data;
  return Mock.mock({
    code: 200,
    msg: 'success',
    data: {
        carID: Mock.mock('@id()'),
        carName,
        carNo,
        carImg
    }
  })
})

// !查看汽车列表
Mock.mock('/api/carList', GET,function(config) {
  console.dir(config);
  return Array(Mock.mock('@integer(50,100)')).fill(1).map(()=>{
    return Mock.mock({
      carID: Mock.mock('@id()'),
      'carName|1': [
        '奥迪4个圈',
        '海神三叉戟',
        '大牛向前冲',
        '野马奔奔奔'
      ],
      carName: 
      carNo: Mock.mock('@guid()'),
      carImg: Mock.mock('@image("270x120", "#a0ffff", "#ffa0ff", "png", "车")'),
    })
  })
})

// ! 删除汽车
Mock.mock('/api/deleteCar/6',DELETE,function (config) {
  console.dir(config);
  // 当id为number时可以这么做
  let result = /\/api\/deleteCar\/(\d+)/.exec(config.url)
  let carID = Number(result[1])
  return Mock.mock({
    code: 200,
    msg: carID + ' delete success!',
  })
})

// !更新汽车
Mock.mock('/api/updateCar', PUT, function (config) {
  console.dir(config);
  const { carID, carName, carNo, carImg } = config.data;
    return Mock.mock({
      code: 200,
      msg: 'success',
      data: {
          carID,
          carName,
          carNo,
          carImg
      }
    })
})

TEST

浏览器的fetch API测试

// addCar
fetch('http://127.0.0.1:8080/api/addCar', {
    method: 'post',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
    "carName": "红牛",
    "carNo": "沪·61888",
    "carImg": "xxxx"
    })
})
    .then(response => console.log(response));


// carList
fetch('http://127.0.0.1:8080/api/carList').then(response => console.log(response));


// deleteCar
fetch('http://127.0.0.1:8080/api/deleteCar/6', {
    method: 'delete'
})
    .then(response => console.log(response));


// updateCar
fetch('http://127.0.0.1:8080/api/addCar', {
    method: 'put',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
    "carID": "6",
    "carName": "红牛",
    "carNo": "沪·61888",
    "carImg": "xxxx"
    })
})
    .then(response => console.log(response));

REST Client 工具测试,RESTful API 风格的测试

### 测试新增汽车接口
POST http://127.0.0.1:8080/api/addCar HTTP/1.1
Content-Type: application/json

{
    "carName": "红牛",
    "carNo": "沪·61888",
    "carImg": "xxxx"
}

### 测试查看汽车列表
GET http://127.0.0.1:8080/api/carList HTTP/1.1
Content-Type: application/json

{}


### 测试删除汽车
DELETE http://127.0.0.1:8080/api/deleteCar/6 HTTP/1.1
Content-Type: application/json

{}


### 测试更新汽车
DELETE http://127.0.0.1:8080/api/updateCar HTTP/1.1
Content-Type: application/json

{
    "carID": "6",
    "carName": "红牛",
    "carNo": "沪·61888",
    "carImg": "xxxx"
}

前后端结合的案例

开源项目地址:https://github.com/aiyoudiao/aiyou-server-mock

配置代码

'use strict'
const port = 19999

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  
  // webpack-dev-server 相关配置
  devServer: {
    port: port,
    open: true,
    compress: true,
    disableHostCheck: true,
    overlay: {
      warnings: false,
      errors: true
    },
    before: require('./server-mock/server.js')
  },
}

工程目录

原理剖析

先克隆一份mockjs的源码到本地,mockjs工程化相对来说比较老旧,是基于Grunt来进行构建的,不过代码风格挺不错。

源码的入口是./src/mock.js,里面的代码也比较的清晰,数据模板定义的处理都放在mock.js中,而数据占位符定义的处理
都放在同级目录下的random.js中。请求拦截的处理都放在mockjax.js中,直接拦截XMLHttpRequest|ActiveXObject,这部分代码在同级目录下的xhr.js中。

mokc.js的代码并不是很复杂,通过看这篇文章学会了它的使用后,可以下载它的源码进行阅读,都会用了,再去读源码就不会很难。
目录
相关文章
|
安全
Portraiture最新v3.5.6版本安装许可证密钥
Portraiture 3中文版切换教程 PS版智能磨皮去瑕疵
19486 0
|
3月前
|
JSON API 数据安全/隐私保护
【干货满满】电商平台API接口调用脚本应该如何调试
电商平台API调试复杂,涉及签名加密、动态参数、反爬机制及复杂业务逻辑。调试需兼顾技术正确性与业务合规性。本文提供系统化调试方案,涵盖调试前准备、分阶段调试、高级技巧与注意事项,助你高效定位参数、签名、反爬等问题,提升调试效率。
|
11月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
781 13
ly~
|
缓存 监控 安全
反向代理服务器的常见故障有哪些?
反向代理服务器常遇到的故障包括配置错误、网络问题、性能瓶颈及安全漏洞。配置相关故障如错误监听端口、域名配置不当及代理转发规则错误,可使用`netstat -tuln`检查端口状态,并验证域名及DNS解析。网络故障涉及连接中断和带宽不足,利用`ping`和`traceroute`检测连通性,用`iftop`监控带宽。性能问题如资源耗尽和缓存不一致需通过`top`监控资源使用,并检查缓存策略。安全故障包括DDoS攻击和配置漏洞,应使用流量分析工具检测异常并加强安全配置,确保SSL/TLS加密和访问控制策略正确无误。
ly~
763 3
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的报价与报价管理模块解析
【7月更文挑战第25天】 ERP系统中的报价与报价管理模块解析
1019 3
|
机器学习/深度学习 JavaScript 前端开发
JavaScript 深度学习(二)(2)
JavaScript 深度学习(二)
246 1
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
1138 1
|
算法 数据可视化 计算机视觉
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
1653 0
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
|
开发框架 安全 前端开发
实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统
实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统
557 0
|
算法 前端开发 安全
面试官:前端加密怎么做?这,这,这不是后端的活儿吗?
前端加密技术概述: 前端加密主要用来保护数据在传输过程中的安全,但因浏览器环境开放性,仅能提供有限的安全性,真正安全策略需结合服务器端加密和安全协议。