Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンドの状態管理とMiiTelにおける事例の紹介

Avatar for RevComm_inc RevComm_inc
July 23, 2025
940

 フロントエンドの状態管理とMiiTelにおける事例の紹介

「Jotai? Zustand? そもそも不要? 3社の運用事例から学ぶ 状態管理設計のイマ」イベントに関する発表資料です (https://offers-jp.connpass.com/event/360216/)

MiiTel PhoneにおけるRecoilからJotaiへの移行やその他のMiiTelにおけるプロダクトの事例などを元に、フロントエンドの状態管理や技術選定などについて紹介します。

Avatar for RevComm_inc

RevComm_inc

July 23, 2025

More Decks by RevComm_inc

Transcript

  1. 自己紹介 - Tanaka Yuki - 株式会社RevComm - MiiTel Phone の開発

    - DevRel (社内TechTalkやTechBlogの運 営) - 趣味でdeno-weeklyというサイトを運営して います🦕 Copyright © RevComm Inc.
  2. 2. グローバル状態の管理について グローバル状態の管理手法に関する分類 ※ 1. Context API 2. ストア (Redux,

    Zustand, Mobx, など) 3. Atomic State Management (Recoil, Jotai) 4. Server State Management (TanStack Query, SWR, Apollo, RTK Query, など) ※ これはおおさっぱな分類のため、あくまで参考程度にとどめていただければと思います Copyright © RevComm Inc.
  3. 2. グローバル状態の管理について 1. Context API - - - メリット -

    React標準のAPIである (追加のライブラリの導入・管理が不要) - 手軽である デメリット - 意図せぬパフォーマンス低下が起きうる(extra re-render issue) - 手軽に利用しやすい分、乱用してしまうリスクはありそうです どこで採用すべき? - 更新頻度が低い状態や読み込み専用の状態の共有、コンポーネントへ依存注入し たいケースなどで利用するのが良いと思います Copyright © RevComm Inc.
  4. 2. グローバル状態の管理について 2. ストア - メリット - 堅牢 (状態がストア内にカプセル化されるため意図せぬ不整合を防止しやすい、 ReduxにおけるReducerは純粋関数であるため容易に独立してユニットテストが可

    能) - デメリット - - Server State (後述) / Client Stateのどちらも管理が可能で、汎用性は高め 記述などは冗長にはなりがち どこで採用すべき? - 複雑な状態遷移のモデリングが必要なケースなど Copyright © RevComm Inc.
  5. 2. グローバル状態の管理について 3. Atomic State Management - メリット - 手軽・シンプル・柔軟で、汎用性も高い

    - レンダリングの最適化を提供 (atomの更新時に、それに依存したコンポーネントの みを再レンダリング) - デメリット - - 手軽で柔軟、かつ汎用性も高いため、必要以上の乱用には注意が必要そうです どこで採用すべき? - ストアを採用するのはToo muchであり、Context APIの使用が適さないケース、な ど Copyright © RevComm Inc.
  6. 2. グローバル状態の管理について 4. Server State Management - - メリット -

    Server Stateの管理に伴う複雑さを軽減してくれる - 目的がはっきりしていて使い方や使うべき場面を間違えにくい デメリット - ストアやAtomic State Managementなどの汎用的手法と異なり、汎用的ではありま せん (用途に応じてそれらと併用すると良いでしょう) - どこで採用すべき? - REST APIやGraphQLなどによってサーバーとやり取りを行いかつ キャッシュ制御 やリトライなどを柔軟に実装・管理したい場合 Copyright © RevComm Inc.
  7. 3. MiiTel PhoneにおけるRecoilの移行事例について MiiTel Phoneにおける移行前の構成 - 状態管理としてはRecoil+Apolloを採用 - Server StateはApolloで管理し、それ以外の大部分をRecoilで管理

    - 一部REST APIを使用している箇所があり、そのほとんどはアプリの起動時に一回だけ読 み込んでおけば十分であるため、TanStack Queryなどは使わずにRecoilで管理してい ます Copyright © RevComm Inc.
  8. 3. MiiTel PhoneにおけるRecoilの移行事例 結論: RecoilからJotaiに移行することにしました - 先ほどの分類においてRecoilと同じカテゴリーに属し、APIもよく似ているため、他の選択 肢と比較して移行コストの大幅な削減が期待できる - JotaiはすでにRevComm内の他のプロダクトにおいて採用事例があった(十分にワーク

    してくれることがすでに実証されている) - Atomic State ManagementはMiiTel Phoneにおいてはほとんどのケースでうまく機能し てくれていた (Reduxへ移行する必要性は高くなかった) - 移行における具体的な対応についてはRevCommのTechBlogで公開しています (MiiTel PhoneでRecoilからJotaiへの移行を行いました) Copyright © RevComm Inc.
  9. 3. MiiTel PhoneにおけるRecoilの移行事例 選択しなかった理由 - Redux - MiiTel PhoneにおいてはRecoilで共有していた状態の多くは単純な更新処理で済 むものが大半であり、ReduxはややToo

    muchであること (一部、Reduxが欲しいと 思う箇所はあるものの、JotaiにはatomWithReducerなどのAPIもあるため、十分に 対応可能と判断) - Context API - パフォーマンスに関する懸念を考慮する必要があり、Jotaiと比較して移行コストが かかってしまうと判断しました。また、MiiTel Phoneにおいてはスムーズな通話体験 を提供したいため、パフォーマンス劣化は避けたいです。 Copyright © RevComm Inc.
  10. 4. MiiTelにおけるフロントエンド MiiTel Phone - Jotai+Apolloの構成 - Server StateはApollo, それ以外をJotaiで管理

    - 一部、複雑な状態管理が必要でストアによる管理が適している箇所もありますが、それは 少数であるため現状はJotaiで対応しています - 一部、REST APIによってサーバーと疎通している箇所がありますが、アプリの初回起動 時のみに読めば十分なリードオンリーなデータがほとんどであり、複雑な管理も不要であ るため、TanStack Queryなどは使わずにJotaiで管理しています Copyright © RevComm Inc.
  11. 4. MiiTelにおけるフロントエンド MiiTel Analytics - 基本的にはJotai+TanStack Queryの組み合わせを採用 - MiiTel Phoneとは異なり、サーバーとの疎通はほぼREST

    APIを経由しているため、 ApolloではなくTanStack Queryを採用 - 様々なチームのメンバーが開発に参加している関係でマイクロフロントエンド構成を採用 しており、一部のチームではContext APIへの移行を検討していたりもします Copyright © RevComm Inc.
  12. 5. まとめ - どのライブラリを採用するべきか? 判断がつかない場合 1. まずはバニラReact (useState) + Server

    State Management系のライブラリの組み合 わせで開発を進めるのが良いと思っています(最初から完璧な設計や判断を行うのは難 しいため、まずは小さく始める) 2. ある程度開発が進み、プロダクトに求められる要件や性質などが明らかになってきたら、 その段階でプロダクトに適したライブラリを導入すればミスマッチは減らせるはずです - 例) 堅牢さが求められる場合はストア (Redux, Zustandなど) を採用し、そうでなけ れば Jotai を導入する、など Copyright © RevComm Inc.