比較Backbone.js, Angular.js, Ember.js, Knockout.js 心得

還記得第一次寫網站的時候,我無意間寫成了 SPA(single page application),當時還沒有SPA這個詞,後來因為廣告主須要不一樣 url location 頁面的廣告展現,只好把部分網站改爲通常網頁。可是一直以來我對於提升整體溝通效率以及使用端的回應效率抱持相同的想法,但願能夠把更多回應放到 client 處理,讓server 作好 api 提供者的角色,能夠讓網站回應更即時而親切,這篇心得文不會詳細走訪每個技術層面,而是提供歸納的入門使用情況。


現在client-side javascript MV*(MVVM, MVC等) framework實做產量豐富,Backbone.js, Spine.js, Angular.js, Ember,js, Knockout.js, Batman.js, Javascript MVC, SproutCore.js, Cappuccino.js 好像每個高手都要發明一套才行,不過其實各框架的目的不盡相同,其中我比較感興趣的是 Backbone.jsKnockout.js 還有強大的 Angular.js和  Ember.js,你們在玩的時候能夠比較一下他們的todo list是怎麼作的,todo list範例已經是新框架誕生時要遵照的"行規"了。



Backbone.js

Backbone.js你們絕對都聽過,有廣大的社羣支持者,文件和教學很完整,使用他第一次讓我能夠把javascript event整理成清楚好維護的方式。雖然我比較常獨立栽種程式碼,可是我相信一個網頁前端團隊合做用Backbone.js會是很輕鬆的,module的切割加上他幾乎沒有改變html原有的寫做方式,不會嚇跑負責html和css的夥伴或任何人,能夠有乾淨的工做區分。

Backbone.js在功能上能夠說是提供了比較...基礎的功能協助,其實能夠說什麼都沒作吧...,相較於在使用其餘框架時,會面臨須要思考如何把強大的功能"降級",這很痛苦,Backbone.js讓我能夠build from scratch,這每每更容易完成我想要的功能也更容易除錯,也很容易改造一些原始運做,可是我有時候發現程式碼變得很是龐大,並且事必躬親,事情彷佛被複雜化了,我常想這是必要的代價嗎?  使用到後來發現我愛的其實是Underscore.js吧,Underscore.js程式碼的品質很好。

其餘Backbone.js相對比較好的地方像是collection的概念,還有整個框架檔案很小,缺點(特點)就是沒有data-binding,有人試圖幫他作了一個,最後效能太差收掉了。

補充一下基於Backbone.js的兩個成熟框架, MarionettejsChaplin。由於Backbone幾乎只滿足了前端框架的最基本需求,這兩個框架則解決實際的使用上的問題,像是清除event-listener(lifecycle),還有更好的應用架構支援和Controller,而不是隻有單純的Router獨挑大樑,以及有更完整的View繼承和預設render方式,和整合AMD支援等等。



Angular.js

Angular.js和Ember.js讓我第一次發現原來View和Model能夠作binding,並且是透過很是簡單的方式,簡直美好,雖然Knockout.js也有data binding,可是就是沒有Angular.js用起來直覺。

Angular.js提供的template樣版也是在我用過的javascript MV*當中最喜歡的,用起來有點像是Jinja2的感覺。

Angular.js還提供簡單的方式讓你本身作directive,能夠想像在UI當中加入一個小東西就能完成經常使用的功能。

Angular.js的routing也很是簡單易懂,可是太過簡單以致於只能用做者但願的方式來用,加上他自己用singleton模式,只能有一個app instance,讓我無法在一個route中同時做出複雜的動做,或是更新多個View,目前無法符合個人需求(更新:後來我透過directives完成了,directives是一個能夠讓你作出類似網頁widget的強大功能),不過做者說不適合在1.0時釋出太複雜的東西,因此我們就持續關注吧。

使人驚訝的是,Angular.js自帶一組強大的end to end testing工具,並且很是的簡單好懂。

另外Angular.js和Ember,js, Knockout.js同樣潛在的缺點(特點)是,有些人可能不但願程式的邏輯跑進html中,可是我認為簡單繁瑣的邏輯應該允許放在最合適的地方,進一步瞭解能夠看一下 Angular.js做者在Quora上的見解,這點就見仁見智。

