前后端聯(lián)調(diào)

問題:

小張同學(xué)的項目采用的是前后端分離架構(gòu),現(xiàn)在前后端程序猿已經(jīng)碰過面畦娄,協(xié)商好了一些前端需要的數(shù)據(jù)接口沈撞,于是前后端程序猿同時開工碼代碼蜈垮。

這時候小張同學(xué)某個頁面需要后端數(shù)據(jù),但是后端叔叔還沒有將該數(shù)據(jù)的借口開發(fā)出來菊碟,此時小張只能做假數(shù)據(jù)(專業(yè)點叫mock數(shù)據(jù)节芥,_),但是小張的ajax的借口寫的是與后端叔叔商量好的絕對路徑(域名+請求路徑+請求參數(shù)逆害,跨域問題已解決)头镊,因為這是以后真正的請求路徑,所以小張又不像先寫本地相對路徑魄幕,后期再來修改(萬一后臺叔叔開發(fā)的慢了相艇,鬼知道有多少接口要修改呀)。于是他就迷茫了纯陨。坛芽。。

仔細看看這其實就是前后端分離中的mock數(shù)據(jù)和聯(lián)調(diào)的問題翼抠,就現(xiàn)在來說能解決的方式有很多種咙轩。先說mock數(shù)據(jù),gulp阴颖,webpack活喊,fekit(去哪兒網(wǎng)的一款前端自動化構(gòu)建工具,據(jù)說歷史比webpack和gulp都要久遠)等等自動化構(gòu)建工具都有mock數(shù)據(jù)的功能膘盖,這不是問題胧弛;再說絕對路徑的問題,其實只需要做一個host的映射就行了侠畔。

進入正題结缚,前后端聯(lián)調(diào)。

什么是前后聯(lián)調(diào)

我的理解是前后端聯(lián)調(diào)是一種真實業(yè)務(wù)數(shù)據(jù)本地mock數(shù)據(jù)之間來回切換以達到前后端分離架構(gòu)下的不同開發(fā)速度時數(shù)據(jù)交換的一種方式方法(有點繞)软棺。

為什么要前后端聯(lián)調(diào)

前面解釋前后端聯(lián)調(diào)是可能有些繞红竭,這里舉例來說明一下。

回到上面小張的問題喘落,假設(shè)小張現(xiàn)在ajax中的url寫的是相對路徑(如:./mock/user.json)茵宪,小張現(xiàn)在面臨的是后端接口沒有數(shù)據(jù),需要本地mock數(shù)據(jù)瘦棋,但是當(dāng)后端接口開發(fā)完成稀火,并且有了測試數(shù)據(jù)后,小張是不是需要切換到后端數(shù)據(jù)呢赌朋?答案是肯定的凰狞,但是小張需要在本地mock數(shù)據(jù)和后端接口數(shù)據(jù)之間來回切換,為什么呢沛慢?很明顯嗎赡若,本地的mock數(shù)據(jù)是小張自己寫的,肯定符合前端需求团甲,但是后端接口首先需要測試通不通逾冬?還需要測試數(shù)據(jù)格式對不對?有可能前兩部都整好了躺苦,但是后端還沒有填寫足夠的數(shù)據(jù)(比如身腻,列表頁,小張想分頁圾另,后端叔叔就寫了兩條測試數(shù)據(jù)霸株,你咋整?)集乔,所以呀去件,小張需要根據(jù)后端叔叔對接口的調(diào)整不斷的來回切換url,這樣豈不是還在受后端的影響扰路,還談毛線前后端分離呀尤溜!

所以當(dāng)我們在前后端分離架構(gòu)中,不斷來回切換本地mock數(shù)據(jù)和后端接口數(shù)據(jù)時就遇到了聯(lián)調(diào)的問題汗唱。

實現(xiàn)前后端聯(lián)調(diào)

首先我們已經(jīng)知道宫莱,在現(xiàn)在流行的“前后端完全分離”架構(gòu)中,前后端聯(lián)調(diào)是一個不可能避免的問題哩罪,就我目前對前后端聯(lián)調(diào)的理解來說授霸,我認為需要聯(lián)調(diào)的有以下兩個方面的資源:

