前端展望:取avalon,棄angular


打給比方,如果說angularJS是劍,那么avalon就是匕首。匕首比劍更易學,更快,更適合快速作戰...
我們還是直接來實際的吧:
 
目前項目開發中有以下幾個通用需求:
  • 有前端路由系統,用來划分邏輯模塊。
  • 有異步模塊載入,如requireJS或者seaJS。
  • 數據與視圖自動綁定,並且性能出眾。
  • 框架學習曲線不要太陡,並且讓我的代碼越少越好。
路由
AngularJS不能無縫與第三方路由整合,只能用它自己的模塊,如”ui-status“。原因是AngularJS的數據模型是包裹在它的“controller”作用域里面的。當然你可以把這些數據模型拋到全局作用域里,但即便如此,你對這些數據模型操作以后還是要手動調用“scope.$digest()”才能影響到視圖。
avalon暫時需要借助第三方路由模塊,可以無縫整合。例如,通常路由模塊接受一個對象作為參數,這個對象中的鍵名是路由的路徑,值是一個回調函數,當url符合這個路徑時就自動執行回調。在這個回調里,我們可以直接操作avalon的數據模型,並且數據模型的改變會立即影響到視圖,如:
 
 
異步載入
AngularJS中本身沒有異步模塊加載系統,作者在公開場合對這個問題的回答是:“不認為現在有多少前端應用真正大到異步加載,絕大部分時候通過壓縮、緩存就足夠了”。但是也有一些模塊來讓AngularJS支持異步加載或者與第三方異步模塊整合。具體可以在github上搜“requireJS angularJS”。
avalon自帶AMD模塊加載器。
 
數據與視圖綁定及性能
Talk is cheap,我們直接來看內部實現吧。
AngularJS的機制:AngularJS提供了一個機制讓你聲明頁面上的dom事件和對應的需要出發的數據模型的方法,例如你在一個元素上寫上一個“ng-click='changeMyName()'”的屬性,當你點擊它時,AngularJS就會自動執行“changeMyName”的方法。除了執行這個方法,AngularJS還會觸發一個叫做“$digest”的函數。這個函數會直接檢測“所有的數據模型”是否改動,有改動就去更新相應的視圖元素。你可以去github上把AngularJS克隆下來,翻到“src/ng/”目錄下的“$digest”函數看看。我縮略掉了幾個細節的地方,一下讓大家先看全貌(注意注釋部分):
 
avalon的機制:將數據模型中的屬性用get 和set 方法重寫。在set方法中去更新所有和當前數據模型有關的視圖元素,這就是為什么avalon一更新數據就能馬上反映到視圖上、並且性能更出眾的原因。直接翻到avalon源碼的“modelFactory”函數,在這個函數中avalon收集和當前模型有關的視圖元素、其他相關聯的數據,最后注冊到屬性中。其中更詳細的原理可以直接參考作者 司徒正美 的github  https://github.com/RubyLouvre/avalon
 
學習曲線與代碼量
AngularJS的學習曲線明顯偏陡,其中的directive等概念雖然功能強大,但對新手來說要掌握的東西太多。avalon則相對平滑。avalon在人代碼形式上幾乎沒有任何要求,因此代碼量也比AngularJS更少。
 
除了以上幾個方面,在選擇的時候還有一些要考慮的情況,例如:AngularJS有完整的測試、打包,代碼拆分得非常有調理。avalon因為本身簡單,且版本號還未到1,因此還有不少問題,其中包括部分代碼不能用。但總的來說,還是推薦使用avalon,原因很簡單:如果你能夠很好的理解並AngularJS了,那你的水平足夠把avalon玩得更順手、更隨心所欲了,像劍聖手中的匕首,已足以於千軍萬馬中取上將首級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM