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
Recoil脱却の現状と挑戦
Search
kirik
July 23, 2025
Technology
2
250
Recoil脱却の現状と挑戦
2025年7月24日の発表資料
https://offers-jp.connpass.com/event/360216/
kirik
July 23, 2025
Tweet
Share
More Decks by kirik
See All by kirik
Tiptapで実現する堅牢で柔軟なエディター開発
kirik
1
88
Recoilを剥がしている話
kirik
5
10k
Other Decks in Technology
See All in Technology
激動の時代、新卒エンジニアはAIツールにどう向き合うか。 [LayerX Bet AI Day Countdown LT Day1 ツールの選択]
tak848
0
530
Railsの限界を超えろ!「家族アルバム みてね」の画像・動画の大規模アップロードを支えるアーキテクチャの変遷
ojima_h
3
370
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
5.8k
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.7k
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
190
メモ整理が苦手な者による頑張らないObsidian活用術
optim
0
110
AI時代にも変わらぬ価値を発揮したい: インフラ・クラウドを切り口にユーザー価値と非機能要件に向き合ってエンジニアとしての地力を培う
netmarkjp
0
220
地図と生成AI
nakasho
0
670
M365アカウント侵害時の初動対応
lhazy
5
4.4k
Talk to Someone At Delta Airlines™️ USA Contact Numbers
travelcarecenter
0
170
Ktor + Google Cloud Tasks/PubSub におけるOTel Messaging計装の実践
sansantech
PRO
1
230
データエンジニアリング 4年前と変わったこと、 4年前と変わらないこと
tanakarian
2
340
Featured
See All Featured
Producing Creativity
orderedlist
PRO
346
40k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
A designer walks into a library…
pauljervisheath
207
24k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
GraphQLとの向き合い方2022年版
quramy
49
14k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Faster Mobile Websites
deanohume
308
31k
Embracing the Ebb and Flow
colly
86
4.8k
Documentation Writing (for coders)
carmenintech
72
4.9k
Building Applications with DynamoDB
mza
95
6.5k
Transcript
Recoil脱却の現状と挑戦 2025/7/24 株式会社PR TIMES 桐澤 康平 (@kiririLee)
桐澤 康平 (@kiririLee) 株式会社PR TIMES 第二開発部 フロントエンドエンジニア 自己紹介 プレスリリース入稿画面のリニューアル、 メディアユーザー向けページのReactリプレイス
などに従事
行動者発の情報が、人の心を揺さぶる時代へ ・主力事業にプレスリリース配信サービス「PR TIMES」 ・「Jooto」、「Tayori」など行動者の支援を軸に多角的な 事業を展開 タスク・プロジェクト管理ツール 「Jooto」 カスタマーサポートツール 「Tayori」 会社紹介
・ Recoil剥がしの進捗と現状 ・ 新規プロジェクトでの状態管理 ・ 今後の運用 今日話すこと
Recoil剥がしの進捗と現状
2024年12月の発表内容 https://speakerdeck.com/kirik/recoilwobo-gasiteiruhua
2024年12月の発表内容 ・ React19バージョンアップに向けてRecoilを剥がしている ・ 移行先は useState, Context ・ Recoilの依存範囲の大きさを3つに分けてそれぞれ移行
影響範囲別に3つに分けて進行中 ・影響範囲小: Recoilに依存しているファイル数が10ファイル以下のプロジェクト ・影響範囲中: 20ファイル以下のプロジェクト ・影響範囲大: 依存が特に広い50 〜 100ファイル以上のプロジェクト 進行方法
・影響範囲小 9つのプロジェクトの内7プロジェクト完了 ・影響範囲中 3つのプロジェクトの内、現状どれもまだ手付かず ・影響範囲大 4つのプロジェクトの内、2つのプロジェクトで派生状態に つらみを覚えながら進行中。 2024年12月時点の進捗
・影響範囲小 完了! ・影響範囲中 完了! ・影響範囲大 4つのプロジェクトの内、残り1つ、、、! 2025年7月時点の進捗
標準APIのみで置き換えられているのか?
結論だけ言うとNo 影響範囲小: useState, Contextのみで移行完了 影響範囲中: useState, Context, TanStack Queryで完了
影響範囲大: 4つのプロジェクトの内、3つが以下の技術で完了、、、! useState, Context, TanStack Query, Jotai で完了
標準APIのみを使う理想は捨てたのか? No 理想は変わらないが置き換えにおいてプロジェクトごとの コンポーネント設計が大きく影響する 主目的は設計の変更ではなくRecoilからの脱却 移行コストを減らすために他ライブラリを採用 新規プロジェクトでは標準APIのみを使う方針
標準APIでの移行が困難なプロジェクト
エディタープロジェクト プレスリリースの本文に加え、配信先やタグ、キーワードなど 配信設定を編集できる
各Stateが複雑に絡み合っ ており移行が困難 主要機能の大部分の情報が これらStateに載っている 本文・タイトル・タグ・キーワード・ メールタイトル・画像・メディア向 け情報・配信時刻などなど... https://developers.prtimes.jp/2025/07/18/compan y-page-recoil-migration/#index_id1 グラフの生成方法についてはブログをご覧ください
さらに、移行を困難にしている要因 ・ 更新ロジックがコンポーネントに露出 ・ 任意の場所から任意の状態に対して更新可能 どこから何を更新しているのかコードから読み取りにくく、 Stateの用途が明確ではなくなっている この状況が変更を加えにくくしている
グラフが巨大になっている要因 APIで取得する データに主要機能で 扱うデータの大部分が 紐付いている Selector, atomFamilyなどで 分配 バックエンドに保存する 際はSelectorで集約
主要機能の分配と集約の様子
useState と Context への移行 複雑に絡み合っている状態を標準APIで表現しようとすると 大幅なコンポーネント設計の見直しが必要... 工数的に修正を小さくしてQA範囲を狭めたリリースを 繰り返したいため、機能ごとに移行する方法を検討 しかし、仕様を保ったまま移行することが困難、 機能が多いためリリース回数も膨れ上がる
段階的な移行が難しく断念
エディターのRecoil脱却においてJotaiを採用 ・ Recoilと同じatomベースでAPIが似ており より少ない工数で移行できそう ・ 他プロジェクトでJotaiにより工数を削減して 移行が完了した実績がある ・ 移行作業は進行中 エディターではReduxやZustandのような中央集権的なStoreベー
スの状態管理がマッチしそう (移行予定はないです) エディターの性質から振り返り
他プロジェクトでJotaiへの移行事例があるため 詳しくは以下のブログをご覧ください! https://developers.prtimes.jp/2025/07/18/company-page-recoil-migration/
新規プロジェクトでは標準APIのみで 開発できているか?
Yes ✅ 前提として、 ・ 非同期処理は TanStack Query ・ 基本的に useState
のみを使用 ・ 一部 Context により useState を配布
メディアリスト機能の事例 https://prtimes.jp/main/html/rd/p/000001477.000000112.html
1万800件超の配信先リストから最大300のメディアを 選択して配信リストを作る機能
・ 標準APIのみを使う方針にしてから作成されたプロジェクト ・ 作成したリストの絞り込みや一時保存などで バックエンドとの同期が必要 ・ 数千件のリスト(配列)を扱う必要がある
バックエンドとの同期 上位コンポーネントで検索条件を管理しつつ愚直にpropsで 状態を配布 レイアウト useStateで 検索条件を管理 レイアウトレベル ナビゲーションの検索 検索結果の表示 検索処理
検索条件を変更 TanStack Queryで データ取得 queryKeyによる 検索条件に応じたデータ反映 https://developers.prtimes.jp/2025/07/08/renewal-auto-media-list/#index_id5 ローディング画面の表示 選択中のリスト表示
Render Props パターンによる階層を浅くする工夫
TanStack Virtual によるリストのパフォーマンス改善 現状、数千件のリストを扱う必要があり、動作が重くなる 事象が確認されていた 仕様として扱う件数に上限を定めていないため今後増える 可能性が高い 改善の必要性 TanStack Virtual
巨大なリストを仮想化するヘッドレスUIユーティリティ https://developers.prtimes.jp/2024/12/11/improving-performance-with-tanstack-virtual/
TanStack Virtual によるリストのパフォーマンス改善 パフォーマンス問題は他ライブラリへ委託 とはいえ今回のリストの問題はJotaiやZsutandでも同じことが言える ポイント パフォーマンスに限らず、非同期処理やブラウザAPIとの同期など ライブラリの責務を分担する もちろん同一のライブラリで複数の責務を統合した方が良い場合もある
メディアリストの状態管理で使っているツール リストデータの取得は TanStack Query リストの描画は TanStack Virtual ドロワーの開閉、フィルタリング、リストの選択状態など 要所要所の状態は useState
確認モーダルやトーストなど広い範囲で利用される コンポーネントは useState を Context で配布
今後やっていきたい運用
Recoil脱却と理想を踏まえて ・ 新規プロジェクトでの基本方針 ・ ライブラリ導入時の方針 2つの観点でドキュメントの整備
新規プロジェクトでの基本方針 前提として標準APIのみで開発を行うことの明示 長期的な開発のために基本的には標準APIを使うことを前提とし 安易なライブラリ導入を防ぐ 標準APIによる状態管理のプラクティスの共有 可能な限り標準APIで実装をしていく際のTipsをまとめる
ライブラリ導入時の方針 ライブラリの責務を明確にする なぜライブラリを導入するのか?ライブラリで何を解決したいのか? 変更容易性を保つ どのように導入するのか? 状態の設計をする、ラップする層を作ってテストを書く、 利用するメソッドの制限による責務の制限など Design Doc や
ADR に以下の観点を含める