我的職業(yè)是前端工程師【七】:你真的懂前后端分離嗎?

前后端不分離,是怎樣的?大概也只有我們這些『老古董』們,才對此有更多感受。不對,那些寫 React 的人,可能會對此也有一些體會。

今天,如果有一個前端工程師說,不知道前后端分離是什么。那么,要么是剛畢業(yè)不久的,要么是從老版的公司里出來的員工,要么是剛從時光機里出來的。

前后端分離

我剛開始接觸前后端分離的時候,正值它開始慢慢擴散的時候,也還沒有意識到它帶來的好處。覺得它甚是麻煩,當(dāng)我改一個接口的時候,我需要同時修改兩部分的代碼,以及對應(yīng)的測試。反而,還不如直接修改原有的模板來得簡單。

可是當(dāng)我去使用這個,由前后端分離做成的單頁面應(yīng)用時,我開始覺得這些是值得。當(dāng)頁面加載完后,每打開一個新的鏈接時,不再需要等網(wǎng)絡(luò)返回給我結(jié)果;我也能快速的回到上一個頁面,像一個 APP 一樣的體現(xiàn)這樣的應(yīng)用。整個過程里,我們只是不斷地從后臺去獲取數(shù)據(jù),不需要重復(fù)地請求頁面——因為這些頁面的模板已經(jīng)存在本地了,我們所缺少的只是實時的數(shù)據(jù)。

后來,當(dāng)我從架構(gòu)去考慮這件事時,我才發(fā)現(xiàn)這種花費是值得的。

什么是前后端分離?

前后端分離和微服務(wù)一樣,漸漸地影響了新的大型系統(tǒng)的架構(gòu)。微服務(wù)和前后端分離要解決是類似的問題,解耦——可以解耦復(fù)雜的業(yè)務(wù)邏輯,解耦架構(gòu)。可要是說相像吧,消息隊伍和前后端便相似一些,通過傳遞數(shù)據(jù)的形式來解耦組件。

前后端分離意味著,前后端之間使用 JSON 來交流,兩個開發(fā)團隊之間使用 API 作為契約進行交互。從此,后臺選用的技術(shù)棧不影響前臺。當(dāng)后臺開發(fā)人員選擇 Java 的時候,我可以不用 JSP 來編寫前端頁面,繼續(xù)使用我的 React 又或者 Angular。而我使用 React 時,也不影響后臺使用某一個框架。

概念我們已經(jīng)清楚了,但是還有一個問題:我們真的需要前后端分離嗎?

真的需要前后端分離嗎?

過去,聽說 TDD (Test-driven development,測試驅(qū)動開發(fā)) 可以改善代碼的質(zhì)量,我們便實施了 TDD;接著,聽說 BDD (Behavior-driven development,行為驅(qū)動開發(fā)) 可以交付符合業(yè)務(wù)需求的軟件,我們便實施了 BDD;后來,聽說 DDD (Domain-driven design,領(lǐng)域驅(qū)動設(shè)計) 可以分離業(yè)務(wù)代碼與基礎(chǔ)代碼,我們便實施了 DDD。今天,聽說了前后端分離很流行,于是我們就實施了前后端分離——這就是傳說中的 HDD(Hype-driven Development,熱鬧驅(qū)動開發(fā))。

前后端分離在過去的兩三年里,確實特別的熱鬧。但是我們怎么才能知道,是不是需要這樣的架構(gòu)呢?

  • 頁面交互是否復(fù)雜 ? 是簡單的提供頁面給用戶瀏覽?或者想要支持復(fù)雜的用戶操作?
  • 是否需要搜索引擎優(yōu)化?如果需要的話,那么從一開始我們就需要考慮后端渲染。
  • 能提升開發(fā)效率嗎?如果不能有效的提升開發(fā)效率,為什么要作死呢?
  • 是否會提供 API 給 APP?如果我們已經(jīng)有一個 API 提供給 APP,那么要做這件事就很容易了。如果未來會有的話,那么我們更應(yīng)該嘗試去分離。
  • 前端的修改是不是非常頻繁?如果不需要經(jīng)常修改的話,那么這種優(yōu)化便沒有優(yōu)勢。

當(dāng)然了,如果老板說,我們需要前后端分離,那就做唄!很多時候,一些技術(shù)決策都會由于戰(zhàn)略原因,而發(fā)生一些有意思的變化。

前后端分離將遇到的那些挑戰(zhàn)

而,當(dāng)我們決定需要前后端分離時,我們?nèi)匀贿€需要面對一系列的問題:

  • 是否足夠的安全?如果我們設(shè)計出來的架構(gòu)不夠安全,那么這一系列的操作都是白搭。我們怎么去存儲用戶數(shù)據(jù),使用 LocalStorage 的話,還要考慮加密。采用哪種認(rèn)證方式來讓用戶登錄,并保存相應(yīng)的狀態(tài)?
  • 是否有足夠的技術(shù)來支撐前后端分離?有沒有能力創(chuàng)建出符合 RESTful 風(fēng)格的 API?
  • 是否有能力維護 API 接口?當(dāng)前端或者后臺需要修改接口時,是否能輕松地修改。
  • 前后端協(xié)作的成本高不高?前端和后臺兩個團隊是不是很容易合作?是不是可以輕松地進行聯(lián)調(diào)?
  • 前后端職責(zé)是否能明確?即:后臺提供數(shù)據(jù),前端負(fù)責(zé)顯示
  • 是否建立了前端的錯誤追蹤機制?能否幫助我們快速地定位出問題。

當(dāng)我們在不同的項目組上嘗試時,就會發(fā)現(xiàn)主要的挑戰(zhàn)是溝通上的挑戰(zhàn),而非技術(shù)上的局限。

