這是我參與更文挑戰的第3天,活動詳情查看: 更文挑戰前端
如今開發模式通常都是先後端分離,那就免不了互相「遷就」,好比說後臺只把接口文檔大致定好了,接口還沒出,做爲前端的不能傻等着啊,可是不聯調的去開發,不少細節就照顧不到,很容易就出現臨近快交工的時候纔出接口(這裏不能狹隘的認爲後臺故意地,就是菜而已),當聯調的時候才發現不少問題,那就太尷尬了,若是延誤了,鍋很容易就蓋在了前端的頭上,得想個轍:react
首先安裝mockjs
ios
yarn add -D mockjs
複製代碼
而後看一下本身的網絡請求庫用的是啥:git
axios:github
...
import Mock from 'mockjs'
...
Mock.mock(apiUrl, mock)
...
複製代碼
fetch:就得特殊處理一下web
首先安裝mockjs-fetch
shell
yarn add -D mockjs-fetch
複製代碼
而後axios
...
import Mock from 'mockjs'
import mockFetch from 'mockjs-fetch';
mockFetch(Mock);
...
Mock.mock(apiUrl, mock)
複製代碼
到此基本操做就搞定了,但這還不夠。後端
我看過不少的項目,每每是寫了一堆。。。。慄🌰:api
import Mock from 'mockjs'
import { builder, getBody } from '../util'
const login = options => {
const body = getBody(options)
return builder(
{
id: Mock.mock('@guid'), //這個@是mockJs的佔位符,能夠到官網瞭解一下,這個不重要,咱們主要codeReview
name: Mock.mock('@name'),
username: 'admin',
password: '',
avatar:
'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png',
status: 1,
telephone: '',
lastLoginIp: '27.154.74.117',
lastLoginTime: 1534837621348,
creatorId: 'admin',
createTime: 1497160610259,
deleted: 0,
roleId: 'admin',
lang: 'zh-CN',
token: '4291d7da9005377ec9aec4a71ea837f'
},
'',
200
)
}
Mock.mock(/\/auth\/login/, 'post', login)
複製代碼
首先我們品評一下,不知道是否是個人「審美」怪,我看這樣的代碼多少有點彆扭。
mockjs
import { builder, getBody } from '../util'
複製代碼
Mock.mock(/\/auth\/login/, 'post', login)
而後執行了mock評價:
mockjs
庫,重複了雖然就一條,但還算能忍。總結:
重複(哪怕只有幾條),關注的點多(哪怕只有幾個),硬編碼(哪怕只有一處),有能力重構就不能忍,咱們只是想mock數據,直接點,天然一點很差麼,就像字面那樣,我想「mock」一個「api」。
import BaseApi from './baseApi'
let config = {
fetchLightAdd: "/light/fetchLightAdd",
fetchLightUpdate: "/light/fetchLightUpdate",
fetchLightDetail: "/light/fetchLightDetail",
fetchTestDataList: "/light/fetchTestDataList",
}
export default new BaseApi({ config })
複製代碼
import BaseMock from './baseMock'
let config = {
fetchLightAdd: {
...
},
fetchLightUpdate: {
...
},
fetchLightDetail: (data) => {
const { body = {} } = data;
let params = JSON.parse(body);
//在這裏就各類模擬入參狀況發揮不一樣結果。
if (params.id === "0") {
return {
code: "200",
data: [{
lightName: "test_lightName_0",
comment: "test_comment_0",
lightItems: [{ lightItemId: 1, lightType: 0, baseSelect: 1, exclude: false }]
}]
}
} else if (params.id === "1") {
return {
code: "200",
data: [{
lightName: "test_lightName_1",
comment: "test_comment_1",
lightItems: [{ lightItemId: 1, lightType: 0, baseSelect: 0, exclude: 0 }, { lightItemId: 2, lightType: 1, baseSelect: 1, exclude: false }]
}]
}
}
},
fetchTestDataList: {
...
}
}
export default function mock(api) {
new BaseMock({ config, apiConfig: api.getUrlConfig() })
}
複製代碼
BaseMock
😂,(原本這句我都想省,但就擔憂代碼搞的很差懂了,要不我差點拔刀🐶)總結:就是一個簡單的數據結構,提供給你,配就完了,想mock哪一個接口,就寫這個接口名字,真是字面那樣:我想「mock」一個「api」,其餘不須要你關注了,就這麼簡單且天然。
{
/* 配置mock啓動 */
const { NODE_ENV, MOCK } = process.env;
if (NODE_ENV === "development") {
if (MOCK != "none") {
require('MOCK');
}
}
}
複製代碼
配置webpak的選項:
//isEnvProduction根據process.env.NODE_ENVde值判斷獲得的
externals:isEnvProduction?{
mockjs:mockjs
}:{}
複製代碼
首先Moderate打包速度仍是很快的,才21s,嘿嘿😁
而後看下報告:
要求別人不如要求本身來的實際,mock確實能緩解很多壓力,前端不容易,ta的難還不是那種~~~難,ta真的是那種,那種不多見的那種,神經病同樣的難度。