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

なぜReduxを使うのか

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 なぜReduxを使うのか

Avatar for Yuki Kodama

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 に移行 ← イマココ • 非同期処理が読みやすい •

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