orvalでTanStack Query v5のuseSuspenseQueryを使う
この記事は株式会社ガラパゴス(有志) Advent Calendar 2023の9日目です。
orvalってなに?
orvalは、OpenAPIからフロントエンド用のコードを生成してくれるツールです。
とりわけ、@tanstack/react-queryのコードを生成する機能があり、queryKey
の管理やカスタムフックの命名を脇に置いてフロントエンド開発ができるので、REST API + react-queryを使ったSPA開発では、個人的には無くてはならない程の存在です。
TanStack Query v5でSuspenseのサポートが安定版になる
TanStack Query v5がリリースされ、今まではuseQuery
のオプションとしてsuspense: boolean
を渡すという形でSuspenseをサポートしていましたが、useSuspenseQuery
という別のフックに分離されました。
(v4まではexperimentalだったんですね。)
useSuspenseQuery
を使ったcodegenをする
orvalでorvalでもuseSuspenseQuery
を使ったコードの生成をサポートしたようのですが、ドキュメントから素直に辿り着けなかったのでメモします。
orval v6.19.0の下記のコミットでuseSuspenseQuery
のサポートが追加されています。
ドキュメントだと、「How use other query」を参考に、orvalの設定ファイルを編集し、useSuspenseQuery
を使ったフックの生成をONにします。
module.exports = {
petstore: {
output: {
...
override: {
query: {
useSuspenseQuery: true,
version: 5,
},
},
},
...
},
};
(version
オプションがどういった役割なのか確認できず...とりあえず付けています。)
上記のようにuseSuspenseQuery: true
を記述してcodegenを行うと、useGetHogeSuspense
のようなuseSuspenseQuery
を使ったカスタムフックが生成されます。
余談
react-queryのSuspenseサポートが専用のフックになったことと、その他のv5での変更で、個人的には下記が大きな変更だと感じました。
-
data
の型がdata | undefined
だったものが、undefined
が無くなる -
placeholderData
が無いため、「フェッチが完了するまではfallbackを表示せずにstaleのデータを表示」のような挙動を実装するときに、startTransition
やuseDeferredValue
を使う必要がある。
data
のundefined
が無くなるのはとても嬉しく、startTransition
やuseDeferredValue
を使った実装は、まさにReactドキュメントのSuspense
の項目にある書き方で、「useDeferredValue
ってこういうふうに使うんだぁー」という感想です。
orvalは多機能でMSWでのモックの生成もできるので、もっと広まってほしいと思う今日この頃です。
Discussion