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
8
1.9k
端折りまくって学ぶReactの内部 レンダー・コミット編
端折りまくって学ぶ React の内部
レンダー・コミット編
@calloc134
2025 5/9 Matsuriba vol.9
calloc134
May 09, 2025
Tweet
Share
More Decks by calloc134
See All by calloc134
バックエンドにおけるSQLへのアプローチ比較(+SafeQLの紹介) matsuriba tech vol.7
calloc134
0
150
IDEA Web班定例会 2024/2/12
calloc134
0
72
かろっく自己紹介
calloc134
2
3.3k
【クリスマスLTパーティー】大学の授業でCloudflareフル活用なシステム開発をした話
calloc134
0
84
IDEA Web班定例会 LTゆるゆる
calloc134
0
47
Matsuriba_Tech第二回LT.pdf
calloc134
0
42
Web定例会プレゼン(10月上旬の進捗) あるいは callstackが動かなかった話
calloc134
0
35
Web定例会 8月~9月上旬
calloc134
0
56
【Web開発】モノリポボイラープレートを趣味でゴリゴリ作成した話
calloc134
2
580
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
245
12k
Become a Pro
speakerdeck
PRO
28
5.4k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
YesSQL, Process and Tooling at Scale
rocio
172
14k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Being A Developer After 40
akosma
91
590k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
Producing Creativity
orderedlist
PRO
346
40k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
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