JavaScript MVC框架PK:Angular、Backbone、CanJS與Ember

國內私募機構九鼎控股打造APP,來就送 20元現金領取地址: http://jdb.jiudingcapital.com/phone.html
內部邀請碼: C8E245J (不寫邀請碼,沒有現金送)
國內私募機構九鼎控股打造,九鼎投資是在全國股份轉讓系統掛牌的公衆公司,股票代碼爲430719,爲「中國PE第一股」,市值超1000億元。 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

原文地址: http://www.ituring.com.cn/article/38394javascript

選擇JavaScript MVC框架很難。一方面要考慮的因素很是多,另外一方面這種框架也很是多,而要從中選擇一個合適的,還真得費一番心思。想知道有哪些JavaScript MVC框架能夠選擇?看看TodoMVC吧。html

我用過其中4個框架:Angular、 Backbone、 CanJS和 Ember。所以,能夠對它們做一比較,供你們參考。本文會涉及框架選型過程當中須要考慮的一系列因素,咱們逐一討論。java

 

每個因素咱們都會按照1到5分來打分,1分表明不好,5分表明很好。我會盡可能保持客觀,但也不敢保證真能「一碗水端平」,畢竟這些分數都是根據我我的經驗給出的。jquery

 

功能

做爲構建應用的基礎,框架必須具有一些重要的功能。好比,視圖綁定、雙向綁定、篩選、可計算屬性(computed property)、髒屬性(dirty attribute)、表單驗證,等等。還能羅列出一大堆來。下面比較了一些我認爲MVC框架中比較重要的功能:git

功能 Angular Backbone CanJS Ember
可觀察對象(observable)
路由(routing)
視圖綁定(view binding)  
雙向綁定(two way binding) - -
部分視圖(partial view) -
篩選列表視圖(filtered list view) -
  • 可觀察對象:能夠被監聽是否發生變化的對象。
  • 路由:把變化經過瀏覽器URL的參數反映出來,並監聽這些變化以便執行相應的操做。
  • 視圖綁定:在視圖中使用可觀察對象,讓視圖隨着可觀察對象的變化而自動刷新。
  • 雙向綁定:讓視圖也能把變化(如表單輸入)自動推送到可觀察對象。
  • 部分視圖:包含其餘視圖的視圖。
  • 篩選列表視圖:用於顯示根據某些條件篩選出來的對象的視圖。

得分

根據上述功能,我打出的分數以下:angularjs

Angular Backbone CanJS Ember
5 2 4 5

有一點必須指出,使用Backbone也能實現上述大多數功能,只是手工編碼量挺大的,有時候還要藉助插件。這裏的打分只考慮了框架核心是否支持某一功能。github

靈活性

enter image description here

有時候,框架配合一些現成的插件和庫來使用,可能要比使用框架原生同類功能效果更好,而這種插件和庫幾乎遍地都是(不下數百個),又各有特點。所以,可以把這些庫和插件整合到MVC框架中也很是重要。api

Backbone是其中最靈活的一個框架,由於它的約定和主張最少。使用Backbone須要你本身做出不少決定。瀏覽器

CanJS的靈活性與Backbone差很少,把它跟別的庫整合起來很容易。在CanJS中甚至能夠更換其餘渲染引擎,我在CanJS中就一直用Rivets,沒有任何問題。不過,我仍是推薦框架自帶的組件。mvc

Ember和Angular也都還算靈活,可有時候你會發現,就算不喜歡它們的某些實現方法,你也只能默默忍受。 這是在選擇Ember或Angular時必須考慮的。

得分

Angular Backbone CanJS Ember
3 5 4 3

上手難度

enter image description here

Angular

Angular一開始會讓人大呼過癮,由於能夠利用它幹好多意想不到的事,好比雙向綁定,並且學習難度不高。乍一看讓人以爲很簡單。但是,進了門以後,你會發現後面的路還很長。應該說這個框架比較複雜,並且有很多標新立異之處。想看着它的文檔上手並不現實,由於Angular製造的概念不少,而文檔中的例子又不多。

Backbone

