在先後端分離的開發環境中,前端同窗須要等待後端同窗給出接口及接口文檔以後,才能繼續開發。而MockJS可讓前端同窗獨立於後端同窗進行開發,前端同窗能夠根據業務先梳理出接口文檔並使用MockJS模擬後端接口。那麼MockJS是如何模擬後端接口的呢?MockJS經過攔截特定的AJAX請求,並生成給定的數據類型的隨機數,以此來模擬後端同窗提供的接口。css
寫在最前面:有的小夥伴可能不太會部署前端環境,這裏我將代碼上傳到github中,有須要的小夥伴能夠把代碼下載下來,對照着代碼看下面的教程。html
首先安裝MockJS,安裝axios是爲了發送AJAX請求測試模擬的接口,使用其餘方式如原生AJAX請求或$.ajax都是能夠的,使用其餘方式發送AJAX請求無需安裝axios。前端
npm install mockjs --save
npm install axios --save
複製代碼
使用webpack打包工具打包vue單文件。 首先安裝css-loader、style-loader、vue、vue-loader、vue-template-compiler。vue
npm install css-loader style-loader --save-dev
npm install vue vue-loader vue-template-compiler --save-dev
複製代碼
而後在webpack.config.js配置文件中添加對應的loader,完整的配置圖以下。webpack
const path = require("path");
const {VueLoaderPlugin} = require('vue-loader');
module.exports = {
entry: './webapp/App.js',
output: {
filename: 'App.js',
path: path.resolve(__dirname, './dist')
},
module: {
rules: [
{
test: /\.css/,
use: ['style-loader', 'css-loader']
},
{
test: /\.vue$/,
use: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
],
mode: "production"
}
複製代碼
建立一個mock.js文件,接着在入口文件中(main.js)引入。ios
require('./mock.js');
複製代碼
在mock.js文件中引入MockJS。git
import Mock from 'mockjs';
複製代碼
後面咱們將在mock.js中編寫模擬接口。github
目錄結構以下:web
index.html是主頁文件,main.js是入口文件,mock.js是模擬接口文件,webpack.config.js是webpack配置文件,./dist/main.js是打包後的入口文件,./src/axios/api.js是封裝axios請求的文件。MockJS有兩種方式定義模擬接口返回的數據,一種是使用數據模板定義,這種方式自由度大,能夠自定義各類隨機的數據類型,一種是使用MockJS的Random工具類的方法定義,這種方式自由度小,只能隨機出MockJS提供的數據類型。趕時間的小夥伴能夠直接跳到2.使用Rndom工具類定義模擬接口返回值。ajax
先舉一個例子
//mock.js數據模板
{
'string|1-10':'string'
}
//接口返回的生成的數據===>
{
'string':'stringstringstring'
}
複製代碼
數據模板的格式爲 '屬性名|生成規則':'屬性值' ,生成規則決定了生成的數據的屬性值。 生成規則一共有7種,分別是:
對於不一樣的數據類型,能夠使用的生成規則是不一樣的,屬性值的數據類型能夠是Number、Boolean、String、Object、Array、Function、Null,不能夠是Undefined,下面我將對每一種數據類型分別使用7種生成規則,以此來觀察每一種數據類型能夠使用哪些生成規則,想要直接看結論的同窗直接拉至1.8的表格中。
在開始以前你們能夠去個人github把項目下載運行起來,結合項目更加直觀,經過刷新瞭解每個生成規則具體隨機出了什麼樣的數據。
在mock.js文件中,定義一個數組data1用於存放隨機生成的屬性值,而後定義一個對象row1存放生成的屬性值,而後定義模擬接口,在App.vue中使用axios發起請求向模擬接口請求數據並顯示在表格中。
const data1=[];
//數據模板'name|min-max':value
let row1={
'string|1-9':'string',
'number|1-9':1,
'boolean|1-9':false,
'undefined|1-9':undefined,
'null|1-9':null,
'object|1-9':{object1:'object1',object2:'object2',object3:'object3'},
'array|1-9':['array1','array2'],
'function|1-9':()=>'function'
};
data1.push(row1);
//定義模擬接口只能接收post請求,定義返回的數據爲data1
Mock.mock('/Get/list1','post',data1);
複製代碼
|min-max規則對於字符串是重複min-max次得出新的字符串,圖中能夠看出重複了4次。
對於數值是隨機生成1-9的數值。
對於布爾類型是min/(min+max)機率生成value值,max/(min+max)機率生成!value值,我這裏是10%機率生成false,90%機率生成true。
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象,先在min-max中隨機生成一個數值value,而後選取該對象的value個屬性出來組成一個新的對象,若value大於該對象的屬性個數,則將全部屬性拿出來,圖中能夠看到object對象的全部哦屬性被拿出來組成了一個新的對象。
對於數組,先在min-max中隨機生成一個數值value,而後將數組元素重複value次而後合併爲一個數組,圖中能夠看出隨機出來的數值爲6,合併了6個數組得出一個新的數組。
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|count':value
let row2={
'string|3':'string',
'number|3':1,
'boolean|3':false,
'undefined|3':undefined,
'null|3':null,
'object|3':{object1:'object1',object2:'object2',object3:'object3'},
'array|3':['array1','array2'],
'function|3':()=>'function'
};
data1.push(row2);
複製代碼
第二行是經過'name|count':value規則生成的
|count規則對於字符串是重複count次得出新的字符串,圖中能夠看出重複了3次。
對於數值是生成一個值爲count的數據。
對於布爾類型是(count-1)/count機率生成value值,1/count機率生成!value值,我這裏是66.7%機率生成false,33.3%機率生成true。
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象,選取該對象的count個屬性出來組成一個新的對象,若count大於該對象的屬性個數,則將全部屬性拿出來,圖中能夠看到object對象的全部哦屬性被拿出來組成了一個新的對象。
對於數組,將數組元素重複count次而後合併爲一個數組,圖中能夠看出隨機出來的數值爲3,合併了3個數組得出一個新的數組。
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|min-max.dmin-dmax':value
let row3={
'string|1-9.1-9':'string',
'number|1-9.1-9':1, //只有數值起做用
'boolean|1-9.1-9':false,
'undefined|1-9.1-9':undefined,
'null|1-9.1-9':null,
'object|1-9.1-9':{object1:'object1',object2:'object2',object3:'object3'},
'array|1-9.1-9':['array1','array2'],
'function|1-9.1-9':()=>'function'
};
data1.push(row3);
複製代碼
第三行是經過'name|min-max.dmin-dmax':value規則生成的。
|min-max.dmin-dmax規則對於字符串就是|min-max規則。
對於數值,是生成一個浮點數,浮點數的整數部分是min-max,小數的位數是dmin-dmax。圖中生成整數位3小數位數爲2位的值3.59。
對於布爾類型就是|min-max規則
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象也是|min-max規則
對於數組也是|min-max規則
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|min-max.dcount':value
let row4={
'string|1-9.3':'string',
'number|1-9.3':1, //只有數值起做用
'boolean|1-9.3':false,
'undefined|1-9.3':undefined,
'null|1-9.3':null,
'object|1-9.3':{object1:'object1',object2:'object2',object3:'object3'},
'array|1-9.3':['array1','array2'],
'function|1-9.3':()=>'function'
};
data1.push(row4);
複製代碼
第四行是經過'name|min-max.scount':value規則生成的。
|min-max.scount規則對於字符串就是|min-max規則。
對於數值,是生成一個浮點數,浮點數的整數部分是min-max,小數的位數是scount。圖中生成整數位6小數位數爲3位的值6.725。
對於布爾類型就是|min-max規則
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象也是|min-max規則
對於數組也是|min-max規則
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|count.dmin-dmax':value
let row5={
'string|3.1-9':'string',
'number|3.1-9':1, //只有數值起做用
'boolean|3.1-9':false,
'undefined|3.1-9':undefined,
'null|3.1-9':null,
'object|3.1-9':{object1:'object1',object2:'object2',object3:'object3'},
'array|3.1-9':['array1','array2'],
'function|3.1-9':()=>'function'
};
data1.push(row5);
複製代碼
第五行是經過'name|count.dmin-dmax':value規則生成的。
|count.dmin-dmax規則對於字符串就是|count規則。
對於數值,是生成一個浮點數,浮點數的整數部分的值是count,小數的位數是dmin-dmax位。圖中生成整數位3小數位數爲6位的值3.035354。
對於布爾類型就是|count規則
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象也是|count規則
對於數組也是|count規則
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|count.dcount':value
let row6={
'string|3.3':'string',
'number|3.3':1, //只有數值起做用
'boolean|3.3':false,
'undefined|3.3':undefined,
'null|3.3':null,
'object|3.3':{object1:'object1',object2:'object2',object3:'object3'},
'array|3.3':['array1','array2'],
'function|3.3':()=>'function'
};
data1.push(row6);
複製代碼
第六行是經過'name|count.dcount':value規則生成的。
|count.dcount規則對於字符串就是|count規則。
對於數值,是生成一個浮點數,浮點數的整數部分的值是count,小數的位數是dcount位。圖中生成整數位3小數位數爲3位的值3.425。
對於布爾類型就是|count規則
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象也是|count規則
對於數組也是|count規則
對於函數則直接執行函數並返回了函數的值。
//數據模板'name|+step':value
let row7 = {
'string|+3': 'string',
'number|+3': 1, //只有數值起做用
'boolean|+3': false,
'undefined|+3': undefined,
'null|+3': null,
'object|+3': {
object1: 'object1',
object2: 'object2',
object3: 'object3'
},
'array|+3': ['array1', 'array2'],
'function|+3': () => 'function'
};
data1.push(row7);
複製代碼
第七行是經過'name|+step':value規則生成的。
|+step規則對於字符串就是無做用,直接將字符串返回。
對於數值,初始值爲預設的value值1,每從新請求一次時數值會增長一個step值,點擊下方按鈕後,數值增長3變爲4。
對於布爾類型無做用,直接將布爾值返回。
undefined值直接被忽略了,生成的對象中不存在undefined屬性名。
對於null生成的值是null。
對於對象也是無做用,直接將對象返回。
對於數組,第一次請求時返回數組下標爲0的值,每從新請求一次時,讓下標增長一個step,如點擊一次按鈕後,下標值爲0+3=3超出了數組最大下標1,此時將下標值減去數組長度2直到下標值位於數組最大下標以內,3-2=1,故點擊一次按鈕後返回數組下標爲1的值。
對於函數則直接執行函數並返回了函數的值。
String | Number | Boolean | Undefined | Null | Object | Array | Function | |
---|---|---|---|---|---|---|---|---|
|min-max | 字符串重複min-max次後拼接得出新的字符串 | 隨機獲得min-max的值 | min/(min+max)機率生成value值,max/(min+max)機率生成!value值 | 當前數據類型無效 | 返回null值 | 先在min-max中隨機生成一個數值value,而後選取該對象的value個屬性出來組成一個新的對象,若value大於該對象的屬性個數,則將全部屬性拿出來 | 先在min-max中隨機生成一個數值value,而後將數組元素重複value次而後合併爲一個數組 | 直接執行函數並返回了函數的值 |
|count | 字符串重複count次得出新的字符串 | 生成一個值爲count的數值 | (count-1)/count機率生成value值,1/count機率生成!value值 | 當前數據類型無效 | 返回null值 | 選取該對象的count個屬性出來組成一個新的對象,若count大於該對象的屬性個數,則將全部屬性拿出來 | 將數組元素重複count次而後合併爲一個數組 | 直接執行函數並返回了函數的值 |
|min-max.dmin-dmax | 與規則|min-max相同 | 生成一個浮點數,浮點數的整數部分是min-max,小數的位數是dmin-dmax | 與規則|min-max相同 | 當前數據類型無效 | 返回null值 | 與規則|min-max相同 | 與規則|min-max相同 | 直接執行函數並返回了函數的值 |
|min-max.dcount | 與規則|min-max相同 | 生成一個浮點數,浮點數的整數部分是min-max,小數的位數是dcount | 與規則|min-max相同 | 當前數據類型無效 | 返回null值 | 與規則|min-max相同 | 與規則|min-max相同 | 直接執行函數並返回了函數的值 |
|count.dmin-dmax | 與|count規則相同 | 生成一個浮點數,浮點數的整數部分的值是count,小數的位數是dmin-dmax位 | 與|count規則相同 | 當前數據類型無效 | 返回null值 | 與|count規則相同 | 與|count規則相同 | 直接執行函數並返回了函數的值 |
|count.dcount | 與|count規則相同 | 生成一個浮點數,浮點數的整數部分的值是count,小數的位數是dcount位 | 與|count規則相同 | 當前數據類型無效 | 返回null值 | 與|count規則相同 | 與|count規則相同 | 直接執行函數並返回了函數的值 |
|+step | 無做用,將value直接返回 | 初始值爲預設的value值,每從新請求一次時數值value會增長一個step值 | 無做用,將value值返回 | 當前數據類型無效 | 返回null值 | 無做用,將value值返回 | 初始值爲下標是預設的value的值,每從新請求一次時,下標value會增長一個step值 | 直接執行函數並返回了函數的值 |
其中|min-max.dmin-dmax、|min-max.dcount、|count.dmin-dmax、|count.dcount這四個規則主要是給Number類型使用的。
MockJS提供了一組方法讓咱們快速隨機出想要的數據。
const Random=Mock.Random;
{
'Boolean': Random.boolean, // 隨機生成布爾類型
'Natural': Random.natural(1, 100), // 隨機生成1到100之間天然數
'Integer': Random.integer(1, 100), // 生成1到100之間的整數
'Float': Random.float(0, 100, 0, 5), // 生成0到100之間的浮點數,小數點後尾數爲0到5位
'Character': Random.character(), // 生成隨機字符串,可加參數定義規則
'String': Random.string(2, 10), // 生成2到10個字符之間的字符串
'Range': Random.range(0, 10, 2), // 生成一個數組,數組元素從0開始到10結束,間隔爲2
'Date': Random.date(), // 生成一個隨機日期,可加參數定義日期格式,默認yyyy-mm-dd
'Image1': Random.image(Random.size, '#02adea', '#fff','png','Hello'), // Random.size表示將從size數據中任選一個數據,生成Random.size指定大小的,背景爲'#02adea'的,前景色爲'#fff'的,格式爲'png'的,內容爲'Hello'的圖片。
'Image2':Random.dataImage('200x100', 'Hello Mock.js!'),//只設置大小
'Color': Random.color(), // 生成一個顏色隨機值
'Paragraph':Random.paragraph(2, 5), //生成2至5個句子的文本
'Name': Random.name(), // 生成姓名
'Url': Random.url(), // 生成url地址
'Address': Random.province() // 生成地址
}
複製代碼
組織好數據以後一樣的須要設置模擬接口。
Mock.mock('/Get/list2', 'post', data2) ;
複製代碼
再經過AJAX訪問該接口便可得到模擬數據。
完整代碼:
//mock.js
const Random = Mock.Random;
let data2 = [] // 用於接受生成數據的數組
let size = [
'300x250', '250x250', '240x400', '336x280',
'180x150', '720x300', '468x60', '234x60',
'88x31', '120x90', '120x60', '120x240',
'125x125', '728x90', '160x600', '120x600',
'300x600'
] // 定義隨機值
for(let i = 0; i < 10; i ++) { //生成10個對象放到數組中
let template = {
'Boolean': Random.boolean, // 能夠生成基本數據類型
'Natural': Random.natural(1, 100), // 生成1到100之間天然數
'Integer': Random.integer(1, 100), // 生成1到100之間的整數
'Float': Random.float(0, 100, 0, 5), // 生成0到100之間的浮點數,小數點後尾數爲0到5位
'Character': Random.character(), // 生成隨機字符,可加參數定義規則
'String': Random.string(2, 10), // 生成2到10個字符之間的字符串
'Range': Random.range(0, 10, 6), // 生成一個隨機數組
'Date': Random.date(), // 生成一個隨機日期,可加參數定義日期格式
'Image': Random.image(Random.size, '#02adea', '#fff','png','Hello'),
'Color': Random.color(), // 生成一個顏色隨機值
'Paragraph':Random.paragraph(2, 5), //生成2至5個句子的文本
'Name': Random.name(), // 生成姓名
'Url': Random.url(), // 生成web地址
'Address': Random.province() // 生成地址
}
data2.push(template)
}
Mock.mock('/Get/list2', 'post', data2) // 聲明模擬接口
//App.vue
axios('/Get/list2').then(res => {
this.dataShow2 = res;
});
複製代碼
使用數據佔位符定義模擬數據能夠相比Random工具類更爲簡潔。
{
'Boolean': '@boolean', // 隨機生成布爾類型
'Natural': '@natural(1, 100)', // 隨機生成1到100之間天然數
'Integer': '@integer(1, 100)', // 生成1到100之間的整數
'Float': '@float(0, 100, 0, 5)', // 生成0到100之間的浮點數,小數點後尾數爲0到5位
'Character': '@character("aeiou")', // 在aeiou中,生成隨機字符,不傳參表示生成隨機字符
'String': '@string( 2, 10)', // 生成2到10個字符之間的字符串
'Range': '@range(0, 10, 2)', // 生成一個數組,數組元素從0開始到10結束,間隔爲2
'Date': '@date("yyyy yy y MM M dd d")', // 生成一個隨機日期,可加參數定義日期格式,默認yyyy-mm-dd
'Color1': '@color', // 生成一個顏色16進制隨機值
'Color2': '@rgb', //生成一個顏色rgb隨機值
'Paragraph':'@paragraph(2, 5)', //生成2至5個句子的文本
'Sentence':'@sentence(3, 5)', //生成3至5個單詞組成的一個句子
'World':'@word(3, 5)', //生成3-5個字母組成的單詞
'title':'@title(3,5)', //生成3-5個單詞組成的標題
'cParagraph':'@cparagraph(2, 5)', //生成2至5個句子的中文文本
'cSentence':'@csentence(3, 5)', //生成3至5個詞語組成的一箇中文句子
'cWorld':'@cword(3, 5)', //生成3-5個字組成的中文詞語
'ctitle':'@ctitle(3,5)', //生成3-5個詞語組成的中文標題
'Name': '@name', // 生成姓名
'cName': '@cname', // 生成中文姓名
'Url': '@url', // 生成url地址
'Email':'@email',//生成郵箱
'Address': '@county(true)', // 生成省 市 縣組成的地址
'Guid':'@guid()', //生成Guid值
}
複製代碼
MockJS使先後分離程度更高,同時,我認爲最重要的是他使前端人員也開始思考業務。傳統開發中,前端人員可能是等待後端人員提供的接口及接口文檔,不懂得主動梳理接口文檔,使用MockJS後前端人員能夠從項目總體的角度出發,能更好的參與到項目之中。
若是這篇文章幫到你了,以爲不錯的話來點個Star吧。 github.com/lizijie123