状態管理どうしてますか？

昨年7月の話になってしまいますが、[スタートアップReact LT](https://coralcapital.connpass.com/event/218552/)で「状態管理どうしてますか？」と題して、発表しました。

## tl;dr

justInCaseTechnologiesウェブフロントエンド、2021年7月時点での大まかな方針：

- 小規模のプロダクトには [Recoil](https://recoiljs.org/) / [Jotai](https://jotai.pmnd.rs/) を使っていく
- 中規模以上のプロジェクトでは [Redux Toolkit](https://redux-toolkit.js.org/) を使っていく

## スライド

<iframe src="//www.slideshare.net/slideshow/embed_code/key/AtXKSVSa4cqnVF" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/takkyun/ss-249756397" title="状態管理どうしてますか？ " target="_blank">状態管理どうしてますか？ </a> </strong> from <strong><a href="https://www.slideshare.net/takkyun" target="_blank">Takuya Otani</a></strong> </div>

## サンプルコード

github に[サンプルコード](https://github.com/justincase-jp/state-samples/)を挙げています。

- [context-sample](https://github.com/justincase-jp/state-samples/tree/main/context-sample)
- [jotai-sample](https://github.com/justincase-jp/state-samples/tree/main/jotai-sample)
- [mobx-sample](https://github.com/justincase-jp/state-samples/tree/main/mobx-sample)
- [recoil-sample](https://github.com/justincase-jp/state-samples/tree/main/recoil-sample)
- [redux-sample](https://github.com/justincase-jp/state-samples/tree/main/redux-sample)
- [zustand-sample](https://github.com/justincase-jp/state-samples/tree/main/zustand-sample)

にそれぞれのライブラリを使ったサンプルプロジェクトが納められています。

`dist` ディレクトリにある `index.html` だけ共有していますが、基本各サンプルは独立させているので、それだけ取り出してボイラープレートのように使っていただくことも可能だと思います。

## 各ライブラリの感想
### [React Context](https://reactjs.org/docs/context.html)

他のライブラリに依存せず、 React だけで完結するのは強みですが、どうしても Context を設定するための記述が必要になってしまい、状態管理という本来の目的から外れた部分の実装が目に付く印象です。

### [Redux Toolkit](https://redux-toolkit.js.org/)

この発表した当初は justInCaseTechnologies では Redux Toolkit を採用したプロダクト・プロジェクトはありませんでした。

個人的には別の会社で以前 [Redux](https://redux.js.org/) を使ったことはありましたが、「おまじない」が多くそれがちょっと苦痛だったりしたのですが、今回この発表をきっかけに Redux Toolkit を使ってみたら、簡潔にわかりやすく記述できるようになっていてその印象が変わりました。

### [MobX](https://mobx.js.org/)

justInCaseTechnologies では、他ライブラリの依存関係などもあって、当初の最新版 (v6) は利用していませんでしたが、発表では v6 でサンプルコードを組んでみました。

v4 までのデコレータを多用した実装とは異なり、すっきりとした記述での実装ができるように。一方で class を使った実装から離れていくという React のトレンドとはちょっと異なる部分もあるのでちょっとしたモヤモヤ感……。

### [Recoil](https://recoiljs.org/)

比較的新しい状態管理ライブラリ。 atom という単位で状態をとりまとめていくスタイル。後述する Jotai も同じようなアプローチを取っていています。

この管理の仕方、管理する状態が少なければそんなに問題にならないのですが、増えてくると追いかけるのが大変になってきます。ライブラリが軽量なのもあって取り回しは良い印象はあるのですが……。

### [Jotai](https://jotai.pmnd.rs/)

Recoil 同様 atom 単位で状態を管理するというコンセプトのライブラリ。Recoil よりも記述量は減る傾向にあって、比較的すっきりとした実装にすることができるとは思います。

一方で Recoil でも触れたように管理する状態そのものが増えてきて、 atom 相互の関係性が複雑になってくるときつくなる印象は否めません。

## 発表できなかったこと

後述の通り、時間勘違いしていて、当日は全く触れることができなかったライブラリに [Zustand (ツシュタント)](https://zustand.surge.sh/) があります。前掲のスライドでは「おまけ」として掲載。

カスタムフックの生成関数が用意されていて、作ったフックをコンポーネントで利用するという形になっています。全然知らなかったライブラリなんですが、使い勝手は良さそうで個人的には今後どこかで本格利用してみたいとは思いました。

## 発表を通して

発表準備のために、今回は実際にサンプルコードを組んでみましたが、React Contextを除いて、実装面においては正直このサンプルコードの規模感では、どのライブラリも大きく変わらない印象があるのは否めません（苦笑）。

一方で実際組んでみると、それぞれのライブラリの書き味は結構違うことも分かりました。[Redux](https://redux.js.org/) は [Toolkit](https://redux-toolkit.js.org/) を通して利用すると以前実装に使っていたときよりも全然印象が異なったのは大きな収穫。以前と比べて React 周辺の技術スタックに対しての知識が増えたのも大きいとは思いますが。

[Recoil](https://recoiljs.org/) / [Jotai](https://jotai.pmnd.rs/) / [Zustand](https://zustand.surge.sh/) あたりは重量感を感じることもなく、さっと導入できそうな印象があり、個人的には今後もちょっと注力していきたいと思っています。

発表当初は justInCaseTechnologies で利用していなかった [Redux Toolkit](https://redux-toolkit.js.org/) 、その後の開発案件で利用するものが出てきています。最初から中規模以上を目指したものなら、手続きに関する記述が安定している Redux はチームで開発するプロジェクトには向いている印象を持っています。

## 発表の反省

ライトニングトーク、発表枠 15 分ということで準備していましたが、直前の打ち合わせで質疑応答含めて 15 分ということが発覚して、めちゃくちゃ焦りました。

結局発表だけでほぼ 15 分使い切ってしまったのは大反省（おそらく、オーバーしていたはず）。次回からはちゃんと時間確認します……。