Backbone的基本概念很是容易理解。但很快你會發現它對怎麼更好地組織代碼並無太多主張。爲此,你得觀摩或閱讀一些教程,才能知道在Backbone中怎麼編碼最好。並且,你會發如今有了Backbone的基礎上,還得再找一個庫(好比MarionetteThorax)跟它配合才能駕輕就熟。正由於如此,我不認爲Backbone是個容易上手的框架。

CanJS

CanJS相對而言是這裏面最容易上手的。看看它只有一頁的網站(http://canjs.com/),基本上就知道怎麼作效率最高了。固然,還得找其餘一些資料看,不過我我的不多有這種需求(好比看其餘教程、上論壇或討論組提問呀什麼的)。

Ember

Ember的上手難度與Angular有一拼,我認爲學習Ember比學習Angular整體上容易一些,但它要求你一開始就要先搞懂一批基本概念。而Angular呢,一開始不須要這麼費勁也能作一些讓人興奮不已的事兒。Ember缺乏這種前期興奮點。

得分

Angular Backbone CanJS Ember
2 4 5 3

開發效率

enter image description here

比較全面地掌握了一個框架以後,重點就轉移到了產出上。什麼意思呢?約定啊、戲法啊,反正要儘量快。

Angular

熟悉Angular以後,你的效率會很是高,這一點毋庸置疑。之因此我沒給它打最高分,主要由於我以爲Ember的開發效率彷佛更勝一籌。

Backbone

Backbone要求你寫不少樣板(boilerplate )代碼,而我認爲這徹底不必。要我說,這是直接影響效率的一個因素。

CanJS

CanJS的開發效率屬於不快不慢的那種。不過,考慮到學習難度很低,所以適合早投入早產出的項目。

Ember

Ember的開發效率數一數二。它有不少強制性約束,能夠幫你自動完成的事不少。而開發人員要作的,就是學習和應用這些約定,Ember會替你處理到位。

得分

Angular Backbone CanJS Ember
4 2 4 5

社區支持

enter image description here

能輕易找到參考資料和專家幫忙嗎?

Backbone的社區很大,這是人所共知的事實。關於Backbone的教程也幾乎汗牛充棟,StackOverflow和IRC社區很是熱鬧。

Angular和Ember社區也至關大,教程什麼的一樣很多,StackOverflow和IRC也很熱鬧,但仍是比不上Backbone。

CanJS社區呢,相對小一些,好在社區成員比較活躍,樂於助人。我倒沒發現CanJS社區規模小有什麼負面影響。

得分

Angular Backbone CanJS Ember
4 5 3 4

生態系統

enter image description here

有沒有插件或庫構成的生態系統?

提及插件和庫,Backbone的選擇是最多的,可用插件俯拾皆是,這一點讓其餘框架都可望不可即。Angular的生態圈加上Angular UI仍是很使人矚目的。我以爲Ember的下游生態雖然欠發達,但Ember自己很受歡迎, 因此前景十分樂觀。CanJS的下游支脈比較少見。

得分

Angular Backbone CanJS Ember
4 5 2 4

文件大小

enter image description here

這個因素有時候很重要,特別是對於移動開發項目。

自身大小(無依賴,未壓縮)

Angular Backbone CanJS Ember
80KB 18KB 33KB 141KB

Backbone最小,這一點也是最爲人們所津津樂道的。但不能只看庫自己的體積。

包含依賴的大小

80KB的Angular是惟一不須要其餘庫就能使用的。其餘三個框架則都對其餘庫有依賴。

Backbone至少須要UnderscoreZepto。雖然在Underscore中可使用最小的模板來渲染視圖,但多數狀況下,還要藉助更好的模板引擎,好比Mustache。這樣它就增肥到了61KB。

CanJS至少須要Zepto,所以會達到57KB。

Ember須要jQueryHandlebars,總共是269KB。

Angular Backbone CanJS Ember
80KB 61KB 57KB 269KB

得分

Angular Backbone CanJS Ember
4 5 5 2

性能

enter image description here

我不認爲性能是選擇框架的關鍵因素,由於這些框架在預期應用領域中的性能都不差。固然啦,具體還得看你作什麼項目。要是想開發遊戲,那性能是個重要因素。

雖然我見過,也親自作過一些性能對比(好比這個測試),但我並不徹底相信測試結果。很難說這種測試的方法和結果與實際項目吻合。

不過,據我所見所聞,CanJS的性能是最高的,並且在視圖綁定上格外突出。相對來講,我以爲Angular性能稍差,由於它執行對象的髒檢查(dirty checking),這一點就拖了它的後腿了。參見這裏

得分

Angular Backbone CanJS Ember
3 4 5 4

成熟度

enter image description here

這個框架成熟嗎,通過實際檢驗了嗎,有多少網站在用它呢?

使用Backbone的網站不可勝數。最近兩年,它的核心代碼沒怎麼改過,這是成熟的一個重要標誌。

Ember已經不是新框架了,但它的重大變動仍是常常有,前幾月剛剛穩定下來。所以,目前還不能說它是個成熟的框架。

Angular彷佛比Ember更穩定,驗證的示例也更多,但不能與Backbone相提並論。

CanJS好像還未經任何驗證,由於不知道有什麼網站在使用它。不過,CanJS其實也沒有看起來那麼弱不經風,它但是從JavaScriptMVC精簡來的。JavaScriptMVC是2008年就出現的一個庫,所以會有不少智慧結晶留傳下來。

得分

Angular Backbone CanJS Ember
4 5 4 3

內存泄漏隱患

若是你想開發每次打開都得運行很長時間的單頁應用,這是必須得考慮的問題。你固然不但願本身的應用致使內存泄漏,這個問題很是現實。不幸的是,內存泄露很容易發生,而本身編寫的DOM事件監聽器則是重災區。

只要你守規矩,Angular、CanJS和Ember能把這個問題幫你解決好。Backbone則否則,它須要你本身手工來卸載。

得分

Angular Backbone CanJS Ember
5 3 5 5

我的偏好

這恐怕是選擇框架時最重要的一個因素了。

  • 你喜歡聲明式HTML嗎?-> Angular
  • 你喜歡使用模板引擎嗎?-> Backbone、CanJS或Ember
  • 你喜歡執拗已見的框架嗎?-> Ember
  • 你但願框架與最初的SmallTalk MVC模式徹底吻合嗎?-> 沒有徹底吻合的,或許CanJS最接近
  • 你但願使用目前看來很酷的框架嗎?-> Ember、Angular

本項沒辦法打分。

算總分

好啦,把各框架所得分數作個彙總吧。別忘了這只是我我的見解,若是你以爲哪一項打分有失偏頗,請務必告訴我。

(此處只是一個靜態圖表,單擊能夠打開) [+]查看原圖

若是每個因素的權重都同樣,那麼這幾個框架確實難分高下。所以,我以爲最終決定很大程度上仍是取決於你的我的偏好,或者必需要給每一個因素賦予不一樣的權重才行。

聊聊Backbone(公平到此爲止!)

我在這篇文章裏始終儘可能作到「一碗水端平」。但是,最後針對Backbone我還想再多說兩句,由於這些話如鯁在喉,不吐實在不快。

Backbone在兩年前是一個不錯的庫,但我知道:今天已經有了更好的選擇了。我也知道,不少人選擇Backbone其實僅僅由於使用它的人多,這是個惡性循環。

Backbone爲追求靈活性而拋棄了開發的便利性。但我以爲它實在太過了,功能嚴重缺少,致使開發效率很低。沒錯,有一大堆插件能夠實現這樣那樣的功能,可這樣一來你不只要學習Backbone,還得不斷學習怎麼使用那些插件。

Backbone的大型社區和生態系統也很誘人,但隨着其餘框架愈來愈受歡迎,這個優點也將慢慢消失。

正由於如此,我強烈建議你們選擇Backbone時要三思然後行。

2013-04-18更新:澄清一下,最後一節只表明個人觀點。另外也刪除了「如今該拋棄(Backbone)」那句話,有人說太過激了。

相關文章
相關標籤/搜索