一、文章初衷
閱讀本文章需要注意以下幾點:
- 文章不主要介紹Mockjs的使用語法
- 文章暫不涉及Mockjs的第三方封裝框架
- 文章會結合以往做過上線項目的方式總結
想主要介紹如何使用Mockjs,是因為發現網上針對這方面的資料好像並不多,並且比較分散。想要做一次總結,希望能幫助解決入門Mockjs的新人使用的一些疑惑

1.1 簡單介紹一下Mock.js
眾所周知Mock.js
因為兩個重要的特性風靡前端:
-
數據類型豐富
支持生成隨機的文本、數字、布爾值、日期、郵箱、鏈接、圖片、顏色等。 -
攔截 Ajax 請求
不需要修改既有代碼,就可以攔截 Ajax 請求,返回模擬的響應數據。安全又便捷
文章會用到的API(也是Mock經常使用的API):
- Mock.mock(url, type, data)
參數名 | 參數需求 | 參數描述 | 例子 |
---|---|---|---|
url | 可選: URL 字符串或 URL 正則 | 攔截請求的地址 | /mock |
type | 可選 | 攔截Ajax類型 | GET、POST |
template | 可選: 可以是對象或字符串 | 生成數據的模板 | {'data|1-10':['mock'] } 、'@EMAIL' |
template可能有點難理解,我們試幾個例子就一目了然了!
//類型1: 名字|規則: 內容
Mock.mock({'data|1-4': '啞巴'})
//生成1-4個啞巴字符串
{
data: "啞巴啞巴啞巴"
}
//類型2: Mock自帶模板
Mock.mock('@province')
//隨機生成一個省份
"上海"
更多測試實例可以到:《Mock 實例》上查看。
也可以親自在網站的console里測試,非常方便

簡單介紹了Mock.js的用法,下面獻上正文
二、如何高效地使用Mock.js
針對不同情況,羅列了以下幾種可能會使用到的方式:
-
直接創建使用
- 直接在需要Mock數據的js文件使用
- 創建一個js/json文件,導入使用
-
優雅地搭配node
- 通過node開啟Mock服務, 可加入到
package.json
命令里
- 通過node開啟Mock服務, 可加入到
上面兩種方法區別蠻大的:
-
直接創建的Mock數據, 在控制台的netWork是無法看到的.而通過服務開啟的Mock,在控制台是真真切切看得到攔截的!
-
對於要上線的項目, 直接創建(導入)Mock數據還會導致一個大的麻煩!當你開始調用真正后端接口的時候, 你不得不一個個刪除創建的數據(即使你統一在一個文件創建,但也要一個個注釋掉導入的地方)。 但是如果你用node服務,就避免了這個問題了。因為你需要用Mock數據的時候,只需要開啟它的服務,而不需要導入
下面我在一個小項目(React + Antd)上測試Mock
2.1 針對個人練手項目
1. 可以用最簡單的方式創建:
let dataSource = Mock.mock({
'dataSource|5':[{
'key|+1': 1,
'mockTitle|1':['啞巴', 'Butter-fly', '肆無忌憚', '摩天大樓', '初學者'],
'mockContent|1': ['你翻譯不了我的聲響', '數碼寶貝主題曲', '摩天大樓太稀有', '像海浪撞破了山丘'],
'mockAction|1': ['下載', '試聽', '喜歡']
}]
})
//為了提高閱讀效率, columns我就不放出來啦!
<Table
style={{marginTop: 10}}
columns={columns}
dataSource={dataSource}
/>
我們看一下輸出的Table:

