Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
端折りまくって学ぶReactの内部 レンダー・コミット編
Search
calloc134
May 09, 2025
9
2.2k
端折りまくって学ぶReactの内部 レンダー・コミット編
端折りまくって学ぶ React の内部
レンダー・コミット編
@calloc134
2025 5/9 Matsuriba vol.9
calloc134
May 09, 2025
Tweet
Share
More Decks by calloc134
See All by calloc134
Understanding the Internal Structure of React (React Tokyo #6 - @calloc134)
calloc134
0
53
Reactの内部構造を知っておく (React Tokyo #6 - @calloc134)
calloc134
49
15k
バックエンドにおけるSQLへのアプローチ比較(+SafeQLの紹介) matsuriba tech vol.7
calloc134
0
210
IDEA Web班定例会 2024/2/12
calloc134
0
99
かろっく自己紹介
calloc134
2
4k
【クリスマスLTパーティー】大学の授業でCloudflareフル活用なシステム開発をした話
calloc134
0
100
IDEA Web班定例会 LTゆるゆる
calloc134
0
61
Matsuriba_Tech第二回LT.pdf
calloc134
0
61
Web定例会プレゼン(10月上旬の進捗) あるいは callstackが動かなかった話
calloc134
0
41
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
51k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Six Lessons from altMBA
skipperchong
28
4k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
How to train your dragon (web standard)
notwaldorf
96
6.3k
For a Future-Friendly Web
brad_frost
180
9.9k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Transcript
端折りまくって学ぶ React の内部 レンダー・コミット編 @calloc134 2025 5/9 Matsuriba vol.9 1
React のレンダリング トリガーフェーズ レンダリングを発動 スケジューリングフェーズ タスクを適切な タイミングで実行 レンダーフェーズ 仮想 DOM
を作成& 変更の差分検知 コミットフェーズ 実 DOM に書き込み 今回は下 2 つを解説します 2
Fiber ノード いわゆる仮想 DOM と呼ばれる 根本のノードから二種類のツリーが 生える FiberRootNode React アプリケーションの
Root ノード この FiberRootNode から 二つのツリーが生える 3
Fiber ノード ( 続き) current 現在のツリー workInProgress 現在レンダリング中の 新しいツリー この
2 つのツリー間で 差分検知を行う 4
なぜ 2 つ存在するの? そもそも差分検知に必須 ダブルバッファリングの考え方 更新をパッと終わらせ レンダリング中に UI が壊れることを防ぐ 旧版のツリーを保持することで
リソースの リサイクルが可能 メモリ割り当ての コスト削減 5
レンダーフェーズ Fiber ノード詳細 今回解説する主要な Fiber ノードの種類は以下の 2 つ FunctionComponent みなさんが普段書いている関数コンポーネント
HostComponent DOM ノード web であれば <div> <span> <p> といった HTML タグ 6
Fiber ノードが持つ参照 child: 子ノード sibling: 兄弟ノード return: 親ノード これを利用することで 簡単にノードを巡回できる
7
Fiber ノードのプロパティ type/tag: ノードの種類 flags: ノードのフラグ 行うべき変更などが保持される stateNode: ノードの状態 生成された
DOM インスタンスなど 関数コンポーネントの場合は 実体がないため null その他… 8
レンダー開始 performUnitOfWork 関数から始まる レンダーの最初は コンポーネントの種類(tag) によって 動作が変わる 関数コンポーネントの実行 A レンダリングが必要なので実行する
必要がある フックを使いながら 関数コンポーネント実行 戻り値の ReactNode は後で利用 9
差分検出 B beginWork 内部の reconcile... 関連の関数で実行される 対象となる要素について 先程生成した ReactNode と
current の Fiber で 差分検出 ( リコンサイル) を行う 同じタイプの要素は再利用 key があれば key で一致をとり差分比較 key がなければインデックスで一致をとり差分比較 … など 10
差分検出 B ( 続き) その結果に応じて flags にフラグを設定 Placement: 新しいノードを追加する Update:
既存のノードを更新する Deletion: 既存のノードを削除する など… このフラグは二進数で作られており 合成することが可能 11
後処理 C completeWork 内部で後処理を行う 先程のフラグを元に 親ノードに 対してフラグを合成 最終的に root ノードには
すべてのフラグが合成される 更に HostComponent であれば DOM ノードを生成して stateNode に保持 ※ 関数コンポーネントの場合は DOM ノードは生成されないことに注意 などを行う 12
巡回のアルゴリズム この処理の繰り返しが行われる 巡回の順番は以下の通り 1. まず対象ノードに対して A ・B を実行 2. 子供がいるか調査
子供がいれば対象ノードを子供に変更して →1 子供いなければ 下へ 3. C を実行 4. 兄弟がいるか調査 兄弟がいれば対象ノードを兄弟に変更して →1 兄弟がいなければ 下へ 13
巡回のアルゴリズム ( 続き) 5. 親がいるか調査 親がいなければ レンダリングそのものの 終了フラグを立て処理を終了 親がいれば下へ 6.
親ノードに戻り →3 で C 実行・兄弟調査 繰り返す A ・B の処理と C の処理は それぞれのノードでかならず 1 回ずつ行われる仕組み 14
コミットフェーズ フラグや stateNode を元に実際の DOM ノードに変更を加える ( 詳細は省略) すべて適用処理が終わったとき current
と workInProgress の 二つのツリーを交換 作業中だったツリーが current に昇格する 15
コミットフェーズ ( 続き) WIP はここで破棄せず 今後のレンダリングでリソースは 適宜再利用され有効活用される リソース作成の手間が省けてエコ 16
まとめ Fiber の仕組み レンダーの流れ 関数コンポーネント実行 差分検出 後処理 巡回のアルゴリズム コミットフェーズ お疲れ様でした!
17
今回端折ったところ スケジューリングフェーズ全体 中断可能なレンダリング 初回レンダリングと更新レンダリングの違い ステートの実装 フックの実装 サイドエフェクトの動作 もし需要があれば Zenn にまとめるかも?
18