現在算法是新銳前端框架成功的重要因素


隨着前端MVVM的流行,小型框架現在越來越難存活了!react, angular等打着大公司旗號的框架占了半壁江山,而avalon以其良好兼容性在國內份額不斷上升。

前端也與后端一樣,遵循馬太效應,強者愈強,弱者愈弱。最后只剩下兩種框架,不斷被人發現BUG的框架與沒有人用的框架。MVVM本來就是一種非常復雜的分層架構。計算屬性就用了半數的Gof設計模式,雙向綁定則綁定6,7種DOM事件(像angular,avalon為了兼容IE6,數量達10以上)。但盡管這么復雜,只要使用者察覺不到,用得爽,對業務開發有幫助,就自然會有人用。因此現在國內許多公司,為了維護性,不斷將頁面形式由jquery為主的架構,轉為ng, react, avalon為核心的架構。

框架有人用,就有為它提新需要。有新需求,就有新feature。有新feature,框架就不斷膨脹。過去,angular使用臟檢測,avalon使用屬性劫持來監聽數據的變動,從而實現頁面智能刷新。但隨着人用得多,用得爽,尤其是后台系統,這些框架開始接手一些超大的頁面的活兒。上2000個綁定,angular就趴下了,上10000個綁定,avalon也氣喘喘了。MVVM遇到性能問題了。

前端通常不會遇到性能問題的,遇到性能問題,說明前端已經發展很高的程度了。知乎上有人把前端的問題抽象成兩點:復雜牆與性能牆。

太復雜的東西,我們可以拆分成一個個小塊,以分治方法處理。比如說模塊化,組件化。

性能問題,后端告訴我們使用大量的緩存算法還有池子,這個avalon1已經使用了。像angular這么牛的框架,當然也有很牛的算法,但還不夠牛,於是趴下了。直到react帶着虛擬DOM走到我們眼前。

虛擬DOM是什么呢?是一個用普通對象抽述的DOM樹嗎?這只是一部分。它包含三個內容:vtree, diff, patch。

vtree是生成虛擬DOM,GITHUB上有一些小庫,教你如何用VElement, VComment, VText這三個方法創建一個虛擬DOM(當然還有VThunk, VWidget 什么),但這樣笨拙的方式,顯然沒有人用。於是react 打包了一個叫JSX的模板引擎,用於生成虛擬DOM。

diff,就是比較前后虛擬DOM的差異,react等把所有變更歸納成7,8種變化,方便以后針對不同的變化應用不同的刷新函數。這個涉及許多算法,比如普通的DSF遍歷算法,最短編輯距離算法(只要是用於比較兩個列表的變動)

patch是應用變更於真實DOM,這與SVN版本管理差不多,得到不同點,修改現有版本。但如何知道這個虛擬DOM是對應某個真實DOM呢?是否遍歷整個DOM樹嗎?因此在第二步,我們可以在發生變化的虛擬DOM做一些標記,如記錄其位置。二分法等就能跟據索引找到對應的真實DOM。但這有風險,如果用戶用了jQuery插件,修改了DOM樹結構,真實DOM與虛擬DOM就不一一對應了,因此react 的入侵性與排他性是很強的。像angular, react是保持了要修改的節點,因此用戶以后怎么操作DOM樹,基本不影響它的運作。

說這里,我們已經提到許多算法名了。在jQuery時代,選擇器引擎就是一個從右到左的快速查找算法,它還是基於一些DOM API。像MVVM的許多算法,比如html parser,我們實現一個類JSX的模板,就必須用到的。然后將指令轉換為函數,收集里面的VM變量,就需要抽取JS變量,這也要懂點JS parser。以后的創建虛擬DOM樹的模板函數,diff, patch更是一堆算法。 前端框架終於到一個比拼算法的新時代了。

算法的好壞,決定了其性能的好壞。就像之前DOM庫一樣,大家都願意用速度最快的選擇器引擎。天下武功,唯快不破,也是這道理。

avalon也是從注重各種兼容性DOM的hack的發掘,轉向優化內部的各種算法。在用戶真正執行代碼,我們已經用各種算法將用戶的代碼改造成另一種形式,方便它以后這個新姿態起跑。react為什么這么快?因為在編譯過程,JSX等已經做了優化!

前端框架注定越來越復雜,現在讀不懂其源碼,以后估計也很難讀懂。就像你在2010年時不買房一樣,現在就很難買房了。門檻會越來越高。經濟學家稱此現象為階級固化。雖然社會(框架)的進步,讓大家過得很輕松,但進升之路卻越來越窄了!算法以后成為前端面試一個重點,因為DOM兼容問題會越來越少,徹底被框架與工程化所屏蔽。

最后安利一下我的框架avalon2, 官網遷到內地了。MVVM是一個好東西,切換到 avalon2就把你變成了兩個程序員 —— 一個處理那些你不需要關心的東西,另一個可以集中精力在問題本身上。這是一個很震人的改變,一個你應該很快就能習慣能喜歡上的改變。


免責聲明!

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



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