@reduxjs/toolkit
Version:
The official, opinionated, batteries-included toolset for efficient Redux development
54 lines (40 loc) • 1.52 kB
Markdown
# Store Lifetime
## Decision table
| Environment | Default store shape | Why |
| --- | --- | --- |
| Client-only SPA | One module-level singleton store | There is one browser session and no cross-request leakage risk. |
| SSR-heavy React app | `makeStore()` plus provider-local state | Each request needs its own store instance, but that instance must stay stable across client renders. |
| Non-React integration code | Direct store access can be acceptable | This is outside the React context boundary and should stay out of UI components. |
## SPA pattern
```ts
import { configureStore } from '@reduxjs/toolkit'
import { postsSlice } from '../features/posts/postsSlice'
export const store = configureStore({
reducer: {
posts: postsSlice.reducer,
},
})
```
Use this for classic browser SPAs.
## SSR-heavy React pattern
```tsx
// file: src/lib/store.ts
import { configureStore } from '@reduxjs/toolkit'
import { postsSlice } from '../features/posts/postsSlice'
export const makeStore = () =>
configureStore({
reducer: {
posts: postsSlice.reducer,
},
})
// file: src/app/StoreProvider.tsx
'use client'
import { useState, type ReactNode } from 'react'
import { Provider } from 'react-redux'
import { makeStore } from '../lib/store'
export function StoreProvider({ children }: { children: ReactNode }) {
const [store] = useState(makeStore)
return <Provider store={store}>{children}</Provider>
}
```
Create the store per request, then keep it stable inside the provider component.