🐻

Zustandが生まれた経緯、正確にはZustand v3から

2024/09/02に公開

こんにちは、Zustand作者です。最近、Zustandが日本でも注目されているような気がします。どうやってZustandが生まれたか、記事にしましたので、よろしければご覧ください。

https://blog.axlight.com/posts/how-zustand-was-born/

ChatGPTに翻訳してもらいました。

あと、こちらの記事もあわせてどうぞ。

https://zenn.dev/dai_shi/articles/aa96fb8a137424


はじめに

この記事では、Zustandの開発に至った経緯を共有したいと思います。正確に言うと、私はZustandのオリジナルの作者ではありませんし、Zustand v0が誕生したとき、私は他のグローバルステートライブラリ、特にReact-Trackedを開発していました。ちなみに、今では自分をZustandの(副次的な)作者だと考えています。

Zustandについて言及し、私のライブラリを含む他のライブラリと比較したツイートを見つけました。

https://x.com/dai_shi/status/1141004414129324032

当時の私の信念は、グローバルステートはReact Concurrent Modeと連携させるためにReact Context経由で渡すべきだというものでした。そこで、私のライブラリと他のライブラリを区別するための比較表を作成しましたが、その中の一つがZustandでした。これは2019年のことです。

Zustand v3

2020年に私はPoimandresグループに参加し、Zustandの開発を引き継ぎました。当時の私の関心は、グローバルステートライブラリをReact Concurrent Modeと連携させることでした。Concurrent Modeのすべての恩恵を享受することはできませんでしたが、グローバルステートをConcurrent Modeと互換性のあるものにするためのuseMutableSourceという実験的なAPIが存在しました。

私はReact Contextベースの解決策であるReact-Trackedを使って様々な実験をしており、React Contextなしでグローバルステートをどう扱うかを模索していました。Zustandはすでに1年が経過していましたが、誰もメンテナンスをしていませんでした。そこで、私はこのプロジェクトを引き継ぐことにしました。

実験的なuseMutableSource APIはまだ準備が整っていなかったため、最初のタスクは様々なことを更新し、いくつかのバグを修正することでした。こうしてZustand v3が誕生しました。私の希望は、すぐにuseMutableSourceを取り入れたv4をリリースすることでしたが、それは実現しませんでした。その裏には別のストーリーがあります。

今日では、グローバルステートを外部に持ち、必要に応じてそのストアをReact Contextを使って渡すというパターンは広く知られています。Zustandはこのパターンの先駆者でした。React Contextにグローバルステートを持たないことに対して非常に懐疑的な意見が多く、このパターンが有効であることを説明するのに苦労しました。

現在の状況

Zustandに関して私が気にかけていることの一つは、そのシンプルな実装と小さなバンドルサイズです。ソースコードを見れば、React hooksと最小限のストア実装を使用しているだけであることがわかります。

この記事を書いている時点で、Zustand v4が最新バージョンで、非常に高度なTypeScriptサポートがあり、コードはv3からほぼ完全に書き直されています。次のリリースに向けて、Zustand v5もほぼ準備が整っています。

最後に、このプロジェクトを維持してくれている多くの貢献者がいることをお伝えしたいと思います。私がプロジェクトを引き継いだときには、これが起こるとは思っていませんでした。心から感謝しています。皆さん、ありがとうございます。

Discussion