Чтобы упростить процесс конфигурации хранилища используют configureStore()
import { configureStore } from '@reduxjs/toolkit'
import rootReducer from './reducers'
const store = configureStore({ reducer: rootReducer })
// The store now has redux-thunk added and the Redux DevTools Extension is turned on
В качестве входных параметров функция configureStore
принимает объект со следующими свойствами:
reducer
— набор пользовательских редьюсеров,middleware
— опциональный параметр, задающий массив мидлваров, предназначенных для подключения к хранилищу,devTools
— параметр логического типа, позволяющий включить установленное в браузер расширение Redux DevTools (значение по умолчанию — true),preloadedState
— опциональный параметр, задающий начальное состояние хранилища,enhancers
— опциональный параметр, задающий набор усилителей.
Данный инструмент позволяет автоматически комбинировать редьюсеры, добавить мидлвары (по умолчанию включает redux-thunk), а также использовать расширение Redux DevTools
.
// file: todos/todosReducer.ts noEmit
import type { Reducer } from '@reduxjs/toolkit'
declare const reducer: Reducer<{}>
export default reducer
// file: visibility/visibilityReducer.ts noEmit
import type { Reducer } from '@reduxjs/toolkit'
declare const reducer: Reducer<{}>
export default reducer
// file: store.ts
import { configureStore } from '@reduxjs/toolkit'
// We'll use redux-logger just as an example of adding another middleware
import logger from 'redux-logger'
// And use redux-batched-subscribe as an example of adding enhancers
import { batchedSubscribe } from 'redux-batched-subscribe'
import todosReducer from './todos/todosReducer'
import visibilityReducer from './visibility/visibilityReducer'
const reducer = {
todos: todosReducer,
visibility: visibilityReducer,
}
const preloadedState = {
todos: [
{
text: 'Eat food',
completed: true,
},
{
text: 'Exercise',
completed: false,
},
],
visibilityFilter: 'SHOW_COMPLETED',
}
const debounceNotify = _.debounce((notify) => notify())
const store = configureStore({
reducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
devTools: process.env.NODE_ENV !== 'production',
preloadedState,
enhancers: [batchedSubscribe(debounceNotify)],
})
// Store был создан с такими параметрами:
// - срезы редукторов были автоматически переданы в combineReducers()
// - библиотеки redux-thunk и redux-logger были добавлены как middleware
// - расширение Redux DevTools было отключено для продакшена
// - middleware, пакетное подписывание и улучшители дебаговых инструментов были объединены вместе
Для получения наиболее популярного списка мидлваров можно воспользоваться специальной функцией getDefaultMiddleware
, также входящей в состав Redux Toolkit. Данная функция возвращает массив с включенными по умолчанию в библиотеку Redux Toolkit мидлварами. Перечень этих мидлваров отличается в зависимости от того, в каком режиме выполняется ваш код.
В production режиме массив состоит только из одного элемента — thunk.
В режиме development на момент написания статьи список пополняется следующими мидлварами:
serializableStateInvariant
— инструмент, специально разработанный для использования в Redux Toolkit и предназначенный для проверки дерева состояний на предмет наличия несериализуемых значений, таких как функции, Promise, Symbol и другие значения, не являющиеся простыми JS-данными;immutableStateInvariant
— мидлвар из пакета redux-immutable-state-invariant, предназначенный для обнаружения мутаций данных, содержащихся в хранилище.