2020年になったのでRedux離れを考える
背景
Hooksが産まれた
useReducerが標準提供されている
useContext / React.createContextで親 / 孫 間のデータやり取りがとても簡易になった
useEffectで非同期処理がやりやすくなった。
reduxは「必須」なものではなくなった
いや、元々「必須じゃないよ」という風には説明されてきていたが、実質支配者で他の選択肢があまり無かった
Reduxを使うべきか使わないべきか?
正直結局の所あったほうが楽というのが現状
useContextは割とライブラリ提供者向けで、アプリケーション作成者向けになってない
combineReducerはuseReducerでは使えない
パフォーマンス面を考えるとreduxを使ってしまう方が良い
設計の面でも考えることが減る
contextに頼ったとき、複数のcontextが安易に産まれて地獄が産まれがち。であればシングルトンを半強制してくるreduxは有益
それでもRedux離れをしたい(本題)
合理的でない選択肢を取れる場合(プロトタイプや個人制作)であれば脱Reduxをして、その知見を貯める行為をしてみたい
個人的にずっとreduxの寝首をかけるタイミングを待っていた
細かすぎて伝わらない理由
middlewareを考えると、hooksとreduxで実行するタイミングが変わる。この癖を乗りこなしたい
reduxで言えばactionが発火された後だった。そして、そもそもmiddlewareのような非同期の絡む処理は、reduxが「サポートしない」領域だった。
hooksの場合はuseEffect。タイミングがコンポーネントの内部に変わる。classで言えばcomponentDidMountなどに相当。これまでそのような場所で処理をするのはアンチパターンに近かったが、流れが変わった。
useEffectは(おそらく)長期的にちゃんと付き合っていかないと行けないので、避けたくない
validationなど、「reduxでやると無駄に冗長になる」ような場所は、しっかりと避けきってあるべき形を模索したい。
validationやasyncはreduxが苦手だったり放棄した部分で、そこだけreduxから逃していくというのは順当な手と思われる。
combineReducerは、上記では「使える」という利点として書いたが、実は「ネスト出来てしまう」というのは複雑性が上がるだけなのでは?という予感
意外と無くてもなんとかなるような気がしている。
useReducerの利点
公式のuseReducerのdispatcherはuseEffectのdepsに含めなくても良い事になっている。
これ地味に嬉しい
最近のredux開発の動向
最近は利便性にフォーカスしていってる。これ自体は良いと思う
ただ一点、redux-toolkitが個人的にあまり好きになれない。
reduxの個人的に長所だと思っているimmutableな部分をmutableに書けるよ、みたいなツールになっている。そこを初学者向けに隠蔽するのが良いとあまり思えてない
一方で、redux-toolkitはやはりmiddlewareレイヤーについては特にカバーしてなさそう
これが入ったプロジェクトは、もはや「reduxのプロジェクト」ではなく「redux-toolkitのプロジェクト」だと思ってしまうぐらいには別物になると思う。
おそらくこの分断は今後わかりやすく起きると予測している(結構これは真面目な脱reduxの理由かもしれない)
redux-toolkitはオプショナルなわけでもなく、style-guideでSTRONGRY RECOMMENDと言っているので、若干押しが強い。
各種扱いに慣れたい話(現状のhooksに感じる欠点)
Contextの扱いに慣れたい
何度か上記の脱reduxを試みているものの、現状わりとすぐContextがこんがらがってくる。
複数contextを作ること自体がそもそも良くはないのだが、どうやったらうまくいくのか模索したい気持ちが強い
dispatchの扱いに慣れたい
現状、結局ActionCreator作るべきかどうか迷ってる(多分作ったほうが良い)
結局ロジックレイヤー(middleware)の部分ほしいって気持ちをどこでどう決着つけるか?に慣れたい