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
ytaisei
March 21, 2025
Technology
3
1.9k
Reactを段階的に覗いてみる
React Tokyo ミートアップ #3で使用した資料です。
https://react-tokyo.connpass.com/event/345893/
ytaisei
March 21, 2025
Tweet
Share
More Decks by ytaisei
See All by ytaisei
TanStack Routerを新規プロダクトで1年間運用してみた結果
ytaisei
1
240
Reactのトランジションを覗いてみる
ytaisei
1
2.5k
Deep Dive Into React 〜React Fiber Architectureについて〜
ytaisei
2
440
React19で状態管理はどう変わるか
ytaisei
2
190
TanStackで効率的なルーティングとデータ取得を実現
ytaisei
10
2.5k
TanStack Routerで型安全かつ効率的なルーティングを実現
ytaisei
4
2.4k
BunがCommonJSをサポートする理由
ytaisei
2
450
TanStack Router SPA開発の選択肢になるか(+TanStack Query)
ytaisei
2
1.6k
【2023】SWR vs TanStack Query
ytaisei
1
2.2k
Other Decks in Technology
See All in Technology
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
130
プロポーザルに込める段取り八分
shoheimitani
1
620
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.6k
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
740
22nd ACRi Webinar - NTT Kawahara-san's slide
nao_sumikawa
0
100
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
470
Context Engineeringの取り組み
nutslove
0
380
Agile Leadership Summit Keynote 2026
m_seki
1
670
2026年、サーバーレスの現在地 -「制約と戦う技術」から「当たり前の実行基盤」へ- /serverless2026
slsops
2
260
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
150
コミュニティが変えるキャリアの地平線:コロナ禍新卒入社のエンジニアがAWSコミュニティで見つけた成長の羅針盤
kentosuzuki
0
130
ランサムウェア対策としてのpnpm導入のススメ
ishikawa_satoru
0
220
Featured
See All Featured
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
120
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
160
4 Signs Your Business is Dying
shpigford
187
22k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
66
37k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
170
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Docker and Python
trallard
47
3.7k
Rails Girls Zürich Keynote
gr2m
96
14k
What's in a price? How to price your products and services
michaelherold
247
13k
SEO for Brand Visibility & Recognition
aleyda
0
4.2k
Transcript
Reactを段階的に覗いてみる 安井大晟(ytaisei_)
自己紹介 • 株式会社AI Shift ◦ Webフロントエンド ◦ LLMを活用した新規事業 • 社会人1年目
• AI Agentの開発をしています
第一回React TokyoのLTでも登壇させていただきました!
普段意識しているReact • 状態管理 • コンポーネント設計 • データフェッチ戦略 など
普段意識しているReact • 状態管理 • コンポーネント設計 • データフェッチ戦略 など Reactのコンポーネントが どのようにブラウザにレンダリングしているかを意識する必要はない
Reactを覗いていきましょう
段階を追って理解する 1. React Componentが宣言的にレンダリング される 2. JSXがトランスパイル されReact Elementに変換される 3.
React Nodeを元にFiber Treeが構築され DOMを操作し、ブラウザにレンダリングされる *段階を追って理解をするため、あえて抽象的な表現を使っています
段階を追って理解する 本日のゴールは Reactのソースコードから 実際にDOMの操作をしている箇所に辿り着くことです!
1. React Componentが宣言的にレンダリングされる
React Componentが宣言的にレンダリングされる • JSX構文でDOM構造とスタイリングをする • Stateを用いてリアクティブな画面を設計する • useEffectで副作用を管理する など
React Componentが宣言的にレンダリングされる • JSX構文でDOM構造とスタイリングをする • Stateを用いてリアクティブな画面を設計する • useEffectで副作用を管理する など 命令的に
DOMの操作をする必要がないのは 宣言的UIのメリット
ところで、 JQueryだったりで命令的に Webフロントを開発する 機会は減ったのではないでしょうか
当時の自分の感覚 JSXが直接描画されてる???
実際は複数のフェーズに分かれている
実際は複数のフェーズに分かれている 今回はブラウザのレンダリング処理までは話せません ...
2. JSXがトランスパイルされ React Elementに変換される
JSXがトランスパイルされReact Elementに変換される
JSXがトランスパイルされReact Elementに変換される JSXはJSの構文拡張なのでそのまま実行ができない ビルド時に babelなどでのトランスパイル処理が必要
JSXがトランスパイルされReact Elementに変換される 参考:https://babeljs.io/docs/babel-plugin-transform-react-jsx Classic React17以降
JSXがトランスパイルされReact Elementに変換される React Elementの型定義 React Elementの例
JSXがトランスパイルされReact Elementに変換される React Element React Node
JSXがトランスパイルされReact Elementに変換される React Element React Node ReactNodeはReactElementを内包する Reactがレンダーできるすべての値を表す型
次に発生する疑問 オブジェクトってレンダリングできる???
3. React Nodeを元にFiber Treeが構築され DOMを操作し、ブラウザにレンダリングされる
Reactの基本 - createRoot 1. getElementByIdでtargetのDOMを取得 2. targetのDOMをcreateRootに渡す 3. root.renderにレンダリングしたい React
Nodeを渡す root.renderにレンダリング対象の React Nodeを渡す
root.renderの中では何をしてる ...?
ReactElementを元にFiberTreeが構築されDOMを操作し、ブラウザにレンダリングされる
React Fiberについて
React Fiber Architectureについて https://jser.dev/2023-07-14-initial-mount/#1-brief-introduction-on-fiber-architecture https://github.com/acdlite/react-fiber-architecture?tab=readme-ov-file 「React Fiber Architecture」 Reactは内部でFiber Treeを構築して
差分の更新を最小限に抑えている
React Fiber Architectureについて - Reconciliation • currentはUIに描画される 現在のバージョンのFiberTree / Node
• workInProgressは 新たに構築しているFiberTree / Node これらを比較して差分を検知する
React Fiber Architectureについて - 4つの実行フェーズ 1. Trigger Phase 2. Schedule
Phase a. 実行されるタスクに優先順位を設定 する b. Fiber Architectureの中でも特に重要(今回はスキップ) 3. Render Phase a. スケジュールされたタスクを実行し、 新しいFiber Treeを構築してDOMに変更が必要な対象を整理 4. Commit Phase a. 更新対象をDOMに反映
Render Phase
Performタブで確認する(初回マウントの場合)
Render Phase - renderRootSync RootのFiberNodeから順に FiberTreeを構築する 対象のコード:renderRootSync 1. prepareFreshStackでFiberTree構築 のための準備をする
2. workLoopSyncでworkInProgressがnullになる(末 端のFiberNodeに到達する)まで performUnitOfWorkを実行する
Render Phase - performUnitOfWork 各FiberNodeごとにbeginWorkを実行する
Render Phase - performUnitOfWork FiberNodeごとにbeginWorkを実行する 対象のコード:beginWork
Render Phase - completeWork 対象のコード:completeWork 1. createInstanceで実際の DOMのインスタンスを作成 2. appendAllChildrenでサブツリーのDOM
Nodeを全 てappendしたDOM Nodeを作成 3. それをstateNodeに代入 completeWorkをFiber Treeを逆に戻るように実行
Render Phase - completeWork 対象のコード:completeWork 1. createInstanceで実際のDOMの インスタンスを作成 2. appendAllChildrenでサブツリーのDOM
Nodeを全 てappendしたDOM Nodeを作成 3. それをstateNodeに代入 completeWorkをFiber Treeを逆に戻るように実行
Render Phase - 全体像 Fiber Treeが完成し必要な DOM Nodeが作成され、 DOM操作が必要な FiberNodeに
フラグをつけることができた
Commit Phase
実際は複数のフェーズに分かれている
Commit Phase 1. 再帰的に削除予定の子要素を削除する 2. 実際にDOMの挿入を行う (この実装を見ていきましょう) Fiber Treeを元にDOMの削除と更新を行う 対象のコード:commitMutationEffects
段階を追って理解する 本日のゴールは Reactのソースコードから 実際にDOMの操作をしている箇所に辿り着くことです! https://github.com/facebook/react/blob/4f604941569d2e8947ce1460a0b2997e835f37b9/packag es/react-reconciler/src/ReactFiberCommitWork.js#L2583-L2587 ReactはFlowというAltJSで書かれています
再掲)Render Phase - completeWork 対象のコード:completeWork 1. createInstanceで実際のDOMの インスタンスを作成 2. appendAllChildrenでサブツリーのDOM
Nodeを全 てappendしたDOM Nodeを作成 3. それをstateNodeに代入 completeWorkをFiber Treeを逆に戻るように実行
Commit Phase - DOMの挿入
Commit Phase - DOMの挿入
Commit Phase - DOMの挿入
まとめ • React Componentが宣言的にレンダリング される • JSXがトランスパイル されReact Elementに変換される •
React Nodeを元にFiber Treeが構築され DOMを操作し、ブラウザにレンダリングされる
ご清聴ありがとうございました!