css巡验、js、圖片等前端靜態(tài)資源文件碘耳。

ajax獲取的后端數(shù)據(jù)显设。

而前后端分離的架構(gòu)的應(yīng)用可能也分為兩種情況:

前后端完全分離,前后端分別擁有自己的域名和服務(wù)器辛辨。

前后端開發(fā)分離登夫,但是部署時是一個域名和一臺服務(wù)器乾蛤。

還有就是需要聯(lián)調(diào)的場景也是兩種情況:

開發(fā)階段

調(diào)試階段

針對以上2方面資源和2種應(yīng)用情況還有2種場景(2到家了遥皂。叶眉。。)僻焚,接下來我們看看怎樣通過mock數(shù)據(jù)和host的映射來實現(xiàn)解決這些問題允悦。

先解釋一下 ‘222’

2種資源

為什么我將資源分為兩種呢?首先來看css溅呢、js文件和圖片是通過link澡屡、scripts、img標(biāo)簽來引入的(樣式中的圖片也是一個道理)咐旧, 它們是不存在跨域問題的驶鹉,你在哪里引入都無所謂。

而ajax獲取后端數(shù)據(jù)是有跨域問題的铣墨,雖然說可以解決室埋,但是有可能是該數(shù)據(jù)(或者后端部署環(huán)境)和上面的css、js伊约、圖片等靜態(tài)資源是不在同一臺服務(wù)器上的姚淆,也可能是同一臺服務(wù)器不同域名下的,如果都在同一域名同一服務(wù)器下屡律,開發(fā)階段肯定也不在一起吧腌逢!

2種應(yīng)用情況

雖然架構(gòu)可以采用前后端分離,但是部署有可能就不一樣了超埋,這和項目的大小搏讶,公司的情況等等都有關(guān)系了,一個百八十人用的小系統(tǒng)霍殴,還得兩臺服務(wù)器兩個域名媒惕,你不覺著浪費嗎?

2種不同的部署情況直接導(dǎo)致了前期在設(shè)計聯(lián)調(diào)方案的時候就不同了来庭,下面會詳細介紹妒蔚。

2種開發(fā)場景

這不用多說了,雖然現(xiàn)在主張前后端分離,但也不能不和后端叔叔親近親近了呀肴盏,不然誰給你數(shù)據(jù)區(qū)科盛,所以說真?zhèn)€開發(fā)階段都可能遇到聯(lián)調(diào)的問題。

聯(lián)調(diào)開始

在講解聯(lián)調(diào)之前菜皂,你需要了解主流自動化構(gòu)建工具本地mock數(shù)據(jù)的方法土涝,本例以gulp來講解,不了解的小伙伴可以看看Gulp和Webpack對比的mock數(shù)據(jù)部分幌墓。

開發(fā)階段

兩臺服務(wù)器對應(yīng)兩個域名

這是最nice的方案,也是聯(lián)調(diào)最舒服的方式冀泻。

在這種方式下常侣,前后和后端各有各的服務(wù)器和域名。后端會把他們開發(fā)的后端業(yè)務(wù)代碼弹渔,實時的上傳到服務(wù)器上(也可能不是胳施,如放在后端叔叔自己的電腦上,實現(xiàn)是一樣的肢专,只不過域名變成了叔叔的ip地址)舞肆;而我們前端的代碼會實時的上傳到我們前端的服務(wù)器上(同理也可能在自己的電腦上,開發(fā)完一塊上傳)博杖。

為了后面方面講解椿胯,前端服務(wù)器域名為“chping.website”,后端服務(wù)器域名為"chping.site"剃根。

css哩盲、js和圖片等靜態(tài)文件

