在 Angular-cli 中使用 simple-mock 實(shí)現(xiàn)前端開發(fā) API Mock 接口數(shù)據(jù)模擬

在前后端分離的開發(fā)模式中拆吆,接口數(shù)據(jù)模擬(API Mock)是不可避免的事情线婚。前端同學(xué)在應(yīng)對(duì)該情況時(shí)采取的辦法可以各種各樣洋措,大概的方案可能會(huì)是這幾類:

  1. 業(yè)務(wù)代碼中臨時(shí)寫上 mock 數(shù)據(jù)的邏輯
  2. 在前端引入 mock 服務(wù)或框架剑按,對(duì) HTTP 請(qǐng)求服務(wù)進(jìn)行攔截
  3. 代理轉(zhuǎn)發(fā)至自建的 mock server

本文主要介紹在 Angular-cli 中引入 simple-mock 以快速實(shí)現(xiàn)項(xiàng)目數(shù)據(jù)接口模擬功能的方法菇用。該方案本質(zhì)上為上述的第三種方案澜驮。

1 simple-mock 簡(jiǎn)介

simple-mock 是一個(gè)引入成本簡(jiǎn)單的 API Mcok 庫(kù),通過提供 API 方法供 node Server 調(diào)用惋鸥,以幫助 node Server 實(shí)現(xiàn) Mock 功能杂穷。實(shí)現(xiàn)該庫(kù)的主要目的還是為了懶,希望前端開發(fā)過程中 mock 數(shù)據(jù)能夠盡可能地簡(jiǎn)單卦绣。

與常見 Mock 庫(kù)或 Mock Server 有點(diǎn)不同的是耐量,它實(shí)現(xiàn)了自動(dòng)保存后端 API 數(shù)據(jù)的功能,如果你足夠懶且隨意滤港,可以不寫任何 mock 規(guī)則廊蜒。

2 在 Angular-cli 中使用 simple-mock

這里以 Angular-cli^7.0.0Angular^7.0.0 為例。

Angular-cli^7.0.0 在執(zhí)行 ng serve 時(shí)溅漾,內(nèi)部實(shí)際是采用 express 啟動(dòng) node server山叮,并且使用 http-proxy-middleware 實(shí)現(xiàn) HTTP API 代理。所以本文方案的本質(zhì)是在 http-proxy-middleware 執(zhí)行過程中添履,注入 simple-mock 相關(guān) API 實(shí)現(xiàn) Mock 功能屁倔。

在 Angular-cli 中引入 simple-mock 的方法十分簡(jiǎn)單。具體流程參考如下暮胧。

2.1 在項(xiàng)目中引入 simple-mock

| 1 | npm i -D @lzwme``/simple-mock |

| 2 | # or |

| 3 | yarn add -D @lzwme``/simple-mock |

2.2 增加配置文件angular.json 的代理配置項(xiàng)

在配置文件 angular.json 中的 serve/options 部分增加 proxyConfig 字段的配置锐借。參考:

| 01 | { |

| 02 | "serve"``: { |

| 03 | "builder"``: ``"@angular-devkit/build-angular:dev-server"``, |

| 04 | "options"``: { |

| 05 | "browserTarget"``: ``"github-user-search:build"``, |

| 06 | "liveReload"``: ``true``, |

| 07 | "open"``: ``true``, |

| 08 | "host"``: ``"localhost"``, |

| 09 | "port"``: 3008``, |

| 10 | "servePath"``: ``"/"``, |

| 11 | "publicHost"``: ``"localhost"``, |

| 12 | "proxyConfig"``: ``"config/ngcli-proxy-config.js" |

| 13 | }, |

| 14 | }, |

| 15 | } |

proxyConfig 的值 config/ngcli-proxy-config.js 為我們自定義的代理配置定義文件。

2.3. 新建自定義代理配置文件 config/ngcli-proxy-config.js

我們通過在自定義代理配置文件中引入 simple-mock 相關(guān) API 實(shí)現(xiàn) mock 功能往衷。

這里我們還引入了 co-body 用于解碼 post 請(qǐng)求的參數(shù)钞翔,以便于自定義 mock 規(guī)則時(shí)使用。