整體而言我對Angular.js的未來很是看好,現在在Google的CDN上也能夠取得了,可見Google對他的重視,預計九月初會釋出1.2版。


Ember.js

一樣是後起之秀, Ember.js是從SproutCore.js出來又從Amber.js改頭換面成了Ember.js。這是和我初始想法最接近的Javascript client-side framework,寫起來頗有感覺,有時候寫程式真的不須要選什麼你們都在用還是評價最高的東西,選一個和本身頭腦思考方式最接近的就是最好的,這點也是因人而異的。

Ember.js的Model是我最喜歡的方式,Backbone.js相對顯得囉嗦和貧乏,Model中的computed property能夠選擇連動的屬性,one-way or two-way binding能夠自由搭配,他使用的Handlebars.js template比Underscore.js和Mustache.js提供的都要更好用,我建議Backbone.js使用者也能夠看看Handlebars.js,他在功能和簡單兩邊取得了平衡,算是很是不錯的javascript template引擎。

雖然我舉雙手贊成以後template盡量都移到client-side來作,可是我必須說,現在全部的client-side template功能和server-side經年累月琢磨出來的template都還比不上,其實Model和Controller也是,還有不少能夠加強的功能,因為還要考慮client裝置的能力和網路環境的限制,不能像server端的東西包山包海。至少現在Angular.js和Ember.js看起來是站在巨人的肩膀上。Ember.js在attribute binding功能上更勝一籌,Angular.js目前的1.0版則較為簡單易用。

Ember.js還有一個很是特別的地方是Finite State Machine Routing,他本來一直沒有提供routing功能,後來才透過他的State實作了routing,目前官網還沒有很好的文件。和其餘框架都不一樣的是,他的routing是能夠和location脫鉤的finite state machine,可是若是你但願,他也能夠在改變state時自動幫你更新location,很是強大,我只能說Ember.js野心太大,但願不要搞砸,能夠看一下本來幫Ember.js寫RouteManager外掛的做者的 這篇來瞭解中間的不一樣,State Machine的設計概念我是支持的,軟體流程能夠作的比較清楚,可是目前整體routing語法太冗長、贅字太多這點有待改進,View裡面的outlet的侷限性也是我用起來覺得不順手的地方,算是個缺點吧。

另外Ember.js最大的缺點就是文件不齊全或沒跟上最新版,學習時間比其餘框架要長一點。



Knockout.js

Knockout.js 好久之前就被facebook推薦作為mobile web前端的框架,我覺得Knockout.js算是比較成熟的MVVM框架,他不試著包山包海,他迷人之處就是他專心作好data-binding,然後在這之上搞好template,因為他很專一和成熟因此他有不少細心的地方,像是你能夠在data-binding的過程中很容易的界接jquery的aniamtion,不少其餘框架就只是幫你即時作binding而,還有如何從jquery中調用Knockout.js的value和context, Knockout.js 給使用者很大的自由,甚至他還想到怎樣作能夠更方便的把UI上資料同步遠在server的資料庫(for Rails),另外在template上也有許多巧思能夠體會到他設想周到。

Knockout.js的缺點就是我不喜歡他的語法,雖然本身進去改一些東西可能也能解決,但這會讓我覺得我和做者的靈魂不夠接近,這是很嚴重的問題,並且他太成熟了,不是一個追逐最新潮流的碼農能夠拿出來炫耀的工具,這也是很嚴重的問題,哈。

由於Knockout.js 沒有routing功能(有routing功能的框架一般官網也會直接展現),我們可使用Crossroads.js, Director.js或是Sammy.js,三個都很不錯,Director.js是Server和Client兼具, Sammy.js是我一直在關注的工具,他一樣專注在一件事情上,我很喜歡他的語法,用起來有jquery和server-side routing結合的感覺,不像不少框架在語法上都喜歡自成一格,模仿jQuery語法相當明智,並且現在也有html5 history support了,能夠和Knockout.js結合的很好。

另外還有個有趣的東西叫作 Knockback.js,他是Backbone.js和Knockout.js產下的混血兒, Knockback.js 把Backbone.js的ORM, routing, serialization和Knockout.js的MVVM data-binding各取所長的結合在一塊兒,我是不敢用基因改良的東西啦,我怕會有基因突變,期待有人分享心得了。
相關文章
相關標籤/搜索