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.