原文:你應該要知道的Vue.jshtml
該篇文章主要對Vue中應該要掌握的知識點的一些整理。只是一個引子,並無過多的深刻,可是但願能根據這篇文章從各個點對Vue有一個更好的瞭解,對本身有一個更好的定位。只會用API的前端不是好的程序員。前端
由於組件可能被多處使用,但它們的data是私有的,因此每一個組件都要return一個新的data對象,若是共享data,修改其中一個會影響其餘組件vue
$on
、$emit
場景:在vue中,點擊button,隨機生成a、b、c組件中的一個node
is
render
思路:設定一個components數組,button點擊一次,push一個組件名,v-for
遍歷components,並用is
或render
動態生成react
vue-loader 是一個 webpack 的 loader,能夠將單文件組件轉換爲 JavaScript 模塊webpack
引用文檔的說法:git
ES2015
;webpack loader
,好比對 <style>
使用 Sass
和對 <template>
使用 Jade
;.vue
文件中容許自定義節點,而後使用自定義的 loader 進行處理;<style>
和 <template>
中的靜態資源看成模塊來對待,並使用 webpack loader
進行處理;主要經過vue-server-renderer
將Vue組件輸出成HTML,過程:程序員
實現數據綁定的常見作法:github
Object.defineProperty
:劫持各個屬性的setter
,getter
vue採用的是數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()
來實現對屬性的劫持,並在數據變更時發佈消息給訂閱者,使其觸發相應的監聽回調。web
具體步驟:
一、 實現Observer
將須要observe的數據對象進行遞歸遍歷,包括子屬性對象的屬性,都加上setter
和getter
。實現一個消息訂閱器,維護一個數組,用來收集訂閱者,數據變更觸發notify,再調用訂閱者的update方法
二、 實現Compile
compile解析模板指令,將模板中的變量替換成數據,而後初始化渲染頁面視圖,並將每一個指令對應的節點綁定更新函數,添加監聽數據的訂閱者,一旦數據有變更,收到通知,更新視圖
三、 實現Watcher
Watcher訂閱者是Observer和Compile之間通訊的橋樑
主要作的事情是:
四、 實現MVVM
MVVM做爲數據綁定的入口,整合Observer、Compile和Watcher三者,經過Observer來監聽本身的model數據變化,經過Compile來解析編譯模板指令,最終利用Watcher搭起Observer和Compile之間的通訊橋樑,達到數據變化 -> 視圖更新;視圖交互變化(input) -> 數據model變動的雙向綁定效果
template會被編譯成AST語法樹,AST會通過generate獲得render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點
司徒大佬有一篇很好的文章:前端模板的原理與實現
Virtual DOM
?一方面是出於性能方面的考量:
可是性能受場景的影響是很是大的,不一樣的場景可能形成不一樣實現方案之間成倍的性能差距,因此依賴細粒度綁定及 Virtual DOM
哪一個的性能更好不是一個容易下定論的問題。更重要的緣由是爲了解耦HTML
依賴,這帶來兩個很是重要的好處是:
綜上,Virtual DOM
在性能上的收益並非最主要的,更重要的是它使得 Vue 具有了現代框架應有的高級特性。
這部分比較複雜,很差懂,推薦一篇不錯的文章: 解析vue2.0的diff算法
相同點:
SSR
Virtual DOM
不一樣點:
Virtual DOM
是追蹤每一個組件的依賴關係,不會渲染整個組件樹,react 每當應該狀態被改變時,所有子組件都會 re-render