原文 https://www.cnblogs.com/cloudml/p/4665458.html
另外一篇:https://www.cnblogs.com/MuYunyun/p/7364594.html
1.什么是前后端分離
傳統的SPA模式:所有用到的展現數據都是后端通過異步接口(AJAX/JSONP)的方式提供的,前端只管展現。
從某種意義上來說,SPA確實做到了前后端分離,但這種方式存在兩個問題:
- WEB服務中,SPA類占的比例很少。很多場景下還有同步/同步+異步混合的模式,SPA不能作為一種通用的解決方案。
- 現階段的SPA開發模式,接口通常是按照展現邏輯來提供的,而且為了提高效率我們也需要后端幫我們處理一些展現邏輯,這就意味着后端還是涉足了view層的工作,不是真正的前后端分離。
現階段:從職責上划分才能滿足目前我們的使用場景:
- 前端:負責View和Controller層
- 后端:只負責Model層,業務處理/數據等。
2.怎么做前后端分離
- 前端:負責View和Controller層
- 后端:只負責Model層,業務處理/數據等。
試想一下,如果前端掌握了Controller,我們可以做url design,我們可以根據場景決定在服務端同步渲染,還是根據view層數據輸出json數據,我們還可以根據表現層需求很容易的做bigpipe,comet,socket等等,完全是需求決定使用方式。
3.1、基於NodeJS全棧式開發
需要一種web服務幫我們實現以前后端做的事情
這張圖看起來簡單而且很好理解,但沒嘗試過,會有很多疑問。
- SPA模式中,后端已供了所需的數據接口,view前端已經可以控制,為什么要多加NodeJS這一層?
- 多加一層,性能怎么樣
- 多加一層,前端的工作量是不是增加了?
- 多加一層就多一層風險,怎么破?
- NodeJS什么都能做,為什么還要JAVA
3.2、為什么要增加一層NodeJS?
現階段我們主要以后端MVC的模式進行開發,這種模式嚴重阻礙了前端開發效率,也讓后端不能專注於業務開發。
解決方案是讓前端能控制Controller層,但是如果在現有技術體系下很難做到,因為不可能讓所有前端都學java,安裝后端的開發環境,寫VM。
NodeJS就能很好的解決這個問題,我們無需學習一門新的語言,就能做到以前開發幫我們做的事情,一切都顯得那么自然。
3.3、性能問題
分層就涉及每層之間的通訊,肯定會有一定的性能損耗。但是合理的分層能讓職責清晰、也方便協作,會大大提高開發效率。分層帶來的損失,一定能在其他方面的收益彌補回來。
另外,一旦決定分層,我們可以通過優化通訊方式、通訊協議,盡可能把損耗降到最低。
四、基於Node的前后端分離
上圖是對基於Node的前后端分離分層的理解,以及Node的職責范圍。簡單解釋下:
- 最上端是服務端,就是我們常說的后端。后端對於我們來說,就是一個接口的集合,服務端提供各種各樣的接口供我們使用。因為有Node層,也不用局限是什么形式的服務。對於后端開發來說,他們只用關心業務代碼的接口實現。
- 服務端下面是Node應用。
- Node應用中有一層Model Proxy與服務端進行通訊。這一層主要目前是抹平我們對不同接口的調用方式,封裝一些view層需要的Model。
- Node層還能輕松實現原來vmcommon,tms等需要
- Node層要使用什么框架由開發者自己決定。不過推薦使用express+xTemplate的組合,xTemplate能做到前后端公用。
- 怎么用Node大家自己決定,但是令人興奮的是,我們終於可以使用Node輕松實現我們想要的輸出方式:JSON/JSONP/RESTful/HTML/BigPipe/Comet/Socket/同步、異步,想怎么整就怎么整,完全根據你的場景決定。
- 瀏覽器層在我們這個架構中沒有變化,也不希望因為引入Node改變你以前在瀏覽器中開發的認知。
- 引入Node,只是把本該就前端控制的部分交由前端掌控。