chore(deps): bump @reduxjs/toolkit from 2.7.0 to 2.9.0
Type: Pull Request
State: Open
Association: Contributor
Comments: 0
(3 months ago)
(3 months ago)
dependencies javascript
Bumps @reduxjs/toolkit from 2.7.0 to 2.9.0.
Release notes
Sourced from @reduxjs/toolkit's releases.
v2.9.0
This feature release rewrites RTK Query's internal subscription and polling systems and the
useStableQueryArgshook for better perf, adds automaticAbortSignalhandling to requests still in progress when a cache entry is removed, fixes a bug with thetransformResponseoption for queries, adds a newbuilder.addAsyncThunkmethod, and fixes assorted other issues.Changelog
RTK Query Performance Improvements
We had reports that RTK Query could get very slow when there were thousands of subscriptions to the same cache entry. After investigation, we found that the internal polling logic was attempting to recalculate the minimum polling time after every new subscription was added. This was highly inefficient, as most subscriptions don't change polling settings, and it required repeated O(n) iteration over the growing list of subscriptions. We've rewritten that logic to debounce the update check and ensure a max of one polling value update per tick for the entire API instance.
Related, while working on the request abort changes, testing showed that use of plain
Records to hold subscription data was inefficient because we have to iterate keys to check size. We've rewritten the subscription handling internals to useMaps instead, as well as restructuring some additional checks around in-flight requests.These two improvements drastically improved runtime perf for the thousands-of-subscriptions-one-cache-entry repro, eliminating RTK methods as visible hotspots in the perf profiles. It likely also improves perf for general usage as well.
We've also changed the implementation of our internal
useStableQueryArgshook to avoid callingserializeQueryArgson its value, which can avoid potential perf issues when a query takes a very large object as its cache key.[!NOTE] The internal logic switched from serializing the query arg to doing reference checks on nested values. This means that if you are passing a non-POJO value in a query arg, such as
useSomeQuery({a: new Set()}), and you haverefetchOnMountOrArgChangeenabled, this will now trigger refeteches each time as theSetreferences are now considered different based on equality instead of serialization.Abort Signal Handling on Cleanup
We've had numerous requests over time for various forms of "abort in-progress requests when the data is no longer needed / params change / component unmounts / some expensive request is taking too long". This is a complex topic with multiple potential use cases, and our standard answer has been that we don't want to abort those requests - after all, cache entries default to staying in memory for 1 minute after the last subscription is removed, so RTKQ's cache can still be updated when the request completes. That also means that it doesn't make sense to abort a request "on unmount".
However, it does then make sense to abort an in-progress request if the cache entry itself is removed. Given that, we've updated our cache handling to automatically call the existing
resPromise.abort()method in that case, triggering theAbortSignalattached to thebaseQuery. The handling at that point depends on your app -fetchBaseQueryshould handle that, a custombaseQueryorqueryFnwould need to listen to theAbortSignal.We do have an open issue asking for further discussions of potential abort / cancelation use cases and would appreciate further feedback.
New Options
The builder callback used in
createReducerandcreateSlice.extraReducersnow hasbuilder.addAsyncThunkavailable, which allows handling specific actions from a thunk in the same way that you could define a thunk insidecreateSlice.reducers:const slice = createSlice({ name: 'counter', initialState: { loading: false, errored: false, value: 0, }, reducers: {}, extraReducers: (builder) => builder.addAsyncThunk(asyncThunk, { pending(state) { state.loading = true }, fulfilled(state, action) { state.value = action.payload }, rejected(state) { state.errored = true }, </tr></table>
... (truncated)
Commits
98c54c6Release 2.9.00a86abdexport some useful async thunk typesd02c27aadd docs for addAsyncThunk (#5066)ab346b9fixdoc: incorrect position of keepUnusedDataFor for two scenarios (#5062)d2bbb8dRewrite subscription handling and polling calculations for better perf (#5064)3c6de47Merge pull request #5065 from reduxjs/feature/TS5.9-matrixc37b977Add missing error value38537c3Don't run Node10 checks for TS 6+821be20Add TS 5.9 to the matrix407688dAbort pending requests if the cache entry is removed (#5061)- Additional commits viewable in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Pull Request Statistics
1
2
+5
-5
Package Dependencies
Technical Details
| ID: | 7092419 |
| UUID: | 2806464108 |
| Node ID: | PR_kwDONo8l_c6nRz5s |
| Host: | GitHub |
| Repository: | gh-buddy/ui-react-typescript-redux-sass-template |
| Merge State: | Unknown |