Prefect!!Mock的使用就是這么簡單。但對於追求完美的我們肯定想要代碼更規范, 於是我們把它統一放到一個/mock/api.js
文件中, 並嘗試給它添加一個URL!
//api.js
import Mock from 'mockjs'
const url = {
tableDataOne: 'http://20181024Mock.com/mode1/tableDataOne',
tableDataTwo: 'http://20181024Mock.com/mode1/tableDataTwo',
tableDataThi: 'http://20181024Mock.com/mode1/tableDataThi',
}
module.exports = [
Mock.mock(url.tableDataOne, {
'dataSource|5':[{
'key|+1': 1,
'mockTitle|1':['啞巴', 'Butter-fly', '肆無忌憚', '摩天大樓', '初學者'],
'mockContent|1': ['你翻譯不了我的聲響', '數碼寶貝主題曲', '摩天大樓太稀有', '像海浪撞破了山丘'],
'mockAction|1': ['下載', '試聽', '喜歡']
}]
})
]
我們在去組件中引入api.js
, 然后用axios請求它!
//TableComp.js
/*
* 我這里去掉了多余的import,例如antd、react等等
* 只截取了組件的主要學習部分
*/
import axios from 'axios'
//按需引入api文件, 但后面會導致刪除麻煩的問題.
import '../../../../../../mock/mode1/api'
componentDidMount(){
const that = this;
axios.get('http://20181022Mock.com/mode1/tableDataOne').then((res) => {
if(res.status == 200){
that.setState({
dataSource: res.data.dataSource
})
}
})
}
render(){
const { dataSource } = this.state;
return(
<Table
style={{marginTop: 10}}
columns={columns}
dataSource={dataSource}
/>
)
}
不出乎意料, 應該也是可以拿到數據, 但是netWord里面是找不到這個請求的, 因為這是一個假的ajax!

這樣雖然解決了代碼統一處理/規范的問題, 但是每次使用都需要引入的麻煩並沒有解決。 下面我們看如果通過搭配node服務解決這個問題.
2.2 針對實際項目
既然我們要偽造一個真的后台, 那么當然需要用node來啟動服務, 那么我們就創建一個MockServer.js
文件,當作是我們的入口.
和以前創建node服務一樣即可!(這里我偷懶用express框架,koa也是一樣的道理)
let express = require('express'); //引入express
let Mock = require('mockjs'); //引入mock
let app = express(); //實例化express
app.use('/mode2/DataOne',function(req, res){
res.json(Mock.mock({
'status': 200,
'dataSource|1-9':[{
'key|+1': 1,
'mockTitle|1':['肆無忌憚'],
'mockContent|1': ['角色精湛主題略荒誕', '理由太短 是讓人不安', '疑信參半 卻無比期盼', '你的慣犯 圓滿', '別讓糾纏 顯得 孤單'],
'mockAction|1': ['下載', '試聽', '喜歡']
}]
}))
})
app.listen('8090', () => {
console.log('監聽端口 8090')
})
只需要以上幾個步驟就可以完成了!
- 實例化express對象、引入mock模塊
- (加入請求頭,解決跨域)
- 通過express掛載一個請求(use、get...),並返回mock數據
- 暴露端口,開啟服務!
大家可能注意到了第二點我還沒實現.不過我們先不考慮跨域問題, 運行一下看看會出現什么情況。(存在跨域問題是必然的, 因為都不是同一個端口號!)
果然, 跨域問題出來了:

那我們還是乖一點把請求頭配置加上去吧(復制即可):
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
跨域問題就順利解決了!

這樣一來我們就解決了導入帶來的麻煩了!如果不想進入MockServer.js
所在的文件夾里啟動服務, 可以在package.json
中配置命令
//package.json
{
...
"scripts": {
"start": "node ./bin/www",
"build": "webpack --progress --watch --color",
"mock": "node ./mock/mode2/mockServer"
},
...
}
然后我們像啟動項目一樣, 在根路徑npm run mock
即可!
比較坑爹的是, 這樣配置並不存在自動更新功能, 所以我們每次更改了MockServer.js
還要command + c 殺掉這個進程, 重啟服務生效。
雖然實際項目使用Mock的這種方式蠻多的, 但是其中復雜地多, 比如Mock生成數據的規則會統一放到一個rule.js
中. 更多的便捷配置和用法還是需要你去學習別的項目是怎么運作的!
我這里只是列出了最簡單的用法. 當我們多參考別人、多總結別人構建的項目, 慢慢地就會培養出經驗。但是網上react + mock.js
項目mock用得很規范的實在是不多。手頭上的線上項目源碼閱讀起來又有一點吃不消, 打算去纏着大佬打破砂鍋問到底 =.=
等我總結了更好的使用方式再回來更新!

============================== 我還會回來補充的 ==============================