Middleware (усилители). Логгер

ОБНОВЛЕНИЕ 2018: Вышло второе изданиеarrow-up-right (современный код и версии пакетов, данное издание УСТАРЕЛО)

На каналеarrow-up-right так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесьarrow-up-right!

Middleware (Усилители). Логгер

Прежде чем мы сможем создавать асинхронные действия, поговорим об усилителях и напишем, обещанный ранее усилитель - логгер.

Представляйте усилитель, как нечто стороннее, добавляющее функционал для нашего store.

Усилители, это middleware. Суть middleware функций, взять входные данные, добавить что-то и передать дальше.

Например: есть конвейер, по которому движется пальто. На конвейере работают Зина и Людмила. Зина пришивает пуговку, Людмила прикладывает бирку. Внезапно, появляется middleware Лена, встает между Зиной и Людмилой и красит пуговку в хипстерский модный цвет. Так как Лена после покраски не уносит пальто с собой, а передает дальше, то Людмила как ни в чем не бывало приделывает бирку и пальто готово. Только теперь оно хипстерское. Усиленное.

Для лучшего понимания, предлагаю написать бесполезный усилитель, выдающий console.log('ping'), на каждое действие. При этом, мы будем использовать предложенный redux метод добавления усилитей с помощью applyMiddleware.

Обновим файл конфигурации store:

store/configureStore.js

import { createStore, applyMiddleware } from 'redux'
import rootReducer from '../reducers'
import { ping } from './enhancers/ping' // <!-- подключаем наш enhancer

export default function configureStore(initialState) {
  const store = createStore(
    rootReducer,
    initialState,
    applyMiddleware(ping)) // <!-- добавляем его в цепочку middleware'ов

  if (module.hot) {
    module.hot.accept('../reducers', () => {
      const nextRootReducer = require('../reducers')
      store.replaceReducer(nextRootReducer)
    })
  }

  return store
}

Напишем усилитель:

store/enhancers/ping.js

Боюсь, здесь не обойтись без ES5 версии:

Поехали:

  • eslint-disable - просто выключает проверку этого блока "линтером".

  • ping - это функция, которая возвращает функцию. Middleware - это всегда функция, которые обычно возвращают функцию, если только целью middleware не является прервать цепочку вызовов.

  • в возвращаемых функциях, благодаря applyMiddlewarearrow-up-right у нас становятся доступными аргументы, которые мы можем использовать во благо приложения:

    • store - redux-store нашего приложения;

    • next - функция-обертка, которая позволяет продолжить выполнение цепочки;

    • action - действие, которое было вызвано (как вы помните, вызванные действия - это store.dispatch)

Сейчас, при клике на кнопки, у нас в консоли появляется строка ping. Давайте изменим ее, написав простейший логгер: store/enhancers/ping.js

Я использовал новый строковый синтаксис. В прошлом, наш console.log выглядел бы так:

Покликайте на кнопки, результат должен быть следующим: простой логгер скрин

Redux-logger

Отбросим наш велосипед и поставим популярный логгерarrow-up-right.

Удалите папку enchancers, и измените configureStore.

src/store/configureStore.js

Можете проверить - логгер достаточно информативный и удобен в использовании.

Таким образом, усилители - отличный способ добавить в наш процесс обработки действий некую прослойку с необходимой функциональностью.

Одним из популярнейших усилителей, является redux-thunkarrow-up-right, который мы как раз будем использовать для создания асинхронных действий.

Исходный кодarrow-up-right на текущий момент.

Last updated