1.什麼是先後端分離前端
傳統的SPA模式:全部用到的展示數據都是後端經過異步接口(AJAX/JSONP)的方式提供的,前端只管展示。java
從某種意義上來講,SPA確實作到了先後端分離,但這種方式存在兩個問題:web
- WEB服務中,SPA類佔的比例不多。不少場景下還有同步/同步+異步混合的模式,SPA不能做爲一種通用的解決方案。
- 現階段的SPA開發模式,接口一般是按照展示邏輯來提供的,並且爲了提升效率咱們也須要後端幫咱們處理一些展示邏輯,這就意味着後端仍是涉足了view層的工做,不是真正的先後端分離。
現階段:從職責上劃分才能知足目前咱們的使用場景:express
- 前端:負責View和Controller層
- 後端:只負責Model層,業務處理/數據等。
2.怎麼作先後端分離json
- 前端:負責View和Controller層
- 後端:只負責Model層,業務處理/數據等。

試想一下,若是前端掌握了Controller,咱們能夠作url design,咱們能夠根據場景決定在服務端同步渲染,仍是根據view層數據輸出json數據,咱們還能夠根據表現層需求很容易的作bigpipe,comet,socket等等,徹底是需求決定使用方式。後端
3.一、基於NodeJS全棧式開發
須要一種web服務幫咱們實現之前後端作的事情瀏覽器

這張圖看起來簡單並且很好理解,但沒嘗試過,會有不少疑問。架構
- SPA模式中,後端已供了所需的數據接口,view前端已經能夠控制,爲何要多加NodeJS這一層?
- 多加一層,性能怎麼樣
- 多加一層,前端的工做量是否是增長了?
- 多加一層就多一層風險,怎麼破?
- NodeJS什麼都能作,爲何還要JAVA
3.二、爲何要增長一層NodeJS?
現階段咱們主要之後端MVC的模式進行開發,這種模式嚴重阻礙了前端開發效率,也讓後端不能專一於業務開發。
解決方案是讓前端能控制Controller層,可是若是在現有技術體系下很難作到,由於不可能讓全部前端都學java,安裝後端的開發環境,寫VM。
NodeJS就能很好的解決這個問題,咱們無需學習一門新的語言,就能作到之前開發幫咱們作的事情,一切都顯得那麼天然。框架
3.三、性能問題
分層就涉及每層之間的通信,確定會有必定的性能損耗。可是合理的分層能讓職責清晰、也方便協做,會大大提升開發效率。分層帶來的損失,必定能在其餘方面的收益彌補回來。
另外,一旦決定分層,咱們能夠經過優化通信方式、通信協議,儘量把損耗降到最低。前後端分離
4、基於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,只是把本該就前端控制的部分交由前端掌控。