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
ステート管理を超えるRecoil運用の考え方
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
uhyo
January 20, 2023
Technology
14k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ステート管理を超えるRecoil運用の考え方
Harajuku.ts Meetup 〜 Recoilの事例集めました〜
uhyo
January 20, 2023
More Decks by uhyo
See All by uhyo
Reactの設計論
uhyo
15
8.4k
型があると何が嬉しいか
uhyo
3
110
Baseline対応のDOMの型定義を作った
uhyo
3
920
AIのReact習熟度を測る
uhyo
2
990
React、まだ楽しくて草
uhyo
7
5k
TypeScript 7.0の現在地と備え方
uhyo
6
3.8k
React 19時代のコンポーネント設計ベストプラクティス
uhyo
20
11k
型定義でAIと会話する:型を通じてAIに意図を伝えるテクニック
uhyo
1
110
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
3
1.2k
Other Decks in Technology
See All in Technology
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.5k
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
100
あるけみー式LTスライド作成術
alchemy1115
1
200
10分で知る最近のOmarchy
komagata
0
270
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.7k
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
270
Multica × 長期記憶:40個のミニプロジェクト管理
eiei114
1
260
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
110
omasushiというライブラリを作った
polidog
PRO
0
210
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
0
160
Adaptive Warehouse を今すぐ導入すべき理由と迷ったときの判断基準
__allllllllez__
0
200
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
1
240
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Discover your Explorer Soul
emna__ayadi
2
1.3k
The agentic SEO stack - context over prompts
schlessera
0
920
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
490
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Building the Perfect Custom Keyboard
takai
2
870
Transcript
None
イベント趣旨 Recoilがリリースされてから2年半が経った。 これだけ経てば使っている人も結構多いはず。 しかし、そのわりに具体的な「事例」が世に出ていない気がする。 今回は、Recoilを使いこなしている皆さんにお越しいただいて、 事例を語ってもらうことにした。
イベント趣旨 Twitterで何となくRecoil勉強会したいな~と言ったところ、 話したい人・聞きたい人がいたため開催に繋げることができた。 ありがとうございます こんな勉強会をしてほしい等のアイデアも募集中!
事前アンケート結果 参加者の皆さんにアンケートに答えていただきました。 Recoil使われていますか? 使って みたい 194 使って いる 160 使う予定はない
19
事前アンケート結果 参加者の皆さんにアンケートに答えていただきました。 RecoilとJotaiのどちらがお好きですか? Recoil 142 わから ない 202 Jotai 29
事前アンケート結果 参加者の皆さんにアンケートに答えていただきました。 RecoilとJotaiのどちらがお好きですか? Recoil 142 わから ない 202 Jotai 29
Recoilが優勢だが、浮動票が多くJotaiも 巻き返しのチャンス。 ※本イベントはRecoilをテーマにしていますが、 Jotaiもかなり似たライブラリですので、 Jotai派の方は脳内変換しながらお聞きください。
ステート管理を超える Recoil運用の考え方 Harajuku.ts Meetup ~Recoilの事例集めました~ uhyo (株式会社バベル プリンシパルエンジニア)
登壇者紹介 uhyo 2022年10月から株式会社バベル勤務。 最近サーバーサイドを見ていることも 多いが、心はフロントエンドエンジニア。 TypeScript入門書 好評発売中!→
商談解析クラウド では、フロントエンドに ReactとともにRecoilを使用。 移行が終わっていないため他の状態管理手法と混ざっているが、 Recoilに寄せていく狙いがある。 Why? How? をお話しします aileadとRecoil
このトークの要約 • 実はFluxって天才だったのでは? • Recoilくんとならやり直せる気がする
事の発端 公式サイトによれば、Reactは “A JavaScript library for building user interfaces” である。
https://reactjs.org/ より引用
事の発端 公式サイトによれば、Reactは “A JavaScript library for building user interfaces” である。
ということは、UIを構築する以外の仕事をさせないほうが筋が いいのでは? UI以外のことはReactから切り離したい。
UI以外のことの例 • 外部からのデータの読み込み • アプリケーションの状態の保持 • ビジネスロジックの計算
理想的と思われるアーキテクチャ React層 コア層 • 状態の保持 • 状態遷移の定義 • DOMへの最適化された レンダリング
整形層 • 外部からの データの読み込み • UI用にデータを整形 UIへの入力
どこかで見たような…… React層 コア層 整形層 https://facebook.github.io/flux/docs/in-depth- overview/ から引用
Fluxとどこが違うのか? Fluxだと「Store」となっているところ が、コア層と整形層に分離した。 単純なFluxだと成果物が「でかい状態 の塊」になってしまうのでつらい。 そもそも、コアな状態は少なければ 少ないほどいい。 (useMemoで済むのにuseStateを使うべきではない のと同様) あと、アクションの概念は要らない。
React層 コア層 整形層
Recoil運用のアイデア ここをRecoilにやってもらうのが 良いのでは? React層 コア層 整形層
Recoilの良いところ atom(自身で状態を保持する)とselector(ほかの状態を見て計算する) があり、コアな状態(atom)がどれなのかを設計上明らかに しやすい。 非同期ネイティブであり、非同期処理もselectorとして扱える。 (データ読み込みの結果や進捗などはコアな状態として扱う必要がない) 思想がReactと近い。「ロジック用のReact」のような使い心地。 • イミュータブル・冪等性が前提のAPI •
計算結果の一貫性保証
atomとselectorの使い分け 他に従属しない状態がatom。それ以外は何が何でもselectorに する。 例: 検索画面 • 検索条件: atom (ユーザーが独立に変更できるため) •
ページ数: atom (ユーザーが独立に変更できるため) • 検索結果: selector (上2つ(+サーバーの状態)から計算できるため) ※ページングがカーソルベースだった場合はすこし迷うが、サーバーから可能な 選択肢を取得してそのなかから選んだと考えてカーソルをatomに保存するか
Recoil層とReact層のつなぎ込み React層 コア層 整形層 出力用フック 入力用フック Recoil層とReact層の境界は当然 フック。 出力用フックは無くてもいいという 説もあるが、useMemoやuseEffect
が必要になったときのエスケープ ハッチとしては有用か。
具体例 React層 検索 条件 ページ 数 検索 結果 useSearchResult useSearchQuery
usePagination atomから始まるデータの流れが RecoilのAPIを用いて定義される。 (データフローグラフ)
具体例 React層 検索 条件 ページ 数 検索 結果 useSearchResult useSearchQuery
usePagination React層からの入力は基本的にコア 状態の変更として作用するので、 入力用フックを介してコア状態を 更新する。 グローバルなアクションといった 概念は存在せず、ユースケースに 応じた個別の入力用フックがある。 入力用フックもコア層の一部と して扱うのが筋良さそう
具体例 React層 検索 条件 ページ 数 検索 結果 useSearchResult useSearchQuery
usePagination Reactコンポーネントツリーの 上から下にデータが流れる様子に 似ているが、 Recoilを使う場合はReactに入る前 に計算が終わっているという 点が異なる。
Reactにロジックを乗せると良くない点 ReactにUI以外のことを無理にやらせると、アプリケーションの 整合性を保つのが困難になる。 例: Reactでやる場合 const [検索条件] = useState(); useEffect(()
=> { 検索結果取得(); }, [検索条件]); 検索条件変更 ↓ レンダリング ↓ useEffect発火 ↓ 検索結果取得開始 ↓ …
Reactにロジックを乗せると良くない点 ReactにUI以外のことを無理にやらせると、アプリケーションの 整合性を保つのが困難になる。 例: Reactでやる場合 const [検索条件] = useState(); useEffect(()
=> { 検索結果取得(); }, [検索条件]); 検索条件変更 ↓ レンダリング ↓ useEffect発火 ↓ 検索結果取得開始 ↓ … 検索条件が変わったのに 検索結果が前のままと いう中途半端な状態が レンダリングされて しまっている
Reactにロジックを乗せると良くない点 ReactにUI以外のことを無理にやらせると、アプリケーションの 整合性を保つのが困難になる。 例: Recoilでやる場合 検索条件変更 ↓ 検索結果取得開始 ↓ レンダリング
Recoil内部で整合性の とれた状態を計算し 終わってからReactに ステートが伝達される 検索 条件 ペー ジ数 検索 結果
ReactとRecoilの整合性保証 Reactの整合性保証 レンダリングの際は、 ある瞬間の状態がコンポーネント ツリー全体に反映される。 古い状態と新しい状態が 画面上で混在することはない。 状態→画面の整合性 Recoilの整合性保証 グラフの状態計算の際は、
ある瞬間の状態がグラフ全体に 反映される。 古い状態と新しい状態が React上で混在することはない。 グラフ→状態の整合性
ReactとRecoilの整合性保証 ここの整合性をRecoilが担当 ここの整合性はReactが担当 React層 コア層 整形層
Recoilを活用するデータフロー設計 Recoilの魅力は、atomやselectorをはじめとする シンプル・ローレベルなAPIから構成されているところ。 これらを組み合わせることで独自の機能を持ったノードを作ること ができる。 さらに、Reactよりも無理がきかない(エスケープハッチが無い)。 望ましい設計を保ちやすい。
Recoilを活用するデータフロー設計 例: 検索 条件 Graph QL GraphQLリクエストを行う selector 検索 条件
ページ 数 他の状態が変化したら リセットされるatom
まとめ Recoilをロジックに用いる設計を試している。 改めて見てみると、Fluxの良いところを受け継ぎつつ良くない ところを直したような構成になっている。 ReactはそろそろUIライブラリに専念させてあげたい。 文章で読みたい方はこちらもどうぞ(宣伝): Recoilにロジックを載せる運用戦略 https://zenn.dev/babel/articles/recoil-for-babel