javascript
《AngularJS in Action》—— 与作者Lukas Ruebbelke的一次访谈
由Lukas Ruebbelke所編著的《AngularJS in Action》一書是一本關于Angular版本1的實踐性書籍。全書通過一個ToDo列表應用Angello展現了AngularJS的架構與組件。在AngularJS v2的Beta版本剛剛發布的這一時刻,InfoQ與本書的作者進行了一次訪談,談及了從本書中可獲得的知識,以及AngularJS現在與未來的發展方向。\
InfoQ:你能否為我們比較一下Angular與其他一些競爭框架的優劣,例如React?\
\Lukas Ruebbelke:我認為“競爭”這個詞用在這里有些不太恰當。React是一個優秀的渲染框架,它對于我們如何在應用中組織數據流起到了很大的影響。React所表現出的獨到見解讓許多框架停下了手頭上的工作,并開始反思他們的方式是否正確。可以說,Angular團隊與React團隊之間的關系非常友好,我們樂于看到他們能夠打破固有的思維,為我們帶來新的思想。\
對于前端框架來說,如今正處于健康的發展道路上。因為我感到我們已經遠離了那些有害的空話,不再使用“這個框架比那個框架好”的表達方式,而是意識到這一領域中還存在著大量的成長空間。我們與Ember CLI團隊之間的互動就是一個良好的例子。\
讓我用一些具體的術語詳細地分析一下你的問題吧。React主要專注于視圖的渲染,并且表現得非常出色。Angular則提供了更多的特性,內置了model、controller、directive以及animation等功能的實現。實際上,你完全可以用Angular打造應用的架構,而通過某個directive,讓React承擔起渲染的任務,這種做法并不罕見。
\InfoQ:在你看來,我們是否應當在Angular 1.x版本的學習和開發上繼續投入精力,還是應當等待v2的降臨?我們知道v2對于v1的向后兼容性十分混亂,那么在過去幾年間開發的項目今后將何去何從?\
\Lukas:這一點完全取決于你適應變化的能力。我在所有新開發的Angular應用中都使用了EcmaScript 2015語法,并且將一切功能都分解為directive,它在Angular 2應用中的使用幾乎是相同的。此外,我曾經傾向于使用factory以及純粹的controller,但現在我完全轉為使用service和controller as語法了,這種方式強制我使用EcmaScript 2015語法或TypeScript類。由于采取了這種正確的方式,對于這一問題的回答首次顯得不那么迫切了。它在架構上表現了重疊性,讓遷移過程變得平滑許多。從我個人來看,我已經開始喜歡新的風格了。\
Angular 1與2之間的問題主要是由發布的消息所引起的。當Angular 2初次宣布時,它聽上去似乎顛覆了我們所知的一切。人們感到迷失了方向,因為感覺上好像完全無法從一個版本遷移至另一版本。在那之后,Angular團隊已經很好地理清了現在的狀況,而且實際上,這種遷移路徑是完全合理的。舉例來說,在Angular 1.5中引入了組件語法,以定義隸屬于一個module中的組件,這就讓我們能夠更簡便地以Angular 2的風格編寫Angular 1.x的應用了。
\InfoQ:當Angular v2發布之后,你是否計劃開始為本書提供一個修訂版本呢?\
\Lukas:我已經開始著手于編寫新版本了,新版本將進一步詳細闡述本書的某些部分,同時引入一些新的章節,以描述一些新內容,例如測試。新版本還將涵蓋一些架構模式,掌握了這些模式將能夠幫助我們遷移至Angular 2。\
我同時也在為本書中所描述的示例應用Angello開發一個對應Angular 2的版本。等到恰當的時機,我們將找到一種最佳的方式以分享我們從這一過程中所學到的知識。我認為,為一個具有一定復雜度的應用同時創建兩個版本是一種優秀的學習體驗。
\InfoQ:你能否進一步闡述一下Angular在性能上的開銷,以及通過哪些方式能夠在響應時間這方面帶來性能上的提升?(注:例如單向或是雙向綁定?)\
\Lukas:當我對Angular應用進行性能審查時,我發現主要的性能問題來自于用戶體驗或是一般性的編程問題。有些時候,人們傾向于無視一些完善的架構性原則,因為JavaScript本身是非常松散與易于操作的。當人們問我如何成為更好的Angular開發者時,我總是讓他們首先去閱讀Robert C. Martin所編著的《代碼整潔之道》。\
舉例來說,你應當避免那些復雜的邏輯結構,他們或許內含業務邏輯,并以過程化的方式進行解析。如果你在Angular的digest周期中執行這些邏輯,那問題將變得更混亂。你還應當避免在一個頁面中顯示1萬行數據,因為用戶根本無法有效地處理這么龐大的信息。將所有這些信息堆積在一起是根本不可行的,而如果你為每一行數據又加入了數據綁定,那么事情肯定要亂套了。\
無論在任何應用程序中,當處理性能問題時,第一步都是對用戶體驗進行優化。接下來就要應用各種經過嘗試的、真正的架構級原則,例如通過細粒度的、單一職責的代碼單元組合你的應用程序。\
如果你需要,那么還可以嘗試通過某些訣竅進一步提升應用程序的性能。如果你需要對某個復雜對象的集合進行綁定,我有時會選擇將這些對象轉換為輕量級的對象,其中僅包含需要顯示的部分屬性。如果你的視圖不需要進行重繪,那么單向的數據綁定也是一種良好的優化方式。而為一系列元素項手動添加分頁功能也能夠起到優化作用。只要你能夠減少在頁面上所綁定的元素的數目和復雜度,就能夠起到優化作用。\
我建議你觀看Scott Moss在ngConf 2015大會上關于性能所做的演講,他的這次演講非常成功。
\InfoQ:對于用Angular開發的復雜應用來說,掌握promise有多重要?\
\Lukas:對于使用JavaScript開發的任何復雜應用來說,要充分掌握異步編程,對于promise的理解是非常重要的。Promise目前是一項非常重要的工具,但我相信Observable才是將來的發展方向,可以將其視為promose++。
\InfoQ:你是否推薦使用Angular實現動畫效果?\
\Lukas:當然了!這也正是我最愛Angular的一點。其原因在于,Angular并沒有采取直接處理動畫的方式,而是暴露了一系列事件的鉤子,從而可以任意選擇你希望的動畫應用方式。\
對于一些簡單的效果,我可以通過使用CSS在3分鐘之內搞定,它將改變整個應用的外面。如果我需要處理一些非常復雜的效果,那么我就可以選擇利用這些事件的鉤子,在其中編寫大量的JavaScript代碼。我是Greensock的忠實粉絲,通過這個庫,你可以做的事幾乎是無限的。在這方面,Angular能夠配合任何庫而表現得非常出色。
\InfoQ:在現代的web應用中使用Angular有哪些優點與缺點?\
\Lukas:最近三年以來,Angular是我的唯一選擇。關于它的優點,我會選擇它所帶來的生產力。你可以選擇利用Angular中預定義的功能,圍繞著它實現你的特性,而又不會受到這些功能的限制。Angular能夠充分發揮設計者-開發者的工作流,它對HTML進行了擴展,甚至為你提供了一系列工具,可以將你的HTML轉變為一種自定義的領域特定語言(DSL)。由于依賴注入的存在,Angular鼓勵你進行測試。而整個生態系統與社區的活躍也是有目共暏的。\
至于缺點,我只能想到一些邊緣情況,你可能需要一些非常獨特的功能,例如開發一個游戲或是3D渲染這種有些瘋狂的舉動。在這種情況下,Angular或許不是一種很好的選擇,它無法解決所有問題。
\InfoQ:在過去幾年中,移動優先策略以及移動開發正在不斷成長。能否方便地從Angular遷移至基于它開發的移動框架(例如Ionic、Mobile Angular UI等等)?你對于移動開發與Angular的應用有什么建議嗎?\
\Lukas:通過Ionic進行移動開發不需要你投入多少精力。我個人與Ionic團隊有很好的伙伴關系,有一次我曾經問Adam Bradley,怎樣能成為一人Ionic的專家。他告訴我,要成為一個Ionic專家,我只需要成為一個Angular專家就夠了。這一點已經由我的經驗無數次證實了。\
Angular Material是另一個在移動開發上表現優秀的項目,它為你帶來了Angular的各種能力以及Material Design的美學觀。無論是在何種設備或屏幕分辨率上,每個組件都能夠完美地呈現。\
從這個角度來說,我有一種被寵壞的感覺。桌面開發與移動開發之間的界限已經越來越模糊了,因而Ionic與Angular之間能夠良好地結合在一起。
\InfoQ:你今后打算怎樣參與Angular的項目,還有什么寫作計劃嗎?\
\Lukas:我十分喜愛Angular,或許我已經是這個框架最忠實的啦啦隊長了。這個團隊匯聚了眾多我所認識的優秀人才,而他們又是如此親切與寬容,我很榮幸與能這一項目聯系在一起。\
我的腦海中已經浮現了大量有關Angular的內容與項目,一定會在某一天以某種形式發表這些內容的。
\關于本書作者
\Lukas Ruebbelke是一位全職web開發者,也是AngularJS社區中一位非?;钴S的貢獻者。\
查看英文原文:AngularJS in Action - An Interview With Lukas Ruebbelke
總結
以上是生活随笔為你收集整理的《AngularJS in Action》—— 与作者Lukas Ruebbelke的一次访谈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python笔记-列表和元组
- 下一篇: Ibatis学习总结7--SqlMapC