前后端分離的核心:后臺提供數(shù)據(jù),前端負(fù)責(zé)顯示

我曾經(jīng)有過使用 PHP 和 Java 開發(fā)后臺代碼的經(jīng)歷,仍然也主要是集中在前端領(lǐng)域。在這樣的傳統(tǒng)架構(gòu)里,編寫前端頁面可不是一件容易的事。后臺只會傳給前端一個 ModelAndView,然后前端就要撲哧撲哧地去豐富業(yè)務(wù)邏輯。

傳統(tǒng)的 MVC 架構(gòu)里,因為某些原因有相當(dāng)多的業(yè)務(wù)邏輯,會被放置到 View 層,也就是模板層里。換句話來說,就是這些邏輯都會被放到前端。我們看到的可能就不是各種ifelse還有簡單的equal判斷,還會包含一些復(fù)雜的業(yè)務(wù)邏輯,比如說對某些產(chǎn)品進行特殊的處理。

如果這個時候,我們還需要做各種頁面交互,如填寫表單、Popup、動態(tài)數(shù)據(jù)等等,就不再是簡單的和模板引擎打交道了。我們需要編寫大量的 JavaScript 代碼,因為業(yè)務(wù)的不斷增加,僅使用 jQuery 無法管理如此復(fù)雜的代碼。

輸出邏輯:數(shù)據(jù)顯示

而僅僅只是因為邏輯復(fù)雜的前端代碼,無法影響大部分團隊進行前后端分離——因為它沒有業(yè)務(wù)價值。實際上是先有了單頁面應(yīng)用,才會出現(xiàn)前后端分離。單頁面應(yīng)用可以讓用戶不需要下載 APP,就可以擁有相似的體現(xiàn)。并且與早期的移動網(wǎng)頁相比,擁有更好的體驗。

為了達到這樣的目的,后臺似乎返回對應(yīng)的 Model 即可,稍微修改一下 Controller 的邏輯,然后返回這些數(shù)據(jù)。

[{
    "content": "",
    "date": "2017-03-04",
    "description": "前后端分離,你應(yīng)該知道的八件事\r\n\r\n前后端不分離,是怎樣的?大概也只有我們這些『老古董』們,才對此有更多感受。不對,那些寫 React 的人,可能會對此也有一些體會。",
    "id": 1,
    "slug": "iamafe-frontend-backend",
    "title": "我的職業(yè)是前端工程師:  前后端分離,你應(yīng)該知道的八件事",
    "user": ""
}]

前端在一個 API 請求之后,可以直接渲染這些數(shù)據(jù)成 HTML。在這個時候,我們?nèi)匀豢梢钥吹剑厦鏀?shù)據(jù)中的 date 字段值 2017-03-04 的格式,和我們?nèi)粘S玫?2017 年 3 月 4 號的不一樣。所以,我們需要在前端引入 moment 這樣的庫,然后解析這個值。如果僅僅是這樣的處理,那么應(yīng)該由后臺幫我們轉(zhuǎn)換這個值。

與此同時,后臺應(yīng)該按時間來對博客進行排序。前端只需要遍歷這個數(shù)組,隨后取出相應(yīng)的值顯示即可,不需要做任何的邏輯處理。

遺憾的是,在真正的項目中開發(fā)的時候,并不能達到這么完美的狀態(tài)。特別是,為了提高用戶體驗時,我們可能就會將數(shù)據(jù)存儲在本地,隨后直接操作這些數(shù)據(jù),對其進行排序,篩選等等的操作。除此,還有諸如表格、圖表等等的高級樣式,也需要處理這些數(shù)據(jù)。

而當(dāng)用戶需要提交數(shù)據(jù)的時候,這些邏輯就會落到前端上。

不可避免的前端邏輯:表單

如果一個前端應(yīng)用只顯示數(shù)據(jù)的話,那么這個應(yīng)用就沒有充足的理由,做成一個單頁面應(yīng)用——單頁面應(yīng)用是為了更好的交互而存在的。當(dāng)我們注冊、登錄、購買東西時,就需要開始與表單進行處理。

合理的表單驗證模式應(yīng)該是:雙向驗證

前端在用戶輸入的過程中就需要實時地檢查,是否帶有特殊符號、值是否是在允許的范圍內(nèi)、是不是符合相應(yīng)的規(guī)范等等。而不是等用戶填寫完內(nèi)容并提交后,再由服務(wù)端來告訴用戶說,“你的用戶名不符合規(guī)范”。

服務(wù)在收到前端收到的數(shù)據(jù)后,不管前端有沒有進行驗證,都應(yīng)該按后臺的邏輯進行驗證。

于是乎在這個時候,這些邏輯就被無可避免地放到前臺里了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,958評論 2 373

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,637評論 25 708
  • 前端 前后端分離 這不是一篇純技術(shù)文章,而是一篇分享我個人在前后端分離路上收獲的點點滴滴的文章,以此來為準(zhǔn)備嘗試前...
    寒劍飄零閱讀 1,896評論 0 22
  • 本文系轉(zhuǎn)載,原作者,普元,敖顯奇 轉(zhuǎn)載本文需保留此處版權(quán)聲明:本文版權(quán)屬于EAII企業(yè)架構(gòu)創(chuàng)新研究院(微信號:ea...
    普元云計算閱讀 4,991評論 8 96
  • 關(guān)注到黃致列,我才發(fā)現(xiàn),原來黃致列已閃亮了很久。 我后知后覺。 對于音樂,我沒有絲毫鑒賞能力,陽春白雪與下里巴人這...
    杳南山閱讀 1,513評論 3 12
  • ORID分別指 Objective 客觀事實層次:我們的感官所接收到的外在現(xiàn)實;Reflective 感覺反應(yīng)層次...
    周冰冰8閱讀 1,343評論 0 1