最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于NodeJS的前后端分離的思考與實(shí)踐(二)模版探索

 更新時(shí)間:2014年09月26日 09:38:48   作者:taobaoued  
在傳統(tǒng)的開發(fā)模式中,瀏覽器端與服務(wù)器端是由不同的前后端兩個(gè)團(tuán)隊(duì)開發(fā),但是模版卻又在這兩者中間的模糊地帶。因此模版上面總不可避免的越來越多復(fù)雜邏輯,最終難以維護(hù)。

前言

在做前后端分離時(shí),第一個(gè)關(guān)注到的問題就是 渲染,也就是 View 這個(gè)層面的工作。

在傳統(tǒng)的開發(fā)模式中,瀏覽器端與服務(wù)器端是由不同的前后端兩個(gè)團(tuán)隊(duì)開發(fā),但是模版卻又在這兩者中間的模糊地帶。因此模版上面總不可避免的越來越多復(fù)雜邏輯,最終難以維護(hù)。

而我們選擇了NodeJS,作為一個(gè)前后端的中間層。試圖藉由NodeJS,來疏理 View 層面的工作。

使得前后端分工更明確,讓專案更好維護(hù),達(dá)成更好的用戶體驗(yàn)。

本文

渲染這塊工作,對(duì)于前端開發(fā)者的日常工作來說,佔(zhàn)了非常大的比例,也是最容易與后端開發(fā)糾結(jié)不清的地方。

回首過去前端技術(shù)發(fā)展的這幾年, View 這個(gè)層面的工作,經(jīng)過了許多次的變革,像是:

Form Submit 全頁(yè)刷新 => AJAX局部刷新
服務(wù)端續(xù)染 + MVC => 客戶端渲染 + MVC
傳統(tǒng)換頁(yè)跳轉(zhuǎn) => 單頁(yè)面應(yīng)用
可以觀察到在這幾年,大家都傾向?qū)?渲染 這件事,從服務(wù)器端端移向了瀏覽器端。

而服務(wù)器端則專注于 服務(wù)化 ,提供數(shù)據(jù)接口。

瀏覽器端渲染的好處

瀏覽器端渲染的好處,我們都很清楚,像是

1.擺脫業(yè)務(wù)邏輯與呈現(xiàn)邏輯在Java模版引擎中的耦合與混亂。
2.針對(duì)多終端應(yīng)用,更容易以接口化的形式。在瀏覽器端搭配不同的模版,呈現(xiàn)不同的應(yīng)用。
3.頁(yè)面呈現(xiàn)本來就不僅是html,在前端的渲染可以更輕易的以組件化形式 (html + js + css)提供功能,使得前端組件不需依賴于服務(wù)端產(chǎn)生的html結(jié)構(gòu)。
4.脫離對(duì)于后端開發(fā)、發(fā)佈流程的依賴。
5.方便聯(lián)調(diào)。

瀏覽器端渲染造成的壞處

但是在享受好處的同時(shí),我們同樣的也面臨了 瀏覽器端渲染 所帶來的壞處,像是:

1.模版分離在不同的庫(kù)。有的模版放在服務(wù)端 (JAVA),而有的放在瀏覽器端 (JS)。前后端模版語(yǔ)言不相通。
2.需要等待所有模版與組件在瀏覽器端載入完成后才能開始渲染,無(wú)法即開即看。
3.首次進(jìn)入會(huì)有白屏等待渲染的時(shí)間,不利于用戶體驗(yàn)
4.開發(fā)單頁(yè)面應(yīng)用時(shí),前端Route與服務(wù)器端Route不匹配,處理起來很麻煩。
5.重要內(nèi)容都在前端組裝,不利于SEO

反思前后端的定義

其實(shí)回頭想想,在我們把渲染的工作從 服務(wù)端(Java) 抽出來到 瀏覽器端(JS) 的時(shí)候,我們的目的只是 明確的前后端職責(zé)劃分,并不是非瀏覽器渲染不可 。

只是因?yàn)樵趥鹘y(tǒng)的開發(fā)模式中,出了服務(wù)器就到了瀏覽器,所以前端的工作內(nèi)容只能被限制在瀏覽器端。

也因此很多人認(rèn)定了 后端 = 服務(wù)端 前端 = 瀏覽器端 ,就像下面這張圖。

而在淘寶UED目前進(jìn)行的 中途島Midway 項(xiàng)目中,藉由在 JAVA – Browser中間搭建一個(gè)NodeJS中間層,試圖把這個(gè)前后端的分割線,重新針對(duì) 工作職責(zé) 去區(qū)分,而非針對(duì)硬體環(huán)境去區(qū)分(服務(wù)器 & 瀏覽器)。

因此我們有機(jī)會(huì)做到模版與路由的共享,也是一個(gè)前后端分工中最理想的狀態(tài)。

淘寶中途島 Midway

在中途島項(xiàng)目中,我們把前后端分界的那條線,從瀏覽器端移回到了服務(wù)器端。

藉由一個(gè)由前端 輕松掌控 且 與瀏覽器共通 的Nodejs層,可以更清晰的完成了前后端分離。

也可以讓前端開發(fā)針對(duì)不同的情況,自行決定 最適當(dāng)?shù)慕鉀Q方案 。而不是所有事情 都在瀏覽器端來處理 。

職責(zé)劃分

中途島并不是前端試圖搶后端飯碗的項(xiàng)目,目的只是把 模版 這個(gè)模糊地帶切割清楚,取得更明確的職責(zé)劃分。

后端 (JAVA),專注于
1.服務(wù)層
2.數(shù)據(jù)格式、數(shù)據(jù)穩(wěn)定
3.業(yè)務(wù)邏輯
 
前端,專注于
1.UI層
2.控制邏輯、渲染邏輯
3.交互、用戶體驗(yàn)
 
而不再拘泥于服務(wù)端或?yàn)g覽器端的差異。

模版共享

在傳統(tǒng)的開發(fā)模式中,瀏覽器端與服務(wù)器端是由不同的前后端兩個(gè)團(tuán)隊(duì)開發(fā),但是模版卻又在這兩者中間的模糊地帶。因此模版上面總不可避免的越來越多復(fù)雜邏輯,最終難以維護(hù)。

有了NodeJS,后端同學(xué)可以在JAVA層專注于業(yè)務(wù)邏輯與數(shù)據(jù)的開發(fā)。而前端同學(xué)則專注于控制邏輯與渲染的開發(fā)。并且自行選擇這些模版是要在 服務(wù)端 (NodeJS) 或是 瀏覽器端 做渲染。

用著一樣的模版語(yǔ)言 XTemplate ,一樣的渲染引擎 JavaScript

在 不同的渲染環(huán)境?。⊿erver-side、PC Browser、Mobile Browser、Web View、etc.) 渲染出 一樣的結(jié)果 。

路由共享

也因?yàn)橛辛薔odeJS這一層,可以更細(xì)致的控制路由。

假如需要在前端做瀏覽器端路由時(shí),可以同時(shí)配置服務(wù)器端的路由,使其在 瀏覽器端換頁(yè) 或是 服務(wù)端換頁(yè) ,都可以得到一致的渲染效果。

同時(shí)也處理了SEO的問題。

模版共享的實(shí)踐

通常我們?cè)跒g覽器端渲染一份模版時(shí),流程不外乎是

在瀏覽器端載入模版引擎 (xtmpleate, juicer, handlerbar, etc.)
在瀏覽器端載入模版檔案,方法可能有
使用 <script type="js/tpl"> ... </script> 印在頁(yè)面上
使用模塊載入工具,載入模版檔案 (KISSY, requireJS, etc.)
其他
取得數(shù)據(jù),使用模版引擎產(chǎn)生html
將html插入到指定位置。
從以上的流程可以觀察到,要想要做到模版的跨端共享,重點(diǎn)其實(shí)在 一致的模塊選型 這件事。

市面上流行很多種模塊標(biāo)準(zhǔn),例如 KMD、AMD、CommonJS,只要能將NodeJS的模版檔案透過一致模塊規(guī)范輸出到NodeJS端,就可以做基本的模版共享了。

而后續(xù)的系列文章會(huì)針對(duì)Model的proxy與共享,做進(jìn)一步的探討。

案例探討

因?yàn)橛辛酥型緧u這中間層,針對(duì)過往的一些問題都有了更好的解答,例如說

案例一 復(fù)雜交互應(yīng)用 (如購(gòu)物車、下單頁(yè)面)

狀況:全部的HTML都是在前端渲染完成,服務(wù)端僅提供接口。
問題:進(jìn)入頁(yè)面時(shí),會(huì)有短暫白屏。
解答:
首次進(jìn)入頁(yè)面,在NodeJS端進(jìn)行 全頁(yè)渲染 ,并在背景下載相關(guān)的模版。
后續(xù)交互操作,在瀏覽器端完成 局部刷新
用的是 同一份模版 , 產(chǎn)生 一樣的結(jié)果

案例二 單頁(yè)面應(yīng)用

狀況:使用Client Side MVC框架,在瀏覽器換頁(yè)。
問題:渲染與換頁(yè)都在瀏覽器端完成,直接輸入網(wǎng)址進(jìn)入或f5刷新時(shí),無(wú)法直接呈現(xiàn)同樣的內(nèi)容。
解答:
在瀏覽器端與NodeJS端共享 同樣的Route 設(shè)定
瀏覽器端換頁(yè)時(shí),在瀏覽器端進(jìn)行Route變更與 頁(yè)面內(nèi)容渲染
直接輸入同樣的網(wǎng)址時(shí),在NodeJS端進(jìn)行 頁(yè)面框架 + 頁(yè)面內(nèi)容渲染
不管是瀏覽器端換頁(yè),或直接輸入同樣的網(wǎng)址,看到的內(nèi)容都是 一樣的 。
除了增加體驗(yàn)、減少邏輯複雜度外。更解決了 SEO 的問題

案例三 純?yōu)g覽型頁(yè)面

狀況:頁(yè)面僅提供資訊,較少或沒有交互
問題:html在服務(wù)端產(chǎn)生,css與js放在另外一個(gè)位置,彼此間有依賴。
解答:
透過NodeJS,統(tǒng)一管理html + css + js
日后若需要擴(kuò)展成復(fù)雜應(yīng)用或是單頁(yè)面應(yīng)用,也可以輕易轉(zhuǎn)移。

案例四 跨終端頁(yè)面

狀況:同樣的應(yīng)用要在不同端點(diǎn)呈現(xiàn)不同的介面與交互
問題:html管理不易,常常會(huì)在服務(wù)端產(chǎn)生不一樣的html,瀏覽器端又要做不一樣的處理
解答:
跨終端的頁(yè)面是渲染的問題,統(tǒng)一由前端來處理。
透過NodeJS層與后端服務(wù)化,可以針對(duì)這類型復(fù)雜應(yīng)用,設(shè)計(jì)最佳的解決方案。

總結(jié)

過去的AJAX、Client-side MVC、SPA、Two-way Data Binding 等技術(shù)的出現(xiàn),都是試圖要解決當(dāng)時(shí)的前端開發(fā)遇到的瓶頸。

而NodeJS中間層的出現(xiàn),也是在試圖解決現(xiàn)今前端被侷限在瀏覽器端的一個(gè)限制。

這邊文章專注于前后端模版共享,也希望能拋磚引玉,與大家一起討論如何在NodeJS中間層這個(gè)架構(gòu)下,我們可以怎樣的改善我們的工作流程,怎樣的跟 后端配合,來把 前端 這個(gè)工作做得更好。

相關(guān)文章

  • nodejs中使用worker_threads來創(chuàng)建新的線程的方法

    nodejs中使用worker_threads來創(chuàng)建新的線程的方法

    這篇文章主要介紹了nodejs中使用worker_threads來創(chuàng)建新的線程的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 學(xué)習(xí)使用ExpressJS 4.0中的新Router的用法

    學(xué)習(xí)使用ExpressJS 4.0中的新Router的用法

    ExpressJS 4.0中提出了新的路由Router,提供了路由應(yīng)有的API,本文詳細(xì)的介紹了ExpressJS 4.0中的新Router的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • NodeJS測(cè)試框架mocha入門教程

    NodeJS測(cè)試框架mocha入門教程

    本文給大家簡(jiǎn)單介紹了NodeJS里最常用的測(cè)試框架--mocha的安裝以及簡(jiǎn)單的使用方法,支持直接在browser上跑Javascript代碼測(cè)試,這里推薦給大家
    2017-03-03
  • node創(chuàng)建Vue項(xiàng)目步驟詳解

    node創(chuàng)建Vue項(xiàng)目步驟詳解

    在本篇文章里小編給大家整理的是關(guān)于node創(chuàng)建Vue項(xiàng)目步驟詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 解析Node.js基于模塊和包的代碼部署方式

    解析Node.js基于模塊和包的代碼部署方式

    這篇文章主要介紹了解析Node.js基于模塊和包的代碼部署方式,作為一個(gè)服務(wù)于本地操作系統(tǒng)的JavaScript解釋器,Node采用了簡(jiǎn)潔的基于模塊和包概念的部署方式,需要的朋友可以參考下
    2016-02-02
  • node.js學(xué)習(xí)之base64編碼解碼

    node.js學(xué)習(xí)之base64編碼解碼

    開發(fā)者對(duì)Base64編碼肯定很熟悉,是否對(duì)它有很清晰的認(rèn)識(shí)就不一定了。實(shí)際上Base64已經(jīng)簡(jiǎn)單到不能再簡(jiǎn)單了,這篇文章給大家通過示例代碼介紹了node.js對(duì)字符串和圖片base64編碼解碼的方法,有需要的朋友們可以通過本文來進(jìn)行學(xué)習(xí),下面來一起看看吧。
    2016-10-10
  • Node.js搭建小程序后臺(tái)服務(wù)

    Node.js搭建小程序后臺(tái)服務(wù)

    最近在做微信的應(yīng)用號(hào)小程序開發(fā),小程序的后臺(tái)數(shù)據(jù)接口需要https安全請(qǐng)求,所以需要我的nodejs服務(wù)器能夠提供https的支持,現(xiàn)在就將整個(gè)https服務(wù)器的搭建過程說一下
    2018-01-01
  • nodejs將JSON字符串轉(zhuǎn)化為JSON對(duì)象報(bào)錯(cuò)的解決

    nodejs將JSON字符串轉(zhuǎn)化為JSON對(duì)象報(bào)錯(cuò)的解決

    這篇文章主要介紹了nodejs將JSON字符串轉(zhuǎn)化為JSON對(duì)象報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Node.js基于node-schedule實(shí)現(xiàn)定時(shí)任務(wù)的操作步驟

    Node.js基于node-schedule實(shí)現(xiàn)定時(shí)任務(wù)的操作步驟

    實(shí)際工作中,可能會(huì)遇到定時(shí)清除某個(gè)文件夾內(nèi)容,定時(shí)發(fā)送消息或發(fā)送郵件給指定用戶,定時(shí)導(dǎo)出某些數(shù)據(jù)等,node-schedule是一個(gè)非常不錯(cuò)的npm包,可以幫助我們快速的創(chuàng)建和管理定時(shí)任務(wù),所以本文介紹了Node.js基于node-schedule實(shí)現(xiàn)定時(shí)任務(wù)的操作步驟,需要的朋友可以參考下
    2024-09-09
  • node.js中的Socket.IO使用實(shí)例

    node.js中的Socket.IO使用實(shí)例

    這篇文章主要介紹了node.js中的Socket.IO使用實(shí)例,本文講解了Socket.IO的安裝、結(jié)合express來構(gòu)建服務(wù)器、基本使用方法及一個(gè)網(wǎng)絡(luò)聊天室的完整案例,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

临高县| 莫力| 成武县| 仙桃市| 淳安县| 安泽县| 宝兴县| 灌阳县| 祁连县| 阿拉尔市| 区。| 安顺市| 托克逊县| 宝应县| 乡宁县| 阿勒泰市| 乌兰浩特市| 安阳县| 温州市| 宁波市| 剑阁县| 任丘市| 张北县| 通江县| 宁国市| 太康县| 福泉市| 古田县| 寿宁县| 美姑县| 上杭县| 闽侯县| 沙湾县| 兴国县| 乐亭县| 东阿县| 宁陕县| 仙居县| 昭通市| 沁源县| 文水县|