一.Mock.js是什么?

目前的大部分公司的项目都是采用的前后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面需要使用大量数据进行渲染生成前, 后端开发人员的接口也许并没有写完, 作为前端的我们也就没有办法获取数据. 所以 前端工程师就需要自己按照接口文档模拟后端人员提供的数据, 以此进行页面的开发.

这个时候, Mock.js的作用就体现出来了, 在数据量较大的情况下, 我们不用一个一个的编写数据, 只需要根据接口文档将数据的格式填入, Mock.js就能够自动的按需生成大量的模拟数据. 且Mock.js提供了大量的数据类型, 包括文本, 数字, 布尔值, 日期, 邮箱, 链接, 图片, 颜色等.

本文就简单的介绍一下Mock.js提供的语法, 并介绍一下我平时在项目中是如何使用Mock.js去更方便的进行开发的.

二. 下载和引入Mock.js

1. 下载Mock.js

Mock.js提供多种下载方式, 本文以目前国内最常用的npm举例, 只需要在命令行输入npm install mockjs
即可完成Mock.js的下载.

2. 引入Mock.js

Mock.js暴露了一个全局的Mock对象, 我们只需要将Mock对象引入到文件中, 调用Mock对象的方法即可

  • CommonJS的引入方式
  1. //CommonJS引入
  2. let Mock = require('mockjs)
  3. //调用Mock.mock()方法模拟数据
  4. let data = Mock.mock({
  5. 'list|1-10': [{
  6. 'id|+1': 1
  7. }]
  8. });
  9. console.log(data);
  • ES6的引入方式
  1. //ES6的引入方式
  2. import Mock from 'mockjs'
  3. let data = Mock.mock({
  4. 'list|1-10': [{
  5. 'id|+1': 1
  6. }]
  7. });
  8. console.log(data);

三.Mock.js的简单语法

Mock对象提供了4个方法, 分别是Mock.mock(), Mock.setup(), Mock.valid, Mock.toJSONSchema(), 一个工具库Mock.Random. 其中我们经常使用到的就是Mock.mock()Mock.Random.

1. Mock.js的规范

第二部分引入Mock.js的代码中的以下部分就可以体现Mock.js的语法规范

  1. 'list|1-10': [{
  2. 'id|+1': 1
  3. }]

上面的代码被称为数据模板, 用于告诉Mock.js生成什么样的数据, 其中数据模板中的每个属性由三部分构成: 属性名, 生成规则, 属性值:

  • list为数据模板中的属性名;
  • 1-10为生成规则(表示生成最少1个, 最多10个重复数据)
  • [{'id|+1': 1}]是属性值, 属性值中可以嵌套使用属性名和生成规则.

具体的生成规则参见: https://github.com/nuysoft/Mo...

2. Mock.mock()

Mock.mock()方法是用来根据数据模板生成模拟数据, 我常用到的是以下两种传参方式:

  • Mock.mock(template): 根据数据模板template生成模拟数据
  1. let data = Mock.mock({
  2. data: {
  3. 'products|10-20': [{
  4. name: '手机',
  5. price: 1000
  6. }]
  7. }
  8. })
  9. console.log(data);
  • Mock.mock(url, template): 拦截请求地址为url的ajax请求, 并根据数据模板template生成模拟数据
  1. let data = Mock.mock('api/products' , {
  2. data: {
  3. 'products|10-20': [{
  4. name: '手机',
  5. price: 1000
  6. }]
  7. }
  8. })
  9. //使用jquery Ajax发送请求
  10. $.ajax({
  11. url: 'api/products',
  12. type: 'GET',
  13. success: function(res) {
  14. console.log(res);
  15. }
  16. })

3. Mock.Random

Mock.Random是Mock.js提供一个工具类, 用于生成常用的几种数据.

  • 生成布尔值
  1. //使用@占位符的方式
  2. let data = Mock.mock({
  3. data: {
  4. boolean: '@boolean'
  5. }
  6. })
  7. console.log(data);
  8. //使用Mock.Random调用函数的方式
  9. let data = Mock.mock({
  10. data: {
  11. boolean: Mock.Random.boolean()
  12. }
  13. })
  14. console.log(data);
  • 生成日期
  1. let data = Mock.mock({
  2. data: {
  3. date: Mock.Random.date('yyyy-MM-dd')
  4. }
  5. })
  6. console.log(data);

Mock.js支持丰富的日期格式的自定义: https://github.com/nuysoft/Mo...

  • 生成图片
  1. let data = Mock.mock({
  2. data: {
  3. //用于生成高度自定义的图片地址
  4. imgURL: Mock.Random.image()
  5. }
  6. })
  7. console.log(data);
  • 生成名字
  1. let data = Mock.mock({
  2. data: {
  3. //生成一个英文名字
  4. name: Mock.Random.name(),
  5. //生成一个中文名字
  6. chineseName: Mock.Random.cname()
  7. }
  8. })
  9. console.log(data);

更多Mock.Random工具库提供的数据: https://github.com/nuysoft/Mo...

四.在Vue项目中使用Mock.js

以模拟一个登陆接口的数据为例:

1. 单独写一个mockData.js文件作为虚拟数据的生成文件.

  1. //mockData.js
  2. import Mock from 'mockjs'
  3. let Random = Mock.Random;
  4. //用户登陆信息
  5. let userInfo = Mock.mock({
  6. data: {
  7. responseCode: 200,
  8. responseMessage: 'success',
  9. userMessage: {
  10. email: Random.email(),
  11. 'id|1-10': 1,
  12. realName: Random.cname(),
  13. roleCodes: 'admin',
  14. username: Random.first()
  15. }
  16. }
  17. })
  18. let mockData = {
  19. userInfo: userInfo
  20. }
  21. export default mockData;

2. 使用vuex去控制是否使用mock.js的数据

  1. // src/store/index.js
  2. import Vue from 'vue'
  3. import Vuex from 'vuex'
  4. import mutations from './mutations'
  5. import actions from './actions'
  6. Vue.use(Vuex);
  7. const state = {
  8. //使用模拟数据, 只是开发时使用, 如果不是开发时, 请务必设置为false
  9. useMock: true
  10. }
  11. export default new Vuex.Store({
  12. state,
  13. mutations,
  14. actions
  15. })

3. 在Login.vue中去实现请求登陆方法

  1. //Login.vue
  2. import mockData from '../utils/mockData.js'
  3. exwport default {
  4. ...
  5. methods: {
  6. fetchUserInfo() {
  7. //如果vuex中userMock为true
  8. if (this.$store.state.useMock) {
  9. //使用延时器模拟异步
  10. window.setTimeout(() => {
  11. let res = mockData.userInfo;
  12. //业务逻辑
  13. }, 1000);
  14. return;
  15. }
  16. //如果vuex中userMock为false
  17. this.$axios.post('api/login', params).then(res => {
  18. //业务逻辑
  19. });
  20. }
  21. }
  22. }

可以看出在Login.vue的fetchUserInfo()方法中, 如果userMocktrue, 将使用的是mock.js中的模拟数据; 如果useMockfalse, 使用的是通过Ajax请求的数据. 这么写的好处是, 你只需要在vuex中修改一下, 就可以控制所有请求接口函数中是使用Ajax请求数据, 还是使用模拟数据. 这样在进行和后台联调的时候, 就可以自由的切换数据了!

参考链接

  1. Mock.js官网: http://mockjs.com/

原文地址:https://segmentfault.com/a/1190000013022560

让前端攻城师独立于后端进行开发: Mock.js的更多相关文章

  1. 如何成为一名优秀的web前端工程师(前端攻城师)?

    程序设计之道无远弗届,御晨风而返.———— 杰佛瑞 · 詹姆士 我所遇到的前端程序员分两种:第一种一直在问:如何学习前端?第二种总说:前端很简单,就那么一点东西. 我从没有听到有人问:如何做一名优秀. ...

  2. 【转】如何成为一名优秀的web前端工程师(前端攻城师)?

    [转自]http://julying.com/blog/how-to-become-a-good-web-front-end-engineer/ 程序设计之道无远弗届,御晨风而返.———— 杰佛瑞 · ...

  3. 让前端独立于后端进行开发,模拟数据生成器Mock.js

    让前端独立于后端进行开发,模拟数据生成器Mock.jsMock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. Home · nuysoft/Mock Wiki ...

  4. 1年3年5年-我对PHP攻城师有看法

    今天早上公车上看微信拉勾的一些岗位推送,挑了几个PHP攻城师看看 15K-20K的 百万级网站架构经验 3年以上开发,至少1年互联网用户产品开团队开发经验 不低于百度T4水平 数据库规划和优化,熟悉常 ...

  5. 2015Web前端攻城之路

    2015目标成为一名合格的前端攻城狮. 养成计划: 1.html / css 2.js 3.ajax 4.框架 5.项目实战

  6. mock.js-无需等待,让前端独立于后端进行开发

    概述 首先啦,我不认识mock.js的作者,带着需求找到mock.js让我觉得很惊艳. 相对于其他同类的框架的实现,mock.js超出了我的意料. 基于 数据模板 生成模拟数据. 基于 HTML模板 ...

  7. web前端攻城狮整理的收藏夹

    作为一名web前端开发工程师你的收藏夹存对了吗?下面是一份互联网上流传甚广的web前端开发收藏夹资源,包含学习网站.JS库.常用工具.常用插件.资讯书籍等资源.速速转存吧~   一.学习网站   W3 ...

  8. 前后端分离(手) -- mock.js

    前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三遍. ...

  9. 【大前端攻城狮之路·二】Javascript&QA⼯程师

    今天给大家分享的主题的是Javascript&QA⼯程师.看到这个主题,可能有人问:前端开发完就OK了,剩下的丢给测试就行,哪里还需要关心这些?但事实上呢,测试是前端开发非常重要的环节,也是迈 ...

随机推荐

  1. [NOI 2002] 银河英雄传说 (带权并查集)

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  2. idea debug打得断点第一次可以进入,第二次不能进入

  3. sql中自连接的使用

    一.用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题.下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系.SQL代码如下: ...

  4. hadoop的理解

    知乎上有个人写的感觉挺好理解的,不知道对不对,先截图存着

  5. SQL--各种约束

    约束名称 含义 主键约束 定义一个唯一的标识符 外键约束 为了维护和主键表的数据完整性 check约束 限定表中某个列的值的范围 default约束 如果没有指定插入值,则插入默认值 unique约束 ...

  6. 数据库-mongodb-常用命令

    展示当前集合列表 1 show dbs 查看查询命令 1 db.stu.find().explain(); 结果中的 "cursor":"BasicCursor" ...

  7. 开启WIFI

    C:\Windows\system32>netsh wlan set hostednetwork mode=allow ssid=wuyechun-wifi k ey= 承载网络模式已设置为允许 ...

  8. POJ 1091

    这题确实是好. 其实是求x1*a1+x2*a2+....M*xn+1=1有解的条件.很明显,就是(a1,a2,...M)=1了.然后,可以想象,直接求有多少种,很难,所以,求出选择哪些数一起会不与M互 ...

  9. 腾讯云 ubuntuservermysql安装和外网訪问

    1 腾讯云 购买ubuntu 默认账户是ubuntu(因为winscp 使用ubuntu没有权限写文件) 因为腾讯云主机ubuntu系统默认username为ubuntu,不喜欢每次做什么都要sudo ...

  10. Android nomedia 避免图片等资源泄露在系统图库其中

    总结 Android nomedia 避免文件泄露在系统图库和系统铃声中 在应用开发中 项目的图片总是被系统的图库收录了 避免图片被系统图库收录的发现有2个方法 第一种针对图片 将 .png为后缀的图 ...