該文件內(nèi)容參考如下:

| 01 | const anyParse = ``require(``'co-body'``); |

| 02 | const apiMock = ``require(``'@lzwme/simple-mock'``); |

| 03 | const chalk = ``require(``'chalk'``); |

| 04 | const apiProxyList = ``{ |

| 05 | '/users/**'``: ``'[https://api.github.com/](https://api.github.com/)'``, |

| 06 | }; |

| 07 | /** |

| 08 | * ``詳細(xì)配置參考:https:``//www.npmjs.com/package/http-proxy-middleware |

| 09 | */ |

| 10 | const proxyCfg = ``Object.keys(apiProxyList).reduce((pCfg, key) => { |

| 11 | const proxyTarget = ``apiProxyList[key]; |

| 12 | |

| 13 | pCfg[key] = ``{ |

| 14 | target: proxyTarget, |

| 15 | changeOrigin: ``true``, |

| 16 | onProxyRes(proxyRes, req, res) { |

| 17 | apiMock.saveApi(req, res, proxyRes.headers[``'content-encoding'``]); |

| 18 | }, |

| 19 | async onProxyReq(proxyReq, req, res) { |

| 20 | // 嘗試解碼 post 請(qǐng)求參數(shù)至 req.body |

| 21 | if (!req.body && proxyReq.getHeader(``'content-type'``)) { |

| 22 | try { |

| 23 | req.body = ``await anyParse({req}); |

| 24 | } ``catch``(err) { |

| 25 | // console.log(err); |

| 26 | } |

| 27 | } |

| 28 | |

| 29 | apiMock.render(req, res).then(isMocked => { |

| 30 | if (!isMocked) { |

| 31 | console.log(chalk.cyan(``'[apiProxy]'``), req._parsedUrl.pathname, ``'\t'``, chalk.yellow(proxyTarget)); |

| 32 | } |

| 33 | }); |

| 34 | }, |

| 35 | }; |

| 36 | return pCfg; |

| 37 | }, {}); |

| 38 | module.exports = ``proxyCfg; |

以上操作完成炼绘,執(zhí)行 ng serve嗅战,即會(huì)在項(xiàng)目根目錄創(chuàng)建 mock 目錄和 simple-mock 的配置文件 simple-mock-config.js,這些文件都會(huì)在 .gitignore 中注入過濾規(guī)則俺亮,可以在本地隨意修改。

2.4 修改 simple-mock 配置文件

simple-mock 可以通過讀取配置文件 simple-mock-config.js 判斷 mock 的開啟或關(guān)閉疟呐。

對(duì)于針對(duì)本文實(shí)現(xiàn)的示例項(xiàng)目 github-user-search-ng脚曾,該配置文件內(nèi)容參考如下:

| 01 | module.exports = ``{ |

| 02 | mockFileDir: ``'mock'``, ``// path.contentlove(__dirname, 'mock'), // 指定 mock 文件存放的目錄 |

| 03 | isEnableMock: ``true``, ``// 是否開啟 Mock API 功能 |

| 04 | isAutoSaveApi: ``true``, ``// 是否自動(dòng)保存遠(yuǎn)端請(qǐng)求的 API |

| 05 | isForceSaveApi: ``false``, ``// 是否強(qiáng)制保存,否則本地有時(shí)不再保存 |

| 06 | // 自動(dòng)保存 API 返回內(nèi)容時(shí)启具,對(duì)內(nèi)容進(jìn)行過濾的方法本讥,返回為 true 才保存 |

| 07 | fnAutosaveFilter(content) { |

| 08 | // 示例: 不保存空的或 404 的內(nèi)容 |

| 09 | if (!content || content.message === ``'Not Found'``) { |

| 10 | return false``; |

| 11 | } |

| 12 | |

| 13 | return true``; |

| 14 | } |

| 15 | }; |

通過修改配置文件中的開關(guān),即可實(shí)現(xiàn) mock 功能的開啟或關(guān)閉了。

2.5 通過環(huán)境變量開啟或關(guān)閉 Mock 功能

