不要為了看程式碼而看程式碼
前置了解 → 本文分享內容🥹
clone → local build
https://github.com/facebook/react
React 中有個方便測試的檔案 dev.htm 可以快速查看我們在 local 端的變動
The easiest way to try your changes is to run yarn build core,dom –type=UMD and then open fixtures/packaging/babel-standalone/dev.html. This file already uses React.development.js from the build folder so it will pick up your changes.
Development Workflow - React official website
了解目錄結構
善用 debugger & 全局搜索
關注專案 & 核心開發者
🚧 架構概覽圖
User Interaction
使用者點擊按鈕觸發點擊事件。
Event Handling
React DOM 捕獲並處理點擊事件,呼叫 handleClick
函式。
React Reconciler
handleClick
使用 setCount
更新狀態,啟動 react-reconciler
。
Scheduler ➡️ 更新過程的起點
scheduler
安排一個更新任務。
Re-render
react-reconciler
比較虛擬 DOM,生成新的 Virtual DOM。 → Diff
React DOM
react-dom
使用新的虛擬 DOM 操作實際 DOM。
Browser Rendering
瀏覽器接收到對 DOM 的變更,執行重新排版(Reflow)和重繪(Repaint)。
為 React v16 之後新增的機制(React fiber)
安排一個更新的任務,確保 React 的整體性能和用戶體驗。
Reconciler
執行(藉由 Reconciler
提供的 callback function
)
⬆️ 是獨立於 react 的 experimental package
Appendix
Scheduler 的概念其實已經有部分瀏覽器實踐出來了 → requestIdleCallback
但基於以下考量 React 團隊放棄使用 選擇自己創建🧐
負責處理與協調 Virtual DOM 與 Real DOM 的同步。
⬆️ 也是獨立於 react 的 experimental package
Diff
算法)
fiber樹
最終 React-Reconciler 會將 Virtual DOM 變動的部分做上記號(如下)交給 Renderer(react-dom 接口) 🙌
根據 Reconciler 為 Virtual DOM打的標記,同步執行對應的 DOM 操作。
除了 div 之外,react-component 也是 type 的一種。
config
handle ref
and key
handle __self
and __source
covert by babel
使用 Babel 或其他 JSX 轉譯器來轉換 JSX 語法為 JavaScript 時,這些轉換器有時會在轉換過程中添加額外的屬性到 React 元素上,以提供開發者更多的調試和錯誤追蹤的資訊。
__self:用於追蹤 React 元素被建立時的 this
指向
__source:包含元素在原始程式碼中的位置信息
JSX → JS code(by Babel)
children
return reactElement
Reconciler
執行