(五)基于前后端分離的多終端適配

2018-02-24 16:04 更新

原文:http://ued.taobao.org/blog/2014/05/cross-platform-tpl/
作者:筱谷

前言

近年來各站點(diǎn)基于 Web 的多終端適配進(jìn)行得如火如荼,行業(yè)間也發(fā)展出依賴各種技術(shù)的解決方案。有如基于瀏覽器原生 CSS3 Media Query 的響應(yīng)式設(shè)計(jì)、基于云端智能重排的「云適配」方案等。本文則主要探討在前后端分離基礎(chǔ)下的多終端適配方案。

關(guān)于前后端分離

關(guān)于前后端分離的方案,在《前后端分離的思考與實(shí)踐(一)》中有非常清晰的解釋。我們?cè)诜?wù)端接口和瀏覽器之間引入 NodeJS 作為渲染層,因?yàn)?NodeJS 層徹底與數(shù)據(jù)抽離,同時(shí)無需關(guān)心大量的業(yè)務(wù)邏輯,所以十分適合在這一層進(jìn)行多終端的適配工作。

UA 探測(cè)

進(jìn)行多終端適配首先要解決的是 UA 探測(cè)問題,對(duì)于一個(gè)過來的請(qǐng)求,我們需要知道這個(gè)設(shè)備的類型才能針對(duì)對(duì)它輸出對(duì)應(yīng)的內(nèi)容?,F(xiàn)在市面上已經(jīng)有非常成熟的兼容大量設(shè)備的 User Agent 特征庫(kù)和探測(cè)工具,這里有 Mozilla 整理的一個(gè)列表。其中,既有運(yùn)行在瀏覽器端的,也有運(yùn)行在服務(wù)端代碼層的,甚至有些工具提供了 Nginx/Apache 的模塊,負(fù)責(zé)解析每個(gè)請(qǐng)求的 UA 信息。

實(shí)際上我們推薦最后一種方式?;谇昂蠖朔蛛x的方案決定了 UA 探測(cè)只能運(yùn)行在服務(wù)器端,但如果把探測(cè)的代碼和特征庫(kù)耦合在業(yè)務(wù)代碼里并不是一個(gè)足夠友好的方案。我們把這個(gè)行為再往前挪,掛在 Nginx/Apache 上,它們負(fù)責(zé)解析每個(gè)請(qǐng)求的 UA 信息,再通過如 HTTP Header 的方式傳遞給業(yè)務(wù)代碼。

這樣做有幾點(diǎn)好處:

  1. 我們的代碼里面無需再去關(guān)注 UA 如何解析,直接從上層取出解析后的信息即可。
  2. 如果在同一臺(tái)服務(wù)器上有多個(gè)應(yīng)用,則能夠共同使用同一個(gè) Nginx 解析后的 UA 信息,節(jié)省了不同應(yīng)用間的解析損耗。

來自天貓分享的基于 Nginx 的 UA 探測(cè)方案

淘寶的 Tengine Web 服務(wù)器也提供了類似的模塊?ngx_http_user_agent_module。

值得一提的是,選用 UA 探測(cè)工具時(shí)必須要考慮特征庫(kù)的可維護(hù)性,因?yàn)槭忻嫔闲略龅脑O(shè)備類型越來越多,每個(gè)設(shè)備都會(huì)有獨(dú)立的 User Agent,所以該特征庫(kù)必須提供良好的更新和維護(hù)策略,以適應(yīng)不斷變化的設(shè)備。

建立在 MVC 模式中的幾種適配方案

取得 UA 信息后,我們就要考慮如果根據(jù)指定的 UA 進(jìn)行終端適配了。即使在 NodeJS 層,雖然沒有了大部分的業(yè)務(wù)邏輯,但我們依然把內(nèi)部區(qū)分為 Model / Controller / View 三個(gè)模型。

我們先利用上面的圖,去解析一些已有的多終端適配方案。

建立在 Controller 上的適配方案

這種方案應(yīng)該是最簡(jiǎn)單粗暴的處理方法。通過路由(Router)將相同的 URL 統(tǒng)一傳遞到同一個(gè)控制層(Controller)。控制層再通過 UA 信息將數(shù)據(jù)和模型(Model)邏輯派發(fā)到對(duì)應(yīng)的展現(xiàn)(View)進(jìn)行渲染,渲染層則按預(yù)先的約定提供了適配幾個(gè)終端的模板。

這種方案的好處是,保持了數(shù)據(jù)和控制層的統(tǒng)一性,業(yè)務(wù)邏輯只需處理一次遍可以應(yīng)用在所有終端上。但這種場(chǎng)景只適合如展示型頁(yè)面等低交互型的應(yīng)用,一旦業(yè)務(wù)比較復(fù)雜,各個(gè)終端的 Controller 可能有各自的處理邏輯,如果還是共用一個(gè) Controller ,會(huì)導(dǎo)致 Controller 非常的臃腫而且難以維護(hù),這無疑是一個(gè)錯(cuò)誤的選擇。

建立在 Router 上的適配方案

為了解決上面遇到的問題,我們可以在 Router 上就將設(shè)備區(qū)分,針對(duì)不同的終端分發(fā)到不同的 Controller 上:

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)