一、Mock簡介
??在我們的生產(chǎn)實(shí)際中表谊,后端的接口往往是較晚才會(huì)出來搔谴,并且還要寫接口文檔,于是我們的前端的許多開發(fā)都要等到接口給我們才能進(jìn)行驶沼,這樣對(duì)于我們前端來說顯得十分的被動(dòng)炮沐,于是有沒有可以制造假數(shù)據(jù)來模擬后端接口呢,答案是肯定的回怜。應(yīng)該有人通過編寫json文件來模擬后臺(tái)數(shù)據(jù)大年,但是很局限换薄,比如增刪改查這些接口怎么實(shí)現(xiàn)呢,于是今天我們來介紹一款非常強(qiáng)大的插件Mock.js翔试,可以非常方便的模擬后端的數(shù)據(jù)轻要,也可以輕松的實(shí)現(xiàn)增刪改查這些操作。
作用:
1.前后端分離
2.不需要修改既有代碼垦缅,就可以攔截 Ajax 請(qǐng)求冲泥,返回模擬的響應(yīng)數(shù)據(jù)。
3.數(shù)據(jù)類型豐富
4.通過隨機(jī)數(shù)據(jù)壁涎,模擬各種場(chǎng)景凡恍。
http://mockjs.com/examples.html
示例代碼
https://github.com/nuysoft/Mock/wiki
MockAPI
- 安裝
npm install mockjs --save-dev
或
npm install ts-mock-imports --save-dev
項(xiàng)目搭建起來之后,能夠在package.json里面看到 "mockjs": "^1.0.1-beta3" 這塊代碼怔球,就說明mockjs已經(jīng)引入載入成功嚼酝。
- 在入口js(main.js)里引入mockjs
// 引入mockjs
require('../mock/index.js')
或
// 引入mockjs
import '@/mock/index.ts';
-
在根目下創(chuàng)建Mock目錄:
index.js
import Mock from 'mockjs'
// 獲取 mock.Random 對(duì)象
const Random = Mock.Random;
// mock一組數(shù)據(jù)
const produceNewsData = function() {
let articles = [];
for (let i = 0; i < 100; i++) {
let newArticleObject = {
title: Random.csentence(5, 30), // Random.csentence( min, max )
thumbnail_pic_s: Random.dataImage('300x250', 'mock的圖片'), // Random.dataImage( size, text ) 生成一段隨機(jī)的 Base64 圖片編碼
author_name: Random.cname(), // Random.cname() 隨機(jī)生成一個(gè)常見的中文姓名
date: Random.date() + ' ' + Random.time() // Random.date()指示生成的日期字符串的格式,默認(rèn)為yyyy-MM-dd;Random.time() 返回一個(gè)隨機(jī)的時(shí)間字符串
}
articles.push(newArticleObject)
}
return {
articles: articles
}
}
//一個(gè)post請(qǐng)求竟坛,地址為:/news/index 數(shù)據(jù)為: produceNewsData
Mock.mock('/news/index', 'post', produceNewsData);
- 代理配置
cli2.0:
cli3.0:
- 模擬后臺(tái)接口返回JSON數(shù)據(jù)
二闽巩、 簡單示例
Mock.mock('http://123.com',{
'name|3':'fei',//這個(gè)定義數(shù)據(jù)的模板形式下面會(huì)介紹
'age|20-30':25,
})
$.ajax({
url:'http://123.com',
dataType:'json',
success:function(e){
console.log(e)
}
})
在這個(gè)例子中我們截獲地址為http://123.com返回的數(shù)據(jù)是一個(gè)擁有name和age的對(duì)象,那么ajax返回的數(shù)據(jù)就是Mock定義的數(shù)據(jù)担汤,返回的數(shù)據(jù)格式如下:
{
name:'feifeifei',
age:26,
}
三涎跨、數(shù)據(jù)定義
數(shù)據(jù)模板中的每個(gè)屬性由 3 部分構(gòu)成:屬性名、生成規(guī)則漫试、屬性值:
// 屬性名 name
// 生成規(guī)則 rule
// 屬性值 value
'name|rule': value
1.'name|min-max': string 通過重復(fù)
string
生成一個(gè)字符串六敬,重復(fù)次數(shù)大于等于 min,小于等于 max
例子:'lastName|2-5':'jiang', 重復(fù)jiang這個(gè)字符串 2-5 次
2.'name|count': string 通過重復(fù) string 生成一個(gè)字符串驾荣,重復(fù)次數(shù)等于 count
例子:'firstName|3':'fei', 重復(fù)fei這個(gè)字符串 3 次外构,打印出來就是'feifeifei'。
3.'name|min-max': number 生成一個(gè)大于等于 min播掷、小于等于 max 的整數(shù)审编,屬性值 number 只是用來確定類型。
例子:'age|20-30':25, 生成一個(gè)大于等于 20歧匈、小于等于 30 的整數(shù)垒酬,屬性值 25 只是用來確定類型
4.'name|+1': number 屬性值自動(dòng)加 1,初始值為 number
例子:'big|+1':0, 屬性值自動(dòng)加 1件炉,初始值為 0勘究,以后每次請(qǐng)求在前面的基礎(chǔ)上+1
5.'name|min-max.dmin-dmax': number 生成一個(gè)浮點(diǎn)數(shù),整數(shù)部分大于等于 min斟冕、小于等于 max口糕,小數(shù)部分保留 dmin
到 dmax 位。
例子:'weight|100-120.2-5':110.24, 生成一個(gè)浮點(diǎn)數(shù),整數(shù)部分大于等于 100磕蛇、小于等于 120景描,小數(shù)部分保留 2 到 5 位
6.'name|1': boolean 隨機(jī)生成一個(gè)布爾值十办,值為 true 的概率是 1/2,值為 false 的概率同樣是 1/2
例子:'likeMovie|1':Boolean, 隨機(jī)生成一個(gè)布爾值超棺,值為 true 的概率是 1/2向族,值為 false 的概率同樣是 1/2。
7.屬性值是對(duì)象:var obj={'host':'www.baidu','port':'12345','node':'selector'}
(1).'name|count': object 從屬性值 object 中隨機(jī)選取 count 個(gè)屬性棠绘。
例子:'life1|2':obj, 從屬性值 obj 中隨機(jī)選取 2 個(gè)屬性
(2).'name|min-max': object 從屬性值 object 中隨機(jī)選取 min 到 max 個(gè)屬性
例子:'life1|1-2':obj, 從屬性值 obj 中隨機(jī)選取 1 到 2 個(gè)屬性件相。
8.屬性值是數(shù)組:var arr=['momo','yanzi','ziwei']
(1)..'name|1': array 從屬性值 array 中隨機(jī)選取 1 個(gè)元素,作為最終值
例子:'friend1|1':arr, 從數(shù)組 arr 中隨機(jī)選取 1 個(gè)元素氧苍,作為最終值适肠。
(2).'name|+1': array 從屬性值 array 中順序選取 1 個(gè)元素,作為最終值候引。
例子:'friend2|+1':arr, 從屬性值 arr 中順序選取 1 個(gè)元素,作為最終值敦跌,第一次就是'momo',第二次請(qǐng)求就是'yanzi'
(3).'name|count': array 通過重復(fù)屬性值array 生成一個(gè)新數(shù)組澄干,重復(fù)次數(shù)為 count。
例子:'friend3|2':arr, 重復(fù)arr這個(gè)數(shù)字2次作為這個(gè)屬性值柠傍,得到數(shù)據(jù)應(yīng)該是['momo','yanzi','ziwei','momo','yanzi','ziwei']
(4)..'name|min-max': array 通過重復(fù)屬性值 array 生成一個(gè)新數(shù)組麸俘,重復(fù)次數(shù)大于等于 min,小于等于 max惧笛。
例子:'friend3|2-3':arr,//通過重復(fù)屬性值 arr 生成一個(gè)新數(shù)組从媚,重復(fù)次數(shù)大于等于 2,小于等于 3
三患整、Mock示例
var arr=['momo','yanzi','ziwei']
var obj={
'host':'www.baidu',
'port':'12345',
'node':'selector'
}
Mock.mock('http://www.bai.com',{
'firstName|3':'fei',//重復(fù)fei這個(gè)字符串 3 次拜效,打印出來就是'feifeifei'。
'lastName|2-5':'jiang',//重復(fù)jiang這個(gè)字符串 2-5 次各谚。
'big|+1':0, //屬性值自動(dòng)加 1紧憾,初始值為 0
'age|20-30':25,//生成一個(gè)大于等于 20踱侣、小于等于 30 的整數(shù)授嘀,屬性值 25 只是用來確定類型
'weight|100-120.2-5':110.24,//生成一個(gè)浮點(diǎn)數(shù),整數(shù)部分大于等于 100、小于等于 120第租,小數(shù)部分保留 2 到 5 位膀息。
'likeMovie|1':Boolean,//隨機(jī)生成一個(gè)布爾值般眉,值為 true 的概率是 1/2,值為 false 的概率同樣是 1/2潜支。
'friend1|1':arr,//從數(shù)組 arr 中隨機(jī)選取 1 個(gè)元素甸赃,作為最終值。
'friend2|+1':arr,//從屬性值 arr 中順序選取 1 個(gè)元素毁腿,作為最終值
'friend3|2-3':arr,//通過重復(fù)屬性值 arr 生成一個(gè)新數(shù)組辑奈,重復(fù)次數(shù)大于等于 2苛茂,小于等于 3。
'life1|2':obj,//從屬性值 obj 中隨機(jī)選取 2 個(gè)屬性
'life1|1-2':obj,//從屬性值 obj 中隨機(jī)選取 1 到 2 個(gè)屬性鸠窗。
'regexp1':/^[a-z][A-Z][0-9]$/,//生成的符合正則表達(dá)式的字符串
})
$.ajax({
url:'http://www.bai.com',
dataType:'json',
success:function(e){
console.log(e)
}
})
實(shí)現(xiàn)數(shù)據(jù)增改查的模擬數(shù)據(jù)接口:
/*模擬刪除數(shù)據(jù)的方式*/
var arr=[
{name:'fei',age:20,id:1},
{name:'liang',age:30,id:2},
{name:'jun',age:40,id:3},
{name:'ming',age:50,id:4}
]
Mock.mock('http://www.bai.com','delete',function(options){
var id = parseInt(options.body.split("=")[1])//獲取刪除的id
var index;
for(var i in arr){
if(arr[i].id===id){//在數(shù)組arr里找到這個(gè)id
index=i
break;
}
}
arr.splice(index,1)//把這個(gè)id對(duì)應(yīng)的對(duì)象從數(shù)組里刪除
return arr;//返回這個(gè)數(shù)組,也就是返回處理后的假數(shù)據(jù)
})
$.ajax({
url:'http://www.bai.com',
type:"DELETE",
data:{
id:1//假設(shè)需要?jiǎng)h除id=1的數(shù)據(jù)
},
dataType:'json',
success:function(e){
console.log(e)
}
})
四妓羊、常用函數(shù):
1.Mock.Random
http://mockjs.com/0.1/#Mock.Random
Mock.Random.csentence() 可以返回一個(gè)隨機(jī)的中文句子
Mock.Random.domain() 可以返回一個(gè)隨機(jī)的域名
- Mock.mock([你發(fā)起Ajax請(qǐng)求的URL], ["get"或"post"],[根據(jù)Mock.Random定制的模板或函數(shù)])