為何轉(zhuǎn)向Spine.js的十個(gè)理由
在過去的幾年里,我逐漸將興趣由桌面轉(zhuǎn)移到web上。我對(duì)于能在任何設(shè)備上用瀏覽器訪問的app的這種方式很是著迷。我有用過HTML,CSS,Flash和PHP的經(jīng)驗(yàn),所以我很熟悉這一領(lǐng)域–但是我只曾做過網(wǎng)站,而不是web app。我開始深入了解Rails,并立刻愛上了它,我所熟知的Flash的快速反應(yīng)被替換成了頁(yè)面加載。因此,我轉(zhuǎn)向了Javascript。
就像學(xué)校新來(lái)的小孩,關(guān)于框架我分不清誰(shuí)是誰(shuí)。我尋找著,發(fā)覺 Backbone.js 幾乎在每個(gè)地方都能見著,于是我便假定他是個(gè)標(biāo)準(zhǔn)。幾個(gè)月后,我發(fā)現(xiàn)它不是為我準(zhǔn)備的–Backbone.js 缺乏清晰的使用方向。每個(gè)我閱讀過的教程都使用著不同的結(jié)構(gòu),這感覺太容易忽視常規(guī)有效的設(shè)計(jì)模式。
開始學(xué)習(xí) Spine.js ,我花了一個(gè)晚上通讀了用戶手冊(cè)以及試驗(yàn)它的示例app,我看到的一切看起來(lái)都挺好。那一晚,我是帶著燦爛睡覺的,即使我真的很難入眠,因?yàn)槲业炔患毕胧褂盟?。什么讓我如此興奮呢?就是下面的這是個(gè)理由:
1、清晰的結(jié)構(gòu)
Spine.js 遵循MVC模式,我寫的所有應(yīng)用都遵循著MVC架構(gòu),所以我很快就知道該怎么用Spine.js組織我的應(yīng)用結(jié)構(gòu)。這種似曾相識(shí)的感覺太棒了。這使得哪個(gè)類在干什么,哪個(gè)類是激活的清晰明了。
2、模型就是模型
Backbone.js也有模型,但是它很笨拙,因?yàn)橛行┘?ndash;本質(zhì)上是模型數(shù)組,它們能查詢API并用結(jié)果給自己賦值。Spine.js模型跟Rails模型非常相似。一個(gè)模型能夠被實(shí)例化用來(lái)呈現(xiàn)記錄,但是它也擁有類級(jí)別的方法從API中取出結(jié)果。這些方法返回結(jié)果而不是產(chǎn)生一個(gè)數(shù)組,所以我們不需要考慮類在何處活躍。因?yàn)榧鲜菍?shí)例,我看到過的許多示例中都把它們看作單例。結(jié)果,那些學(xué)習(xí)Backbone.js并跟隨著那些示例的人也學(xué)會(huì)了寫著不可測(cè)的代碼。
3、Spine.app
當(dāng)使用Backbone.js時(shí),我發(fā)現(xiàn)每次創(chuàng)建新類時(shí)我都會(huì)拷貝/粘貼代碼,我開始想念在Rails時(shí)我習(xí)慣的生成器了。只需一條命令,我就能基于模版生成一個(gè)帶有spec的新類,這為我節(jié)約了了幾年開發(fā)的生命。“開發(fā)Backbone.js生成器”持續(xù)停留在我的todo列表,但是我從未著手于此。
Spine.app 生成文件,只需一行,我就創(chuàng)建了一個(gè)新類并帶有spec,就像Rails一樣。
4、動(dòng)態(tài)記錄
這個(gè)就想瘋狂的黑魔法一樣,但是它解決了一個(gè)我在Backbone.js遇到的問題。假設(shè)你應(yīng)用的一個(gè)視圖獲得了一條記錄。然后你在不同的視圖獲取并更新了同一條記錄。在 Spine.js 中,兩條記錄都將同時(shí)更新。你不用擔(dān)心保持他們同步。當(dāng)我讀到這一條時(shí),我便為之感動(dòng)了。
5、元素Hash
使用Backbone.js時(shí),我總是發(fā)現(xiàn)我手動(dòng)地分配變量用來(lái)在每個(gè)視圖的渲染方法中嵌入元素,為每個(gè)元素重復(fù)相同的代碼–有很多的樣板文件。在Spine.js中,它擁有元素hash,key是選擇器,值則是變量名,正如Backbone.js事件hash一樣,你所有的元素都會(huì)被映射,這樣清晰而簡(jiǎn)潔。
6、方法更新
在我使用Flash的日子,優(yōu)化是生存的關(guān)鍵。如果我忘記移除某個(gè)事件監(jiān)聽器,我的app將會(huì)內(nèi)存溢出,就像一個(gè)少于維護(hù)的應(yīng)用。就因?yàn)檫@個(gè),我在每個(gè)類中都包含了一個(gè)方法用來(lái)注銷和移除所有的事件監(jiān)聽器。而Spine.js內(nèi)建有這個(gè)功能。
7、控制器中的路由
Spine.js中沒有Router類,這個(gè)功能屬于控制器類的一部分。在任何控制器中,我能導(dǎo)航至新的位置,并對(duì)新位置做出反應(yīng)。其他的控制器也同樣能對(duì)這個(gè)新位置作出反應(yīng)。現(xiàn)在就沒必要?jiǎng)?chuàng)建一個(gè)路由單例了。
8、模型適配器
默認(rèn)情況下,Spine.js 把模型保存在內(nèi)存中,但是有兩個(gè)適配器可以被應(yīng)用到任何的模型類上–Ajax和Local。只需簡(jiǎn)單的繼承這些適配器,你的數(shù)據(jù)將可以在遠(yuǎn)端數(shù)據(jù)庫(kù)存留或者是使用HTML5本地存儲(chǔ)API。所有這些功能僅需一行代碼。
9、從HTML元素中獲取模型
這是我在Backbone.js遇到的另一個(gè)問題,我會(huì)實(shí)例化一個(gè)視圖并綁定到一個(gè)模型,當(dāng)我需要不通過訪問視圖實(shí)例來(lái)引用數(shù)據(jù)時(shí),我就沒那么幸運(yùn)了。Spine.js提供了一個(gè)jQuery插件來(lái)訪問元素的模型。僅需在元素上調(diào)用data方法你變獲取了對(duì)應(yīng)模型。
10、日志
Spine.js 生來(lái)就具備著一個(gè)輕量級(jí)的方便日志模塊。你可以在任何控制器中調(diào)用log方法,它將會(huì)加上一系列前綴并輸出到console。
原文鏈接:http://www.mhtml5.com/2012/07/5222.html
【編輯推薦】