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
2.1k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Reactを段階的に覗いてみる
React Tokyo ミートアップ #3で使用した資料です。
https://react-tokyo.connpass.com/event/345893/
ytaisei
March 21, 2025
More Decks by ytaisei
See All by ytaisei
TanStack Routerを新規プロダクトで1年間運用してみた結果
ytaisei
1
470
Reactのトランジションを覗いてみる
ytaisei
1
2.7k
Deep Dive Into React 〜React Fiber Architectureについて〜
ytaisei
2
560
React19で状態管理はどう変わるか
ytaisei
2
240
TanStackで効率的なルーティングとデータ取得を実現
ytaisei
10
2.6k
TanStack Routerで型安全かつ効率的なルーティングを実現
ytaisei
4
2.5k
BunがCommonJSをサポートする理由
ytaisei
2
510
TanStack Router SPA開発の選択肢になるか(+TanStack Query)
ytaisei
2
1.8k
【2023】SWR vs TanStack Query
ytaisei
1
2.3k
Other Decks in Technology
See All in Technology
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
240
MulticaとPi Coding Agentで、小規模OSSを30本同時運用した流れ
eiei114
0
110
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
260
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
330
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
290
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
200
ハーレムエンジニアリング
kazuma777777
0
150
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
570
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
300
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
モダンフロントエンド 開発研修
recruitengineers
PRO
4
640
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
A designer walks into a library…
pauljervisheath
211
24k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
540
Making the Leap to Tech Lead
cromwellryan
135
10k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
940
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
WCS-LA-2024
lcolladotor
0
790
New Earth Scene 8
popppiees
3
2.5k
We Are The Robots
honzajavorek
0
300
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
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を操作し、ブラウザにレンダリングされる
ご清聴ありがとうございました!