此時,我們的靜態(tài)文件的請求路徑建議使用我們前端服務(wù)器的絕對路徑狈醉,為什么呢廉油?因為如果我們寫本地的相對路徑,等把我們的入口文件交給后端后苗傅,路徑還是絕對路徑抒线,豈不是成了后端服務(wù)器的路徑了,那就壞菜了渣慕,還得一個一個修改成我們前端的絕對路徑(如:http://chping.website/css/reset.css)嘶炭。

那可能有小伙伴說,這樣的話摇庙,我在開發(fā)階段旱物,我們的服務(wù)器上還沒有自己的靜態(tài)文件呢,去請求的話卫袒,會報404的宵呛!

對的,這時候就該我們的host的出場了夕凝,我們知道當(dāng)進行域名解析的時候宝穗,第一步是在瀏覽器緩存中尋找户秤,如果沒找到,第二步在我們系統(tǒng)的緩存中尋找(就是本地的hosts文件)逮矛,然后....(想詳細了解請看網(wǎng)絡(luò)請求過程掃盲的DNS解析部分)就沒有然后了鸡号。既然域名解析需要通過hosts文件這一步,那么我們就修改一下它须鼎,讓訪問http://chping.website這個域名的請求鲸伴,全都訪問我們本地的mock數(shù)據(jù)就好了呀!

在hosts文件中添加下面這一條

127.0.0.1chping.website

好的晋控,搞定汞窗,從此以后所有訪問域名http://chping.website的請求都會被映射到本地了,然后再結(jié)合gulp的mock數(shù)據(jù)赡译,就完成了你寫的是域名+絕對路徑(如:http://chping.website/css/reset.css)仲吏,但是請求的卻是你本地mock的數(shù)據(jù)(上面的請求會被映射到http://localhost/css/reser.css)。這樣你就不需要來回修改請求路徑了_蝌焚。

ajax后端數(shù)據(jù)

開發(fā)工程中裹唆,靜態(tài)文件的聯(lián)調(diào)問題可能還是比較少的,特征也不明顯只洒。但是通過ajax獲取后端數(shù)據(jù)使用聯(lián)調(diào)的情況可就多了去了许帐,前面為什么要前后端聯(lián)調(diào)一節(jié)中已經(jīng)通過小張的例子說明了,就不在贅述了毕谴。

其實在介紹完css舞吭、js、圖片等靜態(tài)文件一節(jié)析珊,相信你也能猜到了怎么去前后端聯(lián)調(diào)了羡鸥。很簡單,ajax中的請求還是寫絕對路徑(如:http://chping.site/userlist忠寻,獲取用戶列表)惧浴,此時后端接口如果沒有開發(fā)好,和上一節(jié)一樣通過hosts文件的修改可以實現(xiàn)chping.site域名映射到本地來奕剃。如果后端像讓你給他測試一下接口獲取的數(shù)據(jù)對不對衷旅,你可以在修改一下hosts文件就可以了。

可能還有小伙伴問了纵朋,這樣還不是改來改去柿顶,麻煩死了。首先來說操软,相比較你修改多個url地址和修改一個hosts文件嘁锯,孰輕孰重,一目了然;其次家乘,怎么可能讓你去每次都去修改hosts文件呢蝗羊,麻煩死了。現(xiàn)在向大家推薦一款小插件仁锯,在google商店里搜索一下HostAdmin就找到它了耀找,下載安裝就好了,然后簡單配置一下你的hosts地址业崖,就可以愉快地切換hosts的映射了(HostAdmin的使用自行g(shù)oogle野芒,干這行豈能不會用軟件)。

好了双炕,兩臺服務(wù)器對應(yīng)兩個不同域名的場景在開發(fā)階段就這樣愉快地結(jié)束了复罐。但是在實際開發(fā)中,中小公司很少給你兩臺服務(wù)器和兩個域名的雄家,一般正常情況就是一臺服務(wù)器一個域名的。

一臺服務(wù)器一個域名

我仔細想一下胀滚,此時這個服務(wù)器會給誰管理呢趟济?

想都不用想肯定不是前端,后端叔叔比你對服務(wù)器熟悉多了咽笼,交給你去管理那是出鬼了(我還真遇到過顷编,不過也是給后端首先使用,最后才把前端的代碼放到服務(wù)器上)剑刑,所以說在這種情況下媳纬,你就老老實實在本地開發(fā)就行了。

css施掏、js和圖片等靜態(tài)文件

這時候的靜態(tài)文件再開發(fā)階段不需要任何考慮钮惠,按照你喜歡的相對路徑或者相對于項目的根路徑的形式寫就行了,因為早晚還得交給后端七芭。但是素挽,需要注意:

如果你采用相對項目根路徑的書寫方式來寫你的靜態(tài)文件路徑時,一定要先和后端叔叔商量好狸驳,將來項目部署的時候他會把你的前端整個項目放在哪里预明?如果不是根目錄下,你就掛了耙箍。比如:你的reset.css的路徑時/exports/styles/common/reset.css撰糠,后端叔叔把你前端項目放在了根目錄下的frontEnd文件夾下,reset.css文件就報404了辩昆。

如果后端采用的java阅酪,你需要特別注意的是,tomcat的根目錄并不是webapps文件,而后端項目默認是部署在webapps/ROOT文件下的遮斥,所以你如果使用了相對項目根路徑的書寫方式來寫你的靜態(tài)文件路徑時峦失,對不起又是404了。

ajax后端數(shù)據(jù)

因為現(xiàn)在唯一的一臺服務(wù)器還是在后端叔叔那里术吗,所以此時你還是可以寫絕對路徑(域名+請求路徑)尉辑,利用hosts文件來改變域名映射實現(xiàn)聯(lián)調(diào)。

開發(fā)階段小結(jié)

其實在開發(fā)階段做聯(lián)調(diào)的情況還是很少的较屿,一般都在自己的機器上開發(fā)隧魄,后端會自己做單元測試,根本不用前端來給他做測試的(先別罵隘蝎,完事一塊购啄,哈哈);而前端更不需要了嘱么,都在自己機器上開發(fā)狮含。及時有兩臺服務(wù)器和域名,有幾個每開發(fā)一個功能就上傳服務(wù)器呀(此服務(wù)器指項目上線時部署的服務(wù)器)曼振,有病吧几迄!所以說,在這個階段只需要做好hosts映射就行了冰评,不會讓你來回切換域名映射的映胁。

但是接下來的調(diào)試階段就不一樣了,項目前后端大體都已經(jīng)開發(fā)完成了甲雅,Beta版本已經(jīng)部署了解孙,這時候如果出現(xiàn)bug就需要頻繁的線上線下(真實數(shù)據(jù)和mock數(shù)據(jù))切換了。

調(diào)試階段

調(diào)試階段的情況說明剛才提了一下抛人,現(xiàn)在再詳細的闡述一下:

首先弛姜,已發(fā)布的Beta版本在測試的時候,發(fā)現(xiàn)前端頁面上有個地方有個小bug妖枚,需要你修改一下娱据,于是你訪問線上的頁面,看了一下這個bug盅惜,發(fā)現(xiàn)是某個css樣式文件里面出錯了中剩,于是你希望在本地修改,然后線上版本可以直接查看抒寂,這樣就可以實時看到你的修改在線上的真實樣子了结啼。

兩臺服務(wù)器兩個域名

這里就不在分靜態(tài)文件和后端數(shù)據(jù)分開介紹了,其實道理都一樣的屈芜,另外此時后端數(shù)據(jù)都是真實的了郊愧,也不需要你管后端了朴译,此時你本地的mock數(shù)據(jù)已經(jīng)下崗了。

首先你只需要打開前面你安裝的HostAdmin属铁,通過它配置一下你的hosts文件(如果年前面的做了眠寿,此時你已經(jīng)配置好了),然后chping.website這個域名你可以在本地和線上之間來回切換了焦蘑。

再具體一點就是:

啟動你本地的項目

將chping.website域名通過HostAdmin設(shè)置為

127.0.0.1? ? ? ? chping.website# 202.201.112.232? chping.website? //假設(shè)202.201.112.232是線上服務(wù)器的ip

打開瀏覽器盯拱,并清除一下瀏覽器緩存,重新打開你們開發(fā)的網(wǎng)站例嘱。此時網(wǎng)站是獲取到的靜態(tài)資源就是從你本地獲取的了狡逢,但是ajax獲取的數(shù)據(jù)確實后端返回的真是數(shù)據(jù)。

然后你開始修改bug拼卵,這時候線上的版本可以實時查看你修改的前端內(nèi)容奢浑,修改完bug,QA說了OK腋腮,你就可以把修改的文件替換掉服務(wù)器上的版本就行了雀彼。

一臺服務(wù)器一個域名

這種情況就復(fù)雜了,此時只有一個域名即寡,如果你開發(fā)階段是按照我前面說的徊哑,寫的是相對路徑,那么此時你是沒有辦法實現(xiàn)兩臺服務(wù)器兩個域名那種線下修改嘿悬,線上查看的高大上聯(lián)調(diào)的。那該怎么辦呢水泉?

第一種方式就是善涨,你在本地修改,本地查看草则,測試好了以后上傳到服務(wù)器钢拧,看看線上環(huán)境可不可以,OK當(dāng)然好炕横;不行就本地接著改源内,然后在上傳。

第二種方式就是份殿,在開發(fā)階段你給靜態(tài)文件前面加上一個假的域名膜钓,然后像兩個域名一樣進行假的域名與本地映射配置,然后像兩個域名一樣開發(fā)卿嘲。等部署的時候颂斜,在服務(wù)器上也暫時做一個本地映射,你就可以實現(xiàn)同兩個域名一樣的線下修改拾枣,向上查看了沃疮。但是盒让,最后真正上線的時候,你就需要收到司蔬,把假域名全部刪掉邑茄。所以說,一臺服務(wù)器一個域名的時候俊啼,前端靜態(tài)文件做聯(lián)調(diào)是很不方便的肺缕。

小結(jié)

總結(jié)一下,前后端聯(lián)調(diào)是一種真實業(yè)務(wù)數(shù)據(jù)本地mock數(shù)據(jù)之間來回切換以達到前后端分離架構(gòu)下的不同開發(fā)速度時數(shù)據(jù)交換的一種方式方法吨些,而實現(xiàn)就是利用自動化構(gòu)建工具的mock數(shù)據(jù)功能和修改域名解析文件hosts來實現(xiàn)的搓谆。

如果你的項目是兩臺服務(wù)器和兩個域名,隨便你折騰豪墅。但是如果你是一臺服務(wù)器和一個域名的話泉手,就有些麻煩了,而這個麻煩僅對于你前端靜態(tài)文件聯(lián)調(diào)有影響偶器,需要你好好思考一下怎么解決了斩萌。

想要了解解決方案,請先關(guān)注屏轰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颊郎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霎苗,更是在濱河造成了極大的恐慌姆吭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁盏,死亡現(xiàn)場離奇詭異内狸,居然都是意外死亡,警方通過查閱死者的電腦和手機厘擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門昆淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刽严,你說我怎么就攤上這事昂灵。” “怎么了舞萄?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵眨补,是天一觀的道長。 經(jīng)常有香客問我倒脓,道長渤涌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任把还,我火速辦了婚禮实蓬,結(jié)果婚禮上茸俭,老公的妹妹穿的比我還像新娘。我一直安慰自己安皱,他們只是感情好调鬓,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酌伊,像睡著了一般腾窝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上居砖,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天虹脯,我揣著相機與錄音,去河邊找鬼奏候。 笑死循集,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔗草。 我是一名探鬼主播咒彤,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咒精!你這毒婦竟也來了镶柱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤模叙,失蹤者是張志新(化名)和其女友劉穎歇拆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體范咨,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡故觅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了湖蜕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逻卖。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡宋列,死狀恐怖昭抒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炼杖,我是刑警寧澤灭返,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坤邪,受9級特大地震影響熙含,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艇纺,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一怎静、第九天 我趴在偏房一處隱蔽的房頂上張望邮弹。 院中可真熱鬧,春花似錦蚓聘、人聲如沸腌乡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与纽。三九已至,卻和暖如春塘装,著一層夾襖步出監(jiān)牢的瞬間急迂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工蹦肴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僚碎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓冗尤,卻偏偏與公主長得像听盖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裂七,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容