Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SWR->TanStack Queryに移行する? #335

Closed
takecchi opened this issue Mar 8, 2024 · 19 comments
Closed

SWR->TanStack Queryに移行する? #335

takecchi opened this issue Mar 8, 2024 · 19 comments
Assignees
Labels
develop 開発タスク

Comments

@takecchi
Copy link
Member

takecchi commented Mar 8, 2024

関連Issue

概要

APIとの通信やキャッシュ、状態管理をSWRで行っているが、
SWRを使って丸めた箇所(swr/client配下)の見通しは悪い気がした。
(コンポーネント使用箇所はかなり見やすいと思うけど)

ReactQueryにした時にどう変わるか、変わった結果移行するのか含めて検証を行いたい

@takecchi takecchi added the develop 開発タスク label Mar 8, 2024
@takecchi takecchi changed the title SWR->React Queryに移行する? SWR->TanStack Queryに移行する? Mar 8, 2024
@takecchi
Copy link
Member Author

takecchi commented Mar 8, 2024

@takecchi
Copy link
Member Author

takecchi commented Mar 8, 2024

@takecchi
Copy link
Member Author

takecchi commented Mar 8, 2024

こんな感じで書いていいみたい

useQuery({
    queryKey: ['todos', todoId],
    queryFn: () => fetchTodoById(todoId),
  })

https://tanstack.com/query/latest/docs/framework/react/guides/query-keys#if-your-query-function-depends-on-a-variable-include-it-in-your-query-key

@takecchi
Copy link
Member Author

takecchi commented Mar 8, 2024

npm i -D @tanstack/eslint-plugin-query

@takecchi
Copy link
Member Author

takecchi commented Mar 8, 2024

@takecchi
Copy link
Member Author

@takecchi
Copy link
Member Author

takecchi commented Mar 16, 2024

@takecchi
Copy link
Member Author

SWRのdedupingIntervalに当たる設定はstaleTime

@takecchi
Copy link
Member Author

queryFnでUndefinedを返却することは出来ない。(反映されない)
TanStack/query#4964

isErrorで判定する必要あり

@takecchi
Copy link
Member Author

takecchi commented Mar 16, 2024

useMutationを使って特定のキャッシュを更新させたい場合
https://tanstack.com/query/v5/docs/framework/react/guides/updates-from-mutation-responses

@takecchi
Copy link
Member Author

タブを再フォーカスした際に、一度実行に失敗したクエリを再実行する為、以下のような問題が発生する。

  1. アカウント作成ページでメールアドレス入力まで行う
  2. 確認メールが来るのでタブを切り替えてgmailを確認
  3. 再度アカウント作成ページに戻ると画面が最初からになっている
    (isLoadingがtrueになることで画面がリセットされるため)

この問題を解決するためのissue
TanStack/query#3565

@takecchi
Copy link
Member Author

takecchi commented Mar 17, 2024

フェッチ結果が同じでも再レンダリングされる?

再レンダリングをさせたいプロパティだけ個別で設定しないといけないぽい...?
TanStack/query#840

もしその場合は正直SWRに軍配上がりそう

@takecchi
Copy link
Member Author

SWRのように比較してくれないみたい

@takecchi
Copy link
Member Author

データが同じだった場合は再レンダリングされないのが正しい挙動?
TanStack/query#1864
よくわからない

@takecchi
Copy link
Member Author

takecchi commented Mar 17, 2024

https://tanstack.com/query/v5/docs/framework/react/reference/useQuery

By default, access to properties will be tracked, and the component will only re-render when one of the tracked properties change.

notifyOnChangePropsのデフォルトはtrackedになっていて、SWRと同じように使用しているプロパティを自動で検知して再レンダリングを抑制してくれるらしい。

効いてない感じするけど

@takecchi
Copy link
Member Author

Date型がよくないっぽい
TanStack/query#6482

@takecchi
Copy link
Member Author

takecchi commented Mar 17, 2024

    structuralSharing: (oldData, newData) => {
      if (JSON.stringify(oldData) === JSON.stringify(newData)) {
        return oldData;
      }
      return newData;
    },

これで解決。デフォルトでやってくれないものだろうか
QueryClientのインスタンス生成時にdefaultOptionsを設定できた。

SWRはハッシュ化して比較しているのでそれに習ってみる
https://github.com/vercel/swr/blob/e81d22f4121743c75b6b0998cc0bbdbe659889c1/_internal/utils/config.ts#L40-L41

npmパッケージとして公開されていたのでこれを使用する。
https://github.com/shuding/stable-hash

@takecchi
Copy link
Member Author

総評

Good

  • SWRとほぼ変わらない使用感
  • useMutationの使用感はuseSWRMutationよりも優れている
  • queryFnの引数がシンプルでわかりやすい

Bad

  • Middlewareがサポート対象外

@takecchi
Copy link
Member Author

使用感はかなり良かったし、SWRと比べて可読性も良い。
しかしタイムライン取得用のカスタムHookを作ろうとした際にMiddlewareがサポート対象外であることが判明。

なんとか出来なくもなさそうだが、設計と実装に割く余力が無いため今回は断念。
個人的にはライブラリのサイズ増やしてでもTanstackQueryを採用する価値はあると思う。

次回の為にブランチは残しておく
https://github.com/takecchi/cuculus/tree/feature/use-tanstack-query

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
develop 開発タスク
Projects
None yet
Development

No branches or pull requests

1 participant