除了讀取配置文件拷沸,simple-mock 還可以通過讀取環(huán)境變量判斷 mock 的開啟或關(guān)閉(環(huán)境變量的優(yōu)先級(jí)更高色查,方便將開關(guān)注入到工程化工具中),詳細(xì)用法參考 simple-mock 使用文檔撞芍。

例如在示例項(xiàng)目 github-user-search-ng中秧了,創(chuàng)建了 dev-start.bat 文件,在 window 下開發(fā)時(shí)序无,啟動(dòng)該文件即可即時(shí)選擇是否開啟 mock 功能验毡。

dev-start.bat 文件主要內(nèi)容參考:

| 01 | @title GMTS-FRONT-NG-START-HELPER |

| 02 | @``echo off |

| 03 | |

| 04 | set NODE_ENV=development |

| 05 | set MOCKAPI_ENABLE=N |

| 06 | set MOCKAPI_AUTOSAVE=N |

| 07 | set MOCKAPI_AUTOSAVE_FORCE=N |

| 08 | |

| 09 | set /p enablemock=Enable mockAPI?(y/): |

| 10 | if "%enablemock%"``==``"y" set MOCKAPI_ENABLE=mock |

| 11 | |

| 12 | set /p autosave=Auoto Save API Data?(y/): |

| 13 | if "%autosave%"``==``"y" set MOCKAPI_AUTOSAVE=save |

| 14 | |

| 15 | if "%enablemock%"``==``"y" goto run |

| 16 | |

| 17 | set /p forcesave=Force Save API Data?(y/): |

| 18 | if "%forcesave%"``==``"y" set MOCKAPI_AUTOSAVE_FORCE=force |

| 19 | |

| 20 | :run |

| 21 | echo ======================================================= |

| 22 | echo MOCKAPI_ENABLE = %MOCKAPI_ENABLE% |

| 23 | echo MOCKAPI_AUTOSAVE = %MOCKAPI_AUTOSAVE% |

| 24 | echo MOCKAPI_AUTOSAVE_FORCE = %MOCKAPI_AUTOSAVE_FORCE% |

| 25 | echo ======================================================= |

| 26 | |

| 27 | ng serve |

更多參考

github-user-search-ng 是為本文實(shí)現(xiàn)的一個(gè)示例項(xiàng)目,有興趣可前往查閱完整的倉(cāng)庫(kù)代碼帝嗡。

本文的方案本質(zhì)上是在 http-proxy-middleware 執(zhí)行過程中晶通,注入 simple-mock 相關(guān) API 實(shí)現(xiàn) Mock 功能。故本文的示例方法哟玷,實(shí)際適用于任何使用 http-proxy-middleware 作為 HTTP 代理的 node server 服務(wù)狮辽。在 simple-mock 的說明文檔中,則是以 node-http-proxy 代理庫(kù)作為示例巢寡,有興趣可進(jìn)一步參考研究隘竭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讼渊,隨后出現(xiàn)的幾起案子动看,更是在濱河造成了極大的恐慌,老刑警劉巖爪幻,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱皆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挨稿,警方通過查閱死者的電腦和手機(jī)仇轻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奶甘,“玉大人篷店,你說我怎么就攤上這事〕艏遥” “怎么了疲陕?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钉赁。 經(jīng)常有香客問我蹄殃,道長(zhǎng),這世上最難降的妖魔是什么你踩? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任诅岩,我火速辦了婚禮讳苦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吩谦。我一直安慰自己鸳谜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布式廷。 她就那樣靜靜地躺著咐扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懒棉。 梳的紋絲不亂的頭發(fā)上草描,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音策严,去河邊找鬼穗慕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妻导,可吹牛的內(nèi)容都是我干的逛绵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼倔韭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼术浪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寿酌,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胰苏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后醇疼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硕并,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年秧荆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倔毙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乙濒,死狀恐怖陕赃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颁股,我是刑警寧澤么库,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站豌蟋,受9級(jí)特大地震影響廊散,放射性物質(zhì)發(fā)生泄漏草则。R本人自食惡果不足惜失球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吭敢。 院中可真熱鬧幌氮,春花似錦缭受、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宇智,卻和暖如春蔓搞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背随橘。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工喂分, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人机蔗。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓蒲祈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親萝嘁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梆掸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359