国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在不看源碼情況下學petite-vue源碼

開發 前端
本文介紹了復雜框架源碼的閱讀辦法—即從抽象到具體。從mount時與update時的調用棧推導出整體工作流程,從整體工作流程中發現核心知識— 響應式更新。

[[410856]]

大家好,我是卡頌。

周末沒啥事,準備找個優秀且代碼量不多的庫學習下。最終選擇了最近發布的petite-vue,原因如下:

  • 代碼量少(只有5.8kb),且源碼模塊化程度高(相比于React),易讀
  • 基于Vite構建,執行yarn dev就能開始調試源碼
  • 沒有虛擬DOM、編譯時方案,可以作為讀Vue源碼的鋪墊
  • 底層的響應式更新原理同樣適用于Mobx、SolidJS等庫,一次閱讀多份收獲
[[410857]]

但是周末時間這么寶貴,而且我都4年沒用過Vue了,如何才能高效學習源碼呢?

最好是「在不看源碼的情況下把源碼學了」。

接下來,我就以petite-vue為例為大家示范學源碼的正確姿勢。

怎么快怎么來

可以將petite-vue理解為:用真實DOM取代Vue模版的簡易Vue。

比如如下Demo:

  1. <script type="module"
  2.   import { createApp } from '../src' 
  3.   createApp({count: 0}).mount() 
  4. </script> 
  5.  
  6. <div v-scope> 
  7.   <button @click="count++">add 1</button> 
  8.   <p>{{count}}</p> 
  9. </div>   

div及其子孫節點是真實的DOM標簽,所以頁面初始化時如下:

圖片

接著執行如下代碼,完成petite-vue初始化:

  1. createApp({count: 0}).mount() 

此時頁面:

圖片

讀框架源碼切忌一上手就從入口函數一路調試,很容易就懵逼了。正確的方式是像剝洋蔥一樣一層一層剝開:

[[410860]]

這好像是大蒜?

所以,讓我們先從Performance面板看看「首屏渲染」的調用棧:

調用棧大體分為藍框、紅框兩部分,先看左邊藍框部分:

圖片

通過createContext與reactive關鍵詞判斷大概是創建響應式上下文。至于響應式的含義,我們還不清楚。

接著看右邊紅框部分:

圖片

從調用棧深度、頁面渲染的效果我們猜測,這部分做的工作包括:

  • 遍歷DOM
  • 完成數據與視圖的雙向綁定
  • 初始化渲染

接下來,我們來驗證猜想。

注意,到目前為止,我們一行源碼都還沒看

驗證遍歷DOM

調用棧中walk與walkChildren被調用多次,大概率他們就是具體遍歷工作執行的方法,讓我們確認下。

