intermediate
Middleware
Перехватывайте dispatch для async-сценариев, логирования, аналитики, побочных эффектов и сквозных политик.
Middleware оборачивает dispatch: `store => next => action => {}`. Может логировать, откладывать, преобразовывать или запускать async до/после reducers. Цепочка заканчивается, когда `next(action)` доходит до reducer.
Типичное: redux-thunk (функции как async actions), аналитика, подстановка токена, crash reporting. RTK `configureStore` включает thunk по умолчанию.
const logger = (store) => (next) => (action) => {
console.log('dispatching', action);
const result = next(action);
console.log('next state', store.getState());
return result;
};
Для data fetching предпочитайте RTK Query или listener middleware, а не ручные цепочки thunk. Middleware должен быть узким — не второй слой приложения.
Компромисс: сквозной async и логирование в одном pipeline против цепочек dispatch, которые сложнее проследить.
На интервью: где жить async (thunk vs RTK Query vs effect в компоненте).
Типовые ошибки: бесконечные циклы dispatch, сюрпризы порядка middleware, дублирование бизнес-логики в десятках thunk.
Чеклист:
- Middleware для сквозных задач вокруг dispatch.
- Вызывайте next(action), если не глотаете намеренно.
- RTK Query для жизненного цикла server cache.
- Не раздувайте оркестрацию в middleware.