一、關于數據綁定
- Angular
使用雙向綁定即:界面的操作能實時反映到數據,數據的變更能實時展現到界面。
原理:
$scope變量中使用臟值檢查來實現。
$scope.$watch函數,監視一個變量的變化。函數有三參數,”要觀察什么”,”在變化時要發生什么”,以及你要監視的是一個變量還是一個對象。
使用ng-model時,你可以使用雙向數據綁定。
調用$scope.$watch時只為它傳遞了一個參數,無論作用域中的什么東西發生了變化,這個函數都會被調用。在ng-model中,這個函數被用來檢查模型和視圖有沒有同步,如果沒有同步,它將會使用新值來更新模型數據。
雙向綁定的三個重要方法:
$scope.$apply()
$scope.$digest()
$scope.$watch()
(臟檢測)是用來檢查綁定的scope中的對象的狀態的,例如,在js里創建了一個對象,并且把這個對象綁定在scope下,這樣這個對象就處于digest loop中,loop通過遍歷這些對象來發現他們是否改變,如果改變就會調用相應的處理方法來實現雙向綁定
- Vue 也支持雙向綁定,默認為單向綁定,數據從父組件單向傳給子組件。在大型應用中使用單向綁定讓數據流易于理解。
臟檢測的利弊
和ember.js等技術的getter/setter觀測機制相比(優):
getter/setter當每次對DOM產生變更,它都要修改DOM樹的結構,性能影響大,Angular會把批量操作延時到一次更新,性能相對較好。
和Vue相比(呈現劣勢)
Vue.js 有更好的性能,并且非常非常容易優化,因為它不使用臟檢查。Angular,當 watcher 越來越多時會變得越來越慢,因為作用域內的每一次變化,所有 watcher 都要重新計算。并且,如果一些 watcher 觸發另一個更新,臟檢查循環(digest cycle)可能要運行多次。 Angular 用戶常常要使用深奧的技術,以解決臟檢查循環的問題。有時沒有簡單的辦法來優化有大量 watcher 的作用域。Vue.js 則根本沒有這個問題,因為它使用基于依賴追蹤的觀察系統并且異步列隊更新,所有的數據變化都是獨立地觸發,除非它們之間有明確的依賴關系。唯一需要做的優化是在 v-for 上使用 track-by。
React-單向數據流
MVVM流的Angular和Vue,都是通過類似模板的語法,描述界面狀態與數據的綁定關系,然后通過內部轉換,把這個結構建立起來,當界面發生變化的時候,按照配置規則去更新相應的數據,然后,再根據配置好的規則去,從數據更新界面狀態。
React推崇的是函數式編程和單向數據流:給定原始界面(或數據),施加一個變化,就能推導出另外一個狀態(界面或者數據的更新)。
React和Vue都可以配合Redux來管理狀態數據。
二、 視圖渲染
AngularJS的工作原理是:HTML模板將會被瀏覽器解析到DOM中, DOM結構成為AngularJS編譯器的輸入。AngularJS將會遍歷DOM模板, 來生成相應的NG指令,所有的指令都負責針對view(即HTML中的ng-model)來設置數據綁定。因此, NG框架是在DOM加載完成之后, 才開始起作用的
React 的渲染建立在 Virtual DOM 上——一種在內存中描述 DOM 樹狀態的數據結構。當狀態發生變化時,React 重新渲染 Virtual DOM,比較計算之后給真實 DOM 打補丁。
Virtual DOM 提供了函數式的方法描述視圖,它不使用數據觀察機制,每次更新都會重新渲染整個應用,因此從定義上保證了視圖與數據的同步。它也開辟了 JavaScript 同構應用的可能性。
在超大量數據的首屏渲染速度上,React 有一定優勢,因為 Vue 的渲染機制啟動時候要做的工作比較多,而且 React 支持服務端渲染。
React 的 Virtual DOM 也需要優化。復雜的應用里可以選擇 1. 手動添加 shouldComponentUpdate 來避免不需要的 vdom re-render;2. Components 盡可能都用 pureRenderMixin,然后采用 Flux 結構 + Immutable.js。其實也不是那么簡單的。相比之下,Vue 由于采用依賴追蹤,默認就是優化狀態:動了多少數據,就觸發多少更新,不多也不少。
React 和 Angular 2 都有服務端渲染和原生渲染的功能。
Vue.js 不使用 Virtual DOM 而是使用真實 DOM 作為模板,數據綁定到真實節點。Vue.js 的應用環境必須提供 DOM。Vue.js 有時性能會比 React 好**,而且幾乎不用手工優化。
三 、性能與優化
性能方面,這幾個主流框架都應該可以輕松應付大部分常見場景的性能需求,區別在于可優化性和優化對于開發體驗的影響。Vue 的話需要加好 track-by 。React 需要 shouldComponentUpdate 或者全面 Immutable,Angular 2 需要手動指定 change detection strategy。從整體趨勢上來說,瀏覽器和手機還會越變越快,框架本身的渲染性能在整個前端性能優化體系中,會漸漸淡化,更多的優化點還是在構建方式、緩存、圖片加載、網絡鏈路、HTTP/2 等方面。