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

なぜReduxを使うのか

 なぜReduxを使うのか

Yuki Kodama

May 31, 2016
Tweet

More Decks by Yuki Kodama

Other Decks in Programming

Transcript

  1. 自己紹介 @kuy (カイ) / Yuki Kodama 株式会社ジャパンベンチャーリサーチ entrepedia(アントレペディア)の開発・運用 AWS, Ruby

    on Rails, JavaScript (React + Redux) • redux-sagaで非同期処理と戦う • Reduxでコンポーネントを再利用する • Reduxのmiddlewareを積極的に使っていく • ・・・など Qiita の記事
  2. Flux で解決したこと • React コンポーネント階層が深くなったときのバケツリレーを回避 • コンポーネント間のデータの融通が不要になった • デバッグが容易になった ◦

    redux-logger だけで原因を特定できることも多い • テストが容易になった ◦ React コンポーネントが与えられた props だけに基づいてレンダリングされる ようになる 基本的には React 単体で構築したときに困ることの解決
  3. Redux と Flux の構成要素の違い Flux Redux View View Action Creator,

    Action Action Creator, Action Dispatcher (Store) Store Store (State) Store Reducer Store Middleware Store Store Enhancer 登場人物が増えたように見えるけど、もともと Store の住人
  4. Redux のどこがいいのか • Single Store、Single State ◦ 1つの巨大な State ツリーを複数の

    Reducer で構築 • 状態管理に特化した ◦ それ以外は開発者に丸投げ ◦ 自分の目的に合ったスタックで開発できる、とも言える • Store の役割を分割して名前を付けた ◦ Reducer、Middleware など ◦ 役割がはっきりすると効果的なテストが書きやすくなった
  5. Single Store、Single State By Fluxxor Redux は Store も State

    も1つにした どの Store の変更通知をどの View に購読させるか悩まなくなった その代わり、State から必要な部分だけ切り出す(react-redux) Store が1つになったので Store 間のやり取りは不要
  6. 1. 必要な State を列挙して初期 State を決める 2. 各 State を変更するのに必要そうな

    Action を書く 3. 各 State に対応した Reducer を書く 分割された Reducer による State の構築 例えばブログアプリを考えると・・・ app: ユーザ名、認証情報、設定情報、・・・ posts: 記事データ、記事の順序、ページング情報、・・・ categories: カテゴリデータ tags: タグデータ 開発時の感覚としてはトップダウンではなくボトムアップ
  7. 状態管理に特化した Redux を素の状態のまま使うのはおすすめできない(学習目的は除く) • フォームを作りたいときは? → redux-form, react-redux-form • 通信処理のハンドリングはどうする?

    → redux-api-middleware, redux-thunk • 非同期処理はどこにどうやって書く? → redux-saga, redux-thunk 専用の Middleware ライブラリの導入を検討しよう 本当に必要なら Middleware を書いてみよう 無理して React、Action Creator、Reducer で実装すると後で大変です
  8. State および Reducer の分割について combineReducers() ってどうなの?問題 State と Reducer は対応関係にあり、Reducer

    は担当の State 以外は見えない。 もし Reducer で他の Reducer が担当する State が欲しくなったらどうするの? • State/Reducer の分割単位に問題がないか考えてみる ◦ 巨大な1つの Reducer にするという手もなくはない(けど、おすすめしない) • Middleware で情報を補完する ◦ Action には View が持ってる最小限の情報を持たせる ◦ Middleware でその Action をひろって改変 or 別 Action を投げて処理を継続する • Yet Another combineReducers() を模索する
  9. 非同期処理との戦い #2 2. redux-api-middleware を導入 • 副作用を View から Middleware

    に追い出すことに成功 • Symbol の CALL_API をキーにするという、ちょっと意味わからない仕様によって Middleware で Action を扱いにくい • API呼び出しをチェーンさせたりするのどうしよう( → Middleware 使うしか無い )
  10. 非同期処理との戦い #3 3. redux-thunk に移行 • Promise を使えばチェーンもできる • 変な

    CALL_API がなくなった • 複雑な Promise の処理を Action Creator に押し込んでいいのか? • redux-thunk はほぼ Middleware と同等の ことができるのにカジュアルに使えてしまう (乱用すると危険) • テストどうすんの? • 機能追加していくとひどいことになりそうな未 来が見える
  11. 非同期処理との戦い #4 4. redux-saga に移行 ← イマココ • 非同期処理が読みやすい •

    複雑な処理はどんどん分割する • テストが容易、モックを使わないとテストでき ない部分が最小限になる • やっていけそう