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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
ytaisei
March 21, 2025
Technology
2k
3
Share
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
280
Reactのトランジションを覗いてみる
ytaisei
1
2.6k
Deep Dive Into React 〜React Fiber Architectureについて〜
ytaisei
2
500
React19で状態管理はどう変わるか
ytaisei
2
210
TanStackで効率的なルーティングとデータ取得を実現
ytaisei
10
2.5k
TanStack Routerで型安全かつ効率的なルーティングを実現
ytaisei
4
2.5k
BunがCommonJSをサポートする理由
ytaisei
2
470
TanStack Router SPA開発の選択肢になるか(+TanStack Query)
ytaisei
2
1.7k
【2023】SWR vs TanStack Query
ytaisei
1
2.2k
Other Decks in Technology
See All in Technology
QGISプラグイン CMChangeDetector
naokimuroki
1
410
Route 53 Global Resolver で高額課金発生!
otanikohei2023
0
110
AI時代 に増える データ活用先
takahal
0
240
昔はシンプルだった_AmazonS3
kawaji_scratch
0
340
20260423_執筆の工夫と裏側 技術書の企画から刊行まで / From the planning to the publication of technical book
nash_efp
3
410
みんなの「データ活用」を支えるストレージ担当から持ち込むAWS活用/コミュニティー設計TIPS 10選~「作れる」より、「続けられる」設計へ~
yoshiki0705
0
250
社内エンジニア勉強会の醍醐味と苦しみ/tamadev
nishiuma
0
220
Hacobu Tech Deck
hacobu
PRO
0
110
基盤を育てる 外部SaaS連携の運用
gamonges_dresscode
1
120
プラットフォームエンジニアリングの実践 - AWS コンテナサービスで構築する社内プラットフォーム / AWS Containers Platform Meetup #1
literalice
1
200
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
10
78k
ネットワーク運用を楽にするAWS DevOps Agent活用法!! / 20260421 Masaki Okuda
shift_evolve
PRO
2
210
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
370
First, design no harm
axbom
PRO
2
1.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Exploring anti-patterns in Rails
aemeredith
3
320
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
The Invisible Side of Design
smashingmag
303
52k
Building Adaptive Systems
keathley
44
3k
Ruling the World: When Life Gets Gamed
codingconduct
0
210
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
530
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.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を操作し、ブラウザにレンダリングされる
ご清聴ありがとうございました!