本書從源碼層面分析了Vue.js。首先,簡要介紹了Vue.js;然后詳細(xì)講解了其內(nèi)部核心技術(shù)“變化偵測”,這里帶領(lǐng)大家從0到1實(shí)現(xiàn)一個簡單的“變化偵測”系統(tǒng);接著詳細(xì)介紹了虛擬DOM技術(shù),其中包括虛擬DOM的原理及其patching算法;緊接著詳細(xì)討論了模板編譯技術(shù),其中包括模板解析器的實(shí)現(xiàn)原理、優(yōu)化器的原理以及代碼生成器的原理;最后詳細(xì)介紹了其整體架構(gòu)以及提供給我們使用的各種API的內(nèi)部原理,同時還介紹了生命周期、錯誤處理、指令系統(tǒng)與模板過濾器等功能的原理。
本書適合前端開發(fā)人員閱讀。
深入講解Vue.js實(shí)現(xiàn)原理和思想
360奇舞團(tuán)團(tuán)長月影和《JavaScript高級程序設(shè)計(jì)》譯者李松峰作序推薦
360前端工程師精心打造,帶你深入了解Vue.js的源碼
劉博文,網(wǎng)名Berwin,95后,從事Web前端工作5年,2015年加入360奇舞團(tuán),現(xiàn)任360導(dǎo)航事業(yè)部前端工程師,負(fù)責(zé)360導(dǎo)航首頁及二級頁創(chuàng)新項(xiàng)目等億級PV站點(diǎn)的設(shè)計(jì)與優(yōu)化,推動Vue.js成為部門內(nèi)廣泛使用的核心技術(shù)棧,獨(dú)立研發(fā)相關(guān)開發(fā)工具與技術(shù)解決方案并使之成功落地。
W3C性能工作組成員,在Web性能領(lǐng)域有深入研究。熱愛開源,熱愛技術(shù),夢想是用技術(shù)改變世界。個人GitHub地址:https://github.com/berwin。
第 1章 Vue.js簡介 1
1.1 什么是Vue.js 1
1.2 Vue.js簡史 2
第 一篇 變化偵測
第 2章 Object的變化偵測 6
2.1 什么是變化偵測 6
2.2 如何追蹤變化 7
2.3 如何收集依賴 7
2.4 依賴收集在哪里 8
2.5 依賴是誰 10
2.6 什么是Watcher 10
2.7 遞歸偵測所有key 12
2.8 關(guān)于Object的問題 13
2.9 總結(jié) 14
第3章 Array的變化偵測 16
3.1 如何追蹤變化 16
3.2 攔截器 17
3.3 使用攔截器覆蓋Array原型 18
3.4 將攔截器方法掛載到數(shù)組的屬性上 19
3.5 如何收集依賴 21
3.6 依賴列表存在哪兒 22
3.7 收集依賴 23
3.8 在攔截器中獲取Observer實(shí)例 24
3.9 向數(shù)組的依賴發(fā)送通知 25
3.10 偵測數(shù)組中元素的變化 26
3.11 偵測新增元素的變化 27
3.11.1 獲取新增元素 27
3.11.2 使用Observer偵測新增元素 28
3.12 關(guān)于Array的問題 29
3.13 總結(jié) 29
第4章 變化偵測相關(guān)的API實(shí)現(xiàn)原理 31
4.1 vm.$watch 31
4.1.1 用法 31
4.1.2 watch的內(nèi)部原理 32
4.1.3 deep參數(shù)的實(shí)現(xiàn)原理 36
4.2 vm.$set 38
4.2.1 用法 38
4.2.2 Array的處理 39
4.2.3 key已經(jīng)存在于target中 40
4.2.4 處理新增的屬性 40
4.3 vm.$delete 41
4.3.1 用法 42
4.3.2 實(shí)現(xiàn)原理 42
4.4 總結(jié) 45
第二篇 虛擬DOM
第5章 虛擬DOM簡介 48
5.1 什么是虛擬DOM 48
5.2 為什么要引入虛擬DOM 51
5.3 Vue.js中的虛擬DOM 51
5.4 總結(jié) 53
第6章 VNode 54
6.1 什么是VNode 54
6.2 VNode的作用 55
6.3 VNode的類型 56
6.3.1 注釋節(jié)點(diǎn) 57
6.3.2 文本節(jié)點(diǎn) 57
6.3.3 克隆節(jié)點(diǎn) 57
6.3.4 元素節(jié)點(diǎn) 58
6.3.5 組件節(jié)點(diǎn) 59
6.3.6 函數(shù)式組件 59
6.4 總結(jié) 59
第7章 patch 60
7.1 patch介紹 60
7.1.1 新增節(jié)點(diǎn) 61
7.1.2 刪除節(jié)點(diǎn) 62
7.1.3 更新節(jié)點(diǎn) 63
7.1.4 小結(jié) 63
7.2 創(chuàng)建節(jié)點(diǎn) 64
7.3 刪除節(jié)點(diǎn) 67
7.4 更新節(jié)點(diǎn) 68
7.4.1 靜態(tài)節(jié)點(diǎn) 68
7.4.2 新虛擬節(jié)點(diǎn)有文本屬性 69
7.4.3 新虛擬節(jié)點(diǎn)無文本屬性 69
7.4.4 小結(jié) 70
7.5 更新子節(jié)點(diǎn) 72
7.5.1 更新策略 72
7.5.2 優(yōu)化策略 77
7.5.3 哪些節(jié)點(diǎn)是未處理過的 82
7.5.4 小結(jié) 83
7.6 總結(jié) 86
第三篇 模板編譯原理
第8章 模板編譯 88
8.1 概念 88
8.2 將模板編譯成渲染函數(shù) 89
8.2.1 解析器 90
8.2.2 優(yōu)化器 91
8.2.3 代碼生成器 91
8.3 總結(jié) 92
第9章 解析器 93
9.1 解析器的作用 93
9.2 解析器內(nèi)部運(yùn)行原理 94
9.3 HTML解析器 99
9.3.1 運(yùn)行原理 100
9.3.2 截取開始標(biāo)簽 101
9.3.3 截取結(jié)束標(biāo)簽 107
9.3.4 截取注釋 108
9.3.5 截取條件注釋 108
9.3.6 截取DOCTYPE 109
9.3.7 截取文本 109
9.3.8 純文本內(nèi)容元素的處理 112
9.3.9 使用棧維護(hù)DOM層級 114
9.3.10 整體邏輯 114
9.4 文本解析器 117
9.5 總結(jié) 121
第 10章 優(yōu)化器 122
10.1 找出所有靜態(tài)節(jié)點(diǎn)并標(biāo)記 125
10.2 找出所有靜態(tài)根節(jié)點(diǎn)并標(biāo)記 127
10.3 總結(jié) 129
第 11章 代碼生成器 130
11.1 通過AST生成代碼字符串 131
11.2 代碼生成器的原理 134
11.2.1 元素節(jié)點(diǎn) 134
11.2.2 文本節(jié)點(diǎn) 136
11.2.3 注釋節(jié)點(diǎn) 137
11.3 總結(jié) 137
第四篇 整體流程
第 12章 架構(gòu)設(shè)計(jì)與項(xiàng)目結(jié)構(gòu) 140
12.1 目錄結(jié)構(gòu) 140
12.2 架構(gòu)設(shè)計(jì) 143
12.3 總結(jié) 145
第 13章 實(shí)例方法與全局API的
實(shí)現(xiàn)原理 146
13.1 數(shù)據(jù)相關(guān)的實(shí)例方法 147
13.2 事件相關(guān)的實(shí)例方法 147
13.2.1 vm.$on 148
13.2.2 vm.$off 149
13.2.3 vm.$once 152
13.2.4 vm.$emit 153
13.3 生命周期相關(guān)的實(shí)例方法 154
13.3.1 vm.$forceUpdate 154
13.3.2 vm.$destroy 155
13.3.3 vm.$nextTick 159
13.3.4 vm.$mount 169
13.4 全局API的實(shí)現(xiàn)原理 178
13.4.1 Vue.extend 178
13.4.2 Vue.nextTick 182
13.4.3 Vue.set 183
13.4.4 Vue.delete 183
13.4.5 Vue.directive 184
13.4.6 Vue.filter 185
13.4.7 Vue.component 186
13.4.8 Vue.use 188
13.4.9 Vue.mixin 189
13.4.10 Vue.compile 190
13.4.11 Vue.version 190
13.5 總結(jié) 191
第 14章 生命周期 192
14.1 生命周期圖示 192
14.1.1 初始化階段 193
14.1.2 模板編譯階段 194
14.1.3 掛載階段 194
14.1.4 卸載階段 194
14.1.5 小結(jié) 194
14.2 從源碼角度了解生命周期 195
14.3 errorCaptured與錯誤處理 199
14.4 初始化實(shí)例屬性 203
14.5 初始化事件 204
14.6 初始化inject 208
14.6.1 provide/inject的使用方式 208
14.6.2 inject的內(nèi)部原理 210
14.7 初始化狀態(tài) 215
14.7.1 初始化props 216
14.7.2 初始化methods 224
14.7.3 初始化data 225
14.7.4 初始化computed 228
14.7.5 初始化watch 238
14.8 初始化provide 241
14.9 總結(jié) 241
第 15章 指令的奧秘 242
15.1 指令原理概述 242
15.1.1 v-if指令的原理概述 243
15.1.2 v-for指令的原理概述 243
15.1.3 v-on指令 244
15.2 自定義指令的內(nèi)部原理 246
15.3 虛擬DOM鉤子函數(shù) 250
15.4 總結(jié) 251
第 16章 過濾器的奧秘 252
16.1 過濾器原理概述 253
16.1.1 串聯(lián)過濾器 254
16.1.2 濾器接收參數(shù) 254
16.1.3 resolveFilter的內(nèi)部原理 255
16.2 解析過濾器 256
16.3 總結(jié) 258
第 17章 最佳實(shí)踐 259
17.1 為列表渲染設(shè)置屬性key 259
17.2 在v-if/v-if-else/v-else中使用key 259
17.3 路由切換組件不變 260
17.3.1 路由導(dǎo)航守衛(wèi)beforeRouteUpdate 261
17.3.2 觀察 $route對象的變化 261
17.3.3 為router-view組件添加屬性key 262
17.4 為所有路由統(tǒng)一添加query 262
17.4.1 使用全局守衛(wèi)beforeEach 263
17.4.2 使用函數(shù)劫持 263
17.5 區(qū)分Vuex與props的使用邊界 264
17.6 避免v-if和v-for一起使用 264
17.7 為組件樣式設(shè)置作用域 266
17.8 避免在scoped中使用元素選擇器 267
17.9 避免隱性的父子組件通信 268
17.10 單文件組件如何命名 268
17.10.1 單文件組件的文件名的大小寫 268
17.10.2 基礎(chǔ)組件名 269
17.10.3 單例組件名 270
17.10.4 緊密耦合的組件名 270
17.10.5 組件名中的單詞順序 271
17.10.6 完整單詞的組件名 272
17.10.7 組件名為多個單詞 273
17.10.8 模板中的組件名大小寫 273
17.10.9 JS/JSX中的組件名大小寫 274
17.11 自閉合組件 275
17.12 prop名的大小寫 276
17.13 多個特性的元素 276
17.14 模板中簡單的表達(dá)式 276
17.15 簡單的計(jì)算屬性 277
17.16 指令縮寫 278
17.17 良好的代碼順序 278
17.17.1 組件/實(shí)例的選項(xiàng)的順序 278
17.17.2 元素特性的順序 280
17.17.3 單文件組件頂級元素的順序 281
17.18 總結(jié) 282