昨天跟同事討論咱們在用的rap2(一個集接口編寫和mock server的開源項目)和剛上線了一個easy-mock的server,到底哪一個好用。前端
咱們主要討論的點有個兩個: 接口的一致性、 編碼的無侵入性。java
自從先後端分離後,完成先後端的分工以後,你們就能夠各司其職,並行開發。先後端的協議標準就是接口文檔。前端的全部邏輯和展示所有依賴接口文檔中規定的數據結構。因此接口文檔就變成了開發過程的重中之重。webpack
固然有一份文檔也是不夠的,前端開發頁面邏輯調試、測試同窗測試接口、接口文檔不斷的更新、接口複雜的返回狀況等諸多問題,這就須要有一個Mock Server來幫忙。ios
更多的關於Mock內容的請你們自行Google瞭解再也不贅述。git
接口文檔,是整個開發過程當中的約定和依據,因此同步更新文檔也成爲關鍵一環。github
使用markdown維護一個文檔,更新以後分發給你們;或者就是放到wiki來管理,每次更新到wiki上面,供你們來閱讀。若是要Mock數據(easy-mock或者其餘mock server),相關人員修改mock字段,更新完畢。web
在線編輯接口,實時保存,同步更新。例如採用Rap2(支持JSON複製,支持接口的移動複製),保存後就是接口文檔,全部人實時更新,同時Mock數據自動更新。數據庫
Mock 對代碼的侵入越小,咱們維護和開發的成本也越低。以
Vue-cli2.x
生成的項目爲例:axios
在工程中的config目錄dev.env.js
,配置開發環境下API數據來源地址後端
...
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
ENV_CONFIG: '"dev"',
// BASE_API: '"dev server"',
BASE_API: '"http://rap2.taobao.org:8080/app/mock/39"', // mock server
})
複製代碼
這樣咱們在開發過程當中,用到axios
,只須要根據不一樣環境編寫一次代碼便可
const service = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? process.env.BASE_API : '/api',
...
});
複製代碼
從Mock數據切換到Dev Server的API只須要註釋一行配置文件代碼,無需修改項目源代碼。很是友好。
這時候咱們再看easy-mock 跟rap2生成的Mock Url:
http://easy-mock.com/mock/5c08e554bd9f9c3a01c5abf6/api/info
=> host/mock/projectId/:path
http://rap2.taobao.org:8080/app/mock/45/GET/api/info
=> host/app/mock/:repositoryId/:method/:path
複製代碼
ps:後來發現rap2的url能夠不帶method,可是就是不能使用restful API這種根據method區分的接口了。
從生成的url來看,rap2中有:method
的變量,如果要無縫切換須要更多的工做。沒法直接替換BASE_API
。若是在代碼裏拼接會有很大的代碼侵入性。
因此考慮在工程層面進行優化:
在工程目錄config
目錄中index.js
中,能夠設置代理來統一處理:method
變量。在proxyTable
對象中加入bypass
方法,對每一個經過代理的接口,處理request url成爲一個合格的rap2 mock的url。
module.exports = {
dev: {
...
proxyTable: {
'/api': {
target: config.BASE_API.substring(1, config.BASE_API.length - 1),
changeOrigin: true,
pathRewrite: {
'^/api': '/'
},
bypass: function (req, res, proxyOptions) {
if (proxyOptions.target.indexOf('mock') !== -1) {
const path = req.url.replace(proxyOptions.context, proxyOptions.context + '/' + req.method);
// path => /api/GET/path
req.url = path;
}
}
}
},
複製代碼
這樣就能無侵入性的使用rap2了。
從接口文檔的一致性和編碼的無侵入性來看,rap2可能更優一點,可是rap2畢竟是一個年輕的開源項目,不少機制並不完善。從去年年初使用rap2,最近升級到新版本數據庫表結構還要作映射調整,適合喜歡折騰的人。這樣easy-mock的穩定性優點就值得考慮。
在我看來,將來的Mock Server不僅僅只是一個Mock,確定是集 接口編寫 + 自動Mock於一身的,還有一些相似接口字段校驗的輔助功能。
我的仍是很看好rap2的,畢竟從rap1重構的項目,有必定的使用背景,重構應該能出更好的開源項目。
再次感謝開源項目對開發者帶來的便利。
Mock.js : mockjs.com/
easymock: easymock.org/
rap2 : rap2.taobao.org/