是否需要使用前端框架
一提起框架,我想我們基本都會脫口而出angular闽烙、vue蒸殿、react等等,那么它們是用來干啥的呢鸣峭?
先說下以angular宏所、backbone為代表的MV*框架和jquery的區(qū)別,像我一直在使用jquery摊溶,用得好好的爬骤,為什么要用這種框架呢?
像jquery莫换,針對界面上的DOM操作霞玄、遠(yuǎn)程請求骤铃、數(shù)據(jù)處理等都做了封裝。使用它坷剧,并不會影響自己的代碼結(jié)構(gòu)惰爬,它只能算個庫。
而框架則是提供一套解決方案惫企,你得按我的規(guī)定來安排代碼結(jié)構(gòu)撕瞧,它是隨著前端功能的增強而產(chǎn)生的,對于往應(yīng)用方向發(fā)展(也就是越來越像客戶端)的web產(chǎn)品就很必要做前端架構(gòu)這件事狞尔,它開始以模型為中心丛版,DOM操作只是附加,通過關(guān)注點分離鼓勵改進(jìn)應(yīng)用程序偏序。
未來的發(fā)展趨勢是前后端只靠json數(shù)據(jù)進(jìn)行通信页畦,后端只處理和發(fā)送一段json到前端,計算和模板渲染都在前端進(jìn)行研儒,后臺程序不再做模板的任何處理豫缨。使用MV*框架能有效實現(xiàn)前后端的解耦,簡化開發(fā)流程端朵,便于維護(hù)管理州胳,可以把精力更多放到業(yè)務(wù)邏輯,提升開發(fā)效率逸月。
所以考慮是否需要引入前端框架,可以根據(jù)產(chǎn)品類型做個基本判斷:對于頁面型產(chǎn)品遍膜,處理交互更多碗硬,jquery也夠用;但如果是應(yīng)用軟件類產(chǎn)品瓢颅,需要關(guān)注處理復(fù)雜模型恩尾,很有必要引入MV*框架。如今的互聯(lián)網(wǎng)公司的產(chǎn)品基本都是web app挽懦,越來越像傳統(tǒng)應(yīng)用軟件開發(fā)靠攏翰意,使用個框架就還是很有必要的。
前端MV*
上邊只是簡單說了結(jié)論性的話信柿,那么MV*又是什么呢冀偶?
view和mode之間是觀察者模式,view事先在model上注冊渔嚷,觀察model的變化进鸠,使得view可以了解model中數(shù)據(jù)的變化。
view和controller之間是策略模式形病,MVC允許在不改變視圖外觀的情況下改變視圖對用戶輸入的響應(yīng)方式客年。MVC將響應(yīng)機(jī)制封裝在controller對象中霞幅,存在著一個controller的類層次結(jié)構(gòu),使得可以方便的對原有的controller做適當(dāng)改變而創(chuàng)建新的controller量瓜。view使用controller子類的實例來實現(xiàn)一個特定的響應(yīng)策略司恳,要實現(xiàn)不同的策略只要用不同種類的controller實例替換。
view 承接controller的功能绍傲,處理用戶的輸入扔傅,依賴controller決定如何進(jìn)一步處理。由于view具有獨立處理事件的能力唧取,如果每次都走controller铅鲤,其實增加了復(fù)雜性。同時view也可委托controller處理model的更改枫弟,model數(shù)據(jù)變化后通知view進(jìn)行更新邢享,這整體是個循環(huán)的過程。
在經(jīng)典MVC中淡诗,controller要做的事情多數(shù)是派發(fā)用戶輸入給不同的view骇塘,并且在必要的時候從view中獲取用戶輸入來更改model,而Web以及絕大多數(shù)現(xiàn)在的UI系統(tǒng)中韩容,controller的職責(zé)已經(jīng)被系統(tǒng)實現(xiàn)了款违,controller非常薄,只起到路由的作用群凶,Backbone索性取消了controller插爹,只保留了router∏肷遥總之由于某種原因赠尾,控制器和視圖的分界線越來越模糊,由于controller和view之間的分界線越來越模糊毅弧,所以就衍生了MVP,MVVM這些模式气嫁。
MVP中view不僅擁有UI組件的結(jié)構(gòu),還擁有處理用戶事件的能力够坐,這樣就能將controller獨立出來寸宵。依賴Presenter作為核心,負(fù)責(zé)從model中拿數(shù)據(jù)元咙,填充到view中梯影。常見的MVP的實現(xiàn)是被動視圖(passive view),Presenter觀察model,不再是view觀察model庶香,一旦model發(fā)生變化光酣,就會更新view。Presenter有效地綁定了model到view脉课。view暴露了setters接口以便Presenter可以設(shè)置數(shù)據(jù)救军。對于這種被動視圖的結(jié)構(gòu)财异,沒有直接數(shù)據(jù)綁定的概念。但是他的好處是在view和model直接提供更清晰的分離唱遭。但是由于缺乏數(shù)據(jù)綁定支持戳寸,意味著不得不單獨關(guān)注某個任務(wù)。在MVP里拷泽,應(yīng)用程序的邏輯主要在Presenter來實現(xiàn)疫鹊,其中的view是很薄的一層。
同MVP一樣司致,將view和model清晰的分離開來拆吆。view是對viewmodel的外在顯示,view綁定到viewmodel的屬性上脂矫,與viewmodel保持同步枣耀,如果viewmodel中的屬性值變化了,這些新值通過數(shù)據(jù)綁定會自動傳遞給view庭再。反過來viewmodel會暴露model中的數(shù)據(jù)和特定狀態(tài)給view捞奕。它的好處是實現(xiàn)了數(shù)據(jù)的雙向綁定,angular就都是使用的這種模式拄轻。
MVC颅围、MVVM與數(shù)據(jù)綁定
MVC 的思想是表示分離,將表示業(yè)務(wù)的領(lǐng)域?qū)ο驧odel和表示GUI元素的表示對象View分離恨搓。
流同步:在一個視圖的代碼中顯示地對其它視圖進(jìn)行同步院促,也就是一個視圖改變了模型,然后告訴其它所有視圖需要刷新了斧抱。
MVC中實現(xiàn)模型和視圖的解耦常拓,同時還可以使用觀察者(使得debug困難)同步策略,自動同步數(shù)據(jù)夺姑,但對于交互相關(guān)的狀態(tài),需要流同步(會增加好多代碼)掌猛。前端MVC中盏浙,controller原本負(fù)責(zé)用戶和系統(tǒng)的連接,被系統(tǒng)實現(xiàn)了很多荔茬,從而又演化出MVP废膘,但是他們沒有雙向綁定。
MVVM模式中慕蔚,使用視圖模板(ViewModel)的概念來維護(hù)視圖所處的狀態(tài)丐黄。ViewModel用來存儲視圖狀態(tài)。controller負(fù)責(zé)ViewModel的初始化及根據(jù)視圖的交互操作Model孔飒。View 和 ViewModel之間進(jìn)行了數(shù)據(jù)的雙向綁定灌闺。
在前端領(lǐng)域中艰争,可以一句話總結(jié)MVC/MVVM的不同:MVC指的是前端和后臺的交互方式,MVVM指的是頁面渲染方式桂对。
當(dāng)下的前端框架
當(dāng)下的框架使用MV*的設(shè)計模式(最有優(yōu)勢的是MVVC)甩卓,它們還集合了模板、模塊化蕉斜、組件化的功能逾柿,而且更重要的就是為了實現(xiàn)組件化。這兩年前端領(lǐng)域有三個框架/庫引領(lǐng)時尚宅此,那就是Angular机错,Polymer(google提出,web component)父腕,React弱匪。(vue在國內(nèi)使用的公司還是蠻多的,像百度外賣侣诵、餓了么痢法、頭條等等),這里有篇文章杜顺,詳細(xì)分析了這幾個前端框架财搁,2015前端框架何去何從。
這三個東西各有千秋躬络,在可以預(yù)見的幾年內(nèi)將會鼎足三分尖奔,也許還會有新的框架出現(xiàn),能不能比這幾個流行就難說了穷当。
對于前端框架我們需要關(guān)注:
模塊化
web component
變更檢測(雙向綁定機(jī)制)
immutable Data
promise與異步
這幾個方面再留待后邊學(xué)習(xí)
參考資料
http://blog.sae.sina.com.cn/archives/1060
https://github.com/xufei/blog/issues/19
http://efe.baidu.com/blog/mvc-deformation/
http://www.cnblogs.com/sskyy/p/4264371.html