Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
端折りまくって学ぶReactの内部 レンダー・コミット編
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
calloc134
May 09, 2025
2.4k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
端折りまくって学ぶReactの内部 レンダー・コミット編
端折りまくって学ぶ React の内部
レンダー・コミット編
@calloc134
2025 5/9 Matsuriba vol.9
calloc134
May 09, 2025
More Decks by calloc134
See All by calloc134
認証認可を通して学ぶ、『わからない』のつぶし方 - ID沼入口 発表資料
calloc134
11
4.8k
令和最新技術で伝統掲示板を再構築: HonoX で作る型安全なスレッドフロート型掲示板 / かろっく@calloc134 - Hono Conference 2025
calloc134
0
740
Understanding the Internal Structure of React (React Tokyo #6 - @calloc134)
calloc134
1
180
Reactの内部構造を知っておく (React Tokyo #6 - @calloc134)
calloc134
51
16k
バックエンドにおけるSQLへのアプローチ比較(+SafeQLの紹介) matsuriba tech vol.7
calloc134
0
350
IDEA Web班定例会 2024/2/12
calloc134
0
150
かろっく自己紹介
calloc134
3
5.9k
【クリスマスLTパーティー】大学の授業でCloudflareフル活用なシステム開発をした話
calloc134
0
170
IDEA Web班定例会 LTゆるゆる
calloc134
0
110
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Navigating Team Friction
lara
192
16k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
The SEO Collaboration Effect
kristinabergwall1
1
570
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
520
Typedesign – Prime Four
hannesfritz
42
3.2k
Code Review Best Practice
trishagee
74
20k
It's Worth the Effort
3n
188
29k
Exploring anti-patterns in Rails
aemeredith
4
510
Tell your own story through comics
letsgokoyo
1
1.1k
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