這篇技術部落格是在知乎上看到的 知乎js大神張雲龍寫的 這裡貼過來記錄下,如果侵權 請告知将及時删除。
---------------------------
為了更好的分工合作,讓前端能在不依賴後端環境的情況下進行開發,其中一種手段就是為前端開發者提供一個web容器,這個本地環境就是 mock server。
要完整運作前端代碼,通常并不需要完整的後端環境,我們隻要在mock server中實作以下幾點就行了:
- 能渲染模闆
- 實作請求路由映射
- 資料接口代理到生産或者測試環境
能渲染模闆很簡單,在mock server中內建模闆引擎就行了,然後提供模拟的頁面資料用于完整渲染頁面,不過有時候生産環境中的模闆引擎可能有一些環境依賴的擴充,這個要單獨實作。
請求路由映射,實作原理就是要讓本地的mock server有一個router,能接收所有HTTP請求,然後在router中根據線上的路由約定,實作一套一樣的規則,這個也不難,不贅述了。
最後資料接口代理。與前端相關的HTTP請求一共就3種響應情況:
- 渲染頁面的請求;
- 靜态資源的請求;
- 擷取資料的請求。
由于實作了router,我們把渲染頁面的請求在mock server中處理掉,直接輸出本地模闆的渲染結果;靜态資源的請求直接傳回檔案内容;而把資料請求代理到測試或者生産環境,本地就不用mock了(當然,如果出現新的接口測試環境沒有的,可以追加router,在mock server想響應假資料)
至于題主說的url一緻性問題,其實不存在的。你的這個 http://www.foo.com/bar 的資料請求,在js中應該這樣寫:
這種寫法,省略了host,線上下開發時,其最終結果是請求 http://127.0.0.1:3000/bar,而由于我們在mock server中實作了路由規則,這個請求實際上被代理到了測試/生産環境去擷取資料。而當你把代碼部署到線上時,其通路真實請求位址又自動變成了你期望的 http://www.foo.bar,正常運作。
補充一些Tips:
- 由于Mock Server需要具備渲染模闆的能力,是以可能需要一種輕量的服務端跨平台server實作方案,如果是java的後端,可以考慮使用jetty,一個1.8M的jar即可;如果是php的後端,可以考慮使用php 5.4以後内置的server,啟動指令是 php -S 127.0.0.1:3000 router.php;如果是Nodejs,那就很簡單了,估計都不需要Mock Server,本地也可以跑的
- 當代理資料接口的生産/測試環境不具備新接口的時候,Mock Server要在本地制造假資料響應請求,可以使用 http://beta.json-generator.com/ 這類線上的JSON資料生成工具,非常友善。
很多前端工程師以為前端分離的唯一途徑是接入NodeJS作為UI層,其實不是的,還有一種方案就是這種Mock Server,前端工程師直接寫後端模闆,效果有時候甚至更好,而且對已有前後端架構的改動成本最小。
====== 更新 ======
常用腳本語言下開啟簡易web server的方法,可以用于實作Mock Server:
-
- ruby -run -e httpd . -p 9090
- python -m SimpleHTTPServer 8000
- php -S 127.0.0.1:8088 router.php
轉載于:https://www.cnblogs.com/lxin/p/4812521.html