在源碼walk方法中打上log:

  1. export const walk = (node: Node, ctx: Context): ChildNode | null | void => { 
  2.   console.log('walk', node); 
  3.   // ...   

排除換行符"\n "對應的文本節點,打印順序如下:

  1. walk div 
  2. walk <button>add 1</button> 
  3. walk "add 1" 
  4. walk <p>0</p> 
  5. walk "0" 

從打印結果看,這是個「深度優先遍歷」(如果有子節點就遍歷子節點,沒有子節點就遍歷兄弟節點)

顯然,petite-vue mount時采用「深度優先遍歷」,并對遍歷到的每個與「上下文狀態」相關的DOM節點進行處理。

在Demo中,上下文包含狀態{count: 0}:

  1. createApp({count: 0}).mount() 

在遍歷后<p>{{count}}</p>變為<p>0</p>。

確定雙向綁定的粒度

接下來我們需要確認雙向綁定的作用范圍,即:

觸發更新后,多大范圍的DOM會被重新遍歷并執行相應DOM操作?

打開Performance后,點擊<button>add 1</button>觸發更新:

可以看到,沒有任何walk、walkChildren(或類似遍歷過程),只調用了reactiveEffect一個方法就更新了DOM。

這意味著mount時的深度優先遍歷建立了狀態與更新DOM的方法之間一一對應的關系。

因為對應關系確定了,就不再需要額外的遍歷過程確定需要變化的DOM。

當更新狀態后,只需要找到與他有關系的更新DOM的方法執行就行。

比如:將count狀態與如下函數建立聯系:

  1. function setCount(value) { 
  2.   p.textContent = value; 

每當count變化后調用setCount(count)就能更新p對應DOM。

所以,petite-vue的工作原理,主要包括兩點:

  1. mount時深度優先遍歷DOM,對有狀態的DOM(比如<p>{{count}}</p>)建立狀態與更新DOM的方法之間一一對應的關系
  2. update時找到該狀態對應的更新DOM的方法并執行

可以看到,即使不深入源碼,也能大體了解工作流程。

如果你想更進一步,比如了解「關系是如何建立的」(涉及到「響應式更新」),那么就需要深入源碼了。

這里推薦Vue Mastery的Vue 3 Reactivity課程,可以補齊「響應式更新」這塊知識。

總結

本文介紹了復雜框架源碼的閱讀辦法 —— 即從抽象到具體。

  1. 從mount時與update時的調用棧推導出整體工作流程
  2. 從整體工作流程中發現核心知識 —— 響應式更新

當掌握整體工作流程與響應式更新后,再閱讀自己感興趣的部分才不至于陷入龐大的代碼量中。

你,學廢了么?

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2022-08-24 15:08:19

模型數據技術

2021-12-20 07:58:59

GitHub源碼代碼

2020-08-11 10:25:38

數據成本數據大數據

2023-03-02 08:19:43

不加鎖程序實時性

2018-12-07 11:15:20

設置Windows 10命令

2018-07-31 16:20:12

Windows 10Windows密碼

2017-07-05 18:25:00

2025-10-11 04:11:00

2022-11-15 11:02:21

2010-04-06 10:00:52

CentOS系統

2021-09-22 07:57:23

Vue3 插件Vue應用

2019-09-03 09:55:48

DevOps云計算安全

2020-10-13 09:27:18

電腦Windows軟件

2021-02-19 09:44:00

云計算IT服務IT團隊

2019-09-10 08:00:00

微軟Account網站瀏覽器

2018-06-27 23:10:12

數據中心IT管理運維

2023-04-07 15:01:26

數據中心運營商

2022-09-05 10:01:19

VueReact

2021-11-12 21:15:47

前端技術編程

2024-12-16 08:00:00

C++虛函數表
點贊
收藏

51CTO技術棧公眾號

99re在线观看视频| 久久色免费在线视频| 成熟亚洲日本毛茸茸凸凹| 亚洲综合一区二区精品导航| 日韩精品不卡| 激情六月综合| 亚洲影院高清在线| 国产一区二区在线| 亚洲福利电影网| 国产自偷自偷免费一区| 成人激情综合网站| 精品视频在线观看一区| 国产黄色精品视频| 欧美成人在线网站| 中文字幕国内自拍| 国内精品久久久久影院一蜜桃| 成人欧美视频在线| 18aaaa精品欧美大片h| 欧美片第1页综合| 日韩免费一区二区三区在线播放| 欧美日韩精品免费观看视一区二区| 97精品国产| 国产一区二区在线免费| 怡红院av在线| 国产麻豆91精品| 欧美 另类 交| 国产精品一区二区三区四区| 天天做天天躁天天躁| 成人免费视频app| 丰满爆乳一区二区三区| 久久色视频免费观看| 日韩免费观看高清| 免费一级在线观看播放网址| 婷婷开心激情综合| 中文字幕中文字幕在线中文字幕三区 | 亚洲激情综合网| 在线欧美一级视频| 黑人精品欧美一区二区蜜桃 | 欧美一级艳片视频免费观看| 很黄的网站在线观看| 日韩精品专区在线| yellow字幕网在线| 中文字幕一区二区三区色视频 | 香蕉免费一区二区三区在线观看| 国内精品美女av在线播放| 欧美丝袜激情| 亚洲欧美另类人妖| 亚洲精品大全| 欧美亚洲综合久久| av丝袜在线| 欧美激情xxxxx| 91影院成人| 亚洲午夜精品久久久中文影院av| 99天天综合性| 中文在线三区| 亚洲男人的天堂在线播放| 成人在线视频你懂的| 亚洲自拍偷拍av| a√资源在线| 综合av色偷偷网| 国产一二三四在线视频| 婷婷六月综合亚洲| 筱崎爱全乳无删减在线观看| 久久久人成影片一区二区三区观看| 成人激情免费视频| 一区二区三区视频在线播放| 国产日本欧洲亚洲| а√中文在线8| 久久久久久久国产精品视频| 女厕盗摄一区二区三区| 欧美老少配视频| 激情久久五月| 国产免费又粗又猛又爽| 日韩一级二级三级| 第九色区av在线| 亚洲免费大片在线观看| 搞黄网站在线观看| 欧美专区福利在线| 91成人app| 国产成人精品日本亚洲11| kk眼镜猥琐国模调教系列一区二区 | 欧美日韩hd| 欧美在线一区视频| 欧美日韩综合色| 欧美高潮视频| 日韩电影免费在线观看中文字幕| 麻豆精品99| 中文字幕一区二区三区四区五区人 | 91久久在线播放| 91小视频在线| 女人天堂av在线播放| 国产精品视频xxx| 99久久er热在这里只有精品15| 91caoporn在线| 国产精品午夜国产小视频| 91一区二区三区在线观看| 国产丝袜精品丝袜| 高清视频在线观看一区| 国产精品国产自产拍高清av| av有声小说一区二区三区| 日韩精品欧美激情| 亚洲无中文字幕| 国产嫩草一区二区三区在线观看 | 久久免费资源| 久久久精品国产一区二区| 日韩欧美一区二区三区在线观看 | 日韩理论片中文av| 四虎影视精品永久在线观看| 俺去啦;欧美日韩| 久久精品导航| 男男电影完整版在线观看| 欧美在线欧美在线| 久久在线免费观看| japanese23hdxxxx日韩| 视频一区亚洲| 国产成人av电影在线观看| 137大胆人体在线观看| 国产精品一区二区三区久久久| 久久在线观看免费| 国产精品欧美一区二区三区不卡| 色综合视频一区中文字幕| 国产美女精品人人做人人爽| av免费在线观| 免费久久99精品国产自| 国产乱人伦偷精品视频免下载| 视频免费一区| 91精品婷婷国产综合久久蝌蚪| 亚洲综合在线第一页| 亚洲男人都懂第一日本| 日本888xxxx| 欧美激情a∨在线视频播放| 久久久久久99久久久精品网站| www 久久久| 亚洲这里只有精品| 日本高清视频一区二区| 国产午夜一区| 在线看你懂得| 99re6热在线精品视频播放速度| 精品久久久久久中文字幕一区奶水| 欧美一级淫片| 欧美扣逼视频| 国精产品一区二区| 欧美一区二区高清| 另类小说一区二区三区| 国产精品涩涩涩视频网站| 久久精品亚洲94久久精品| www国产精品av| 波多野结衣在线一区二区 | 一卡二卡三卡亚洲| 91人人爽人人爽人人精88v| 福利视频第一区| 国产一级久久| 永久免费毛片在线播放| 久久黄色片视频| 91爱视频在线| 日韩av一级片| 日韩av超清在线观看| 狠狠爱免费视频| 日本欧美在线视频| 欧美性一二三区| 国产一区二区三区在线观看免费视频 | 另类激情视频| 无码播放一区二区三区| 午夜精品福利电影| 亚洲国产日韩一区二区| 国内精品亚洲| 成年美女黄网站色大片不卡| 37pao成人国产永久免费视频| 668精品在线视频| 欧美性极品xxxx做受| 玖玖精品在线| 91视频免费版污| 国产精品久久久久久超碰| 欧洲一区在线电影| 欧美激情极品| 黄色在线播放| 久久免费精品视频| 精品久久久视频| 蜜臀精品久久久久久蜜臀| 国产美女亚洲精品7777| 国产精品久久久久白浆| 欧美日本韩国一区二区三区| 中文字幕亚洲欧美一区二区三区| 亚洲精品成人在线| 蜜桃视频一区二区三区在线观看| 99亚洲乱人伦aⅴ精品| 高清国产福利在线观看| 日本免费久久高清视频| 欧美日韩在线观看一区二区| 国产+成+人+亚洲欧洲自线| 日韩精品免费一区二区在线观看| 亚洲七七久久综合桃花剧情介绍| 精品久久久久久无码国产| 国产一区二区精品在线| 欧美日本中文字幕| 欧美一区二区女人| 亚洲天堂成人在线观看| 另类小说一区二区三区| 色婷婷亚洲mv天堂mv在影片| 国产69精品久久久久9999人|