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.7k
端折りまくって学ぶ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.2k
【クリスマスLTパーティー】大学の授業でCloudflareフル活用なシステム開発をした話
calloc134
0
84
IDEA Web班定例会 LTゆるゆる
calloc134
0
47
Matsuriba_Tech第二回LT.pdf
calloc134
0
42
Web定例会プレゼン(10月上旬の進捗) あるいは callstackが動かなかった話
calloc134
0
34
Web定例会 8月~9月上旬
calloc134
0
54
【Web開発】モノリポボイラープレートを趣味でゴリゴリ作成した話
calloc134
2
570
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.7k
A better future with KSS
kneath
239
17k
It's Worth the Effort
3n
184
28k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
How STYLIGHT went responsive
nonsquared
100
5.5k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
What's in a price? How to price your products and services
michaelherold
245
12k
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