• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Как сделать жизнь Redux разработчика проще?

Как сделать жизнь Redux разработчика проще? -1

24.04.2017 13:39
master-7 20 2200 Источник
JavaScript*
Наверняка многие из вас, кто постоянно работают с React + Redux (а может не только с React), постоянно совершают множество однотипных действий. В оригинальном исполнении задача эта монотонная и включает в себя постоянное создание экшенов и редюсеров. Тем более, если приходится работать с какими-то экстраординарными кейсами, в игру включаются экшены с префиксами.

Ваш покорный слуга также испытал очень много батхерта страданий, пока работал по старинке, через switch > case, но я взглянул на задачу немного с другой стороны и привёл к единообразию это в более удобную функционально — объектную форму записи.

И так — после некоторого времени я (master-7) и мой коллега (one-more) попробовали справиться с этим страшным сном фронтэндера и создали весьма интересную библиотечку Redux-Utils.

Конечно же, мы попытались написать общепонятное и исчерпывающее ридми, но для затравки — несколько примеров в статье.

Одна из самых интересных фичей — это объектное создание редюсеров.

import {Reducer} from 'redux-util'
import {UserState} from 'types/UserState'

import {
    GET_USER_DATA_REQUEST,
    GET_USER_DATA_SUCCESS,
    GET_USER_DATA_FAIL
} from 'services/actionTypes'

const initialState: UserState = [];

export default Reducer(initialState, {
    [GET_USER_DATA_REQUEST]: () => null,
    [GET_USER_DATA_SUCCESS]: (state, action) => ({
        ...state,
        data: action.users
    }),
    [GET_USER_DATA_FAIL]: (state, action) => ({
        ...state,
        error: action.error
    })
});

Как вы можете видеть, код стал намного более читабельным по сравнению с записью вида:

import {Reducer} from 'redux-util'
import {UserState} from 'types/UserState'

import {
    GET_USER_DATA_REQUEST,
    GET_USER_DATA_SUCCESS,
    GET_USER_DATA_FAIL
} from 'services/actionTypes'

const initialState: UserState = [];

export default function Reducer(state = initialState, action) => {
    switch (action.type) {
      case GET_USER_DATA_REQUEST:
        return null;
      case GET_USER_DATA_REQUEST: 
        return {
        ...state,
        data: action.users
      };
      case GET_USER_DATA_FAIL: 
        return {
        ...state,
        error: action.error
      };
      default:
        return state;
}

Ну и киллер фича номер два — посмотрим на создание экшенов:

import {buildGenericActionCreator} from 'redux-util'

const START_LOADING = 'START_LOADING';
const END_LOADING = 'END_LOADING';

export const startLoadingActionCreator = buildGenericActionCreator(START_LOADING);
export const endLoadingActionCreator = buildGenericActionCreator(END_LOADING);

// ....

import {startLoadingActionCreator, endLoadingActionCreator} from 'loading-reducer'

const PREFIX = 'PREFIX';
const startLoading = startLoadingActionCreator(PREFIX);
const endLoading = endLoadingActionCreator(PREFIX);
export const loadUser = () => (dispatch: Dispatch) => {
    dispatch(startLoading());
    return api.fetchUser().then(
        response => {
            dispatch(
                loadUserDataAction(response)
            );
            dispatch(endLoading());
        }
    );
};

И еще много интересного вы можете найти в ридми проекта! Надеюсь, данная библиотека сделает вашу работу легче.
Будете ли вы использовать данную библиотеку?

Проголосовало 84 человека. Воздержалось 23 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (20)


  1. justboris
    24.04.2017 16:54
    #10188888
    +4

    И чем ваше решение лучше старого доброго redux-actions?


    1. pinebit
      24.04.2017 21:21
      #10189244

      Ну или redux sauce: https://github.com/skellock/reduxsauce


    1. comerc
      25.04.2017 02:17
      #10189528
      +1

      Есть "гораздо более лучший" вариант — redux-act


  1. xGromMx
    24.04.2017 20:03
    #10189136
    +4

    Как сделать жизнь Redux разработчика проще? Просто не использовать его


    1. kanstantsin
      25.04.2017 20:57
      #10190982

      Золотые слова. Вспоминаю как страшный сон эти тонны повторяющегося кода. Особенно доставляют константа на константе и спагетти из функций, которые аргументы функций, являющихся аргументами функций и т.д. по схеме. Как будто код какой-нибудь CMS из 2005 года.


      1. xGromMx
        25.04.2017 20:58
        #10190984

        и на что перешли?)


        1. kanstantsin
          25.04.2017 21:03
          #10190994

          Пока mobx, пока ок, если подумать над архитектурой прежде, чем начать писать :) Но кода стало меньше, появилось какое-никакое ООП, typescript опять же сильно помогает, уже почти можно жить :)


          1. xGromMx
            25.04.2017 21:12
            #10191002

            Ну mobx не про ООП =)


            1. kanstantsin
              26.04.2017 14:13
              #10191982
              +1

              mobx нет, но попытки писать в ооп-стиле с redux это пытка.


              1. justboris
                26.04.2017 14:27
                #10192032

                А зачем обязательно ООП?


                Есть и другие способы разбиения проекта на части, о которых написано в документации Redux


              1. raveclassic
                26.04.2017 16:10
                #10192254

                Правильно, потому что redux совсем не про ооп.


      1. raveclassic
        25.04.2017 23:18
        #10191154
        +1

        Вспоминаю как страшный сон эти тонны повторяющегося кода
        А можете пример, что у вас там так повторялось? Быть может, дело в том коде, а не в redux?
        Особенно доставляют константа на константе
        А что не так с константами?
        которые аргументы функций, являющихся аргументами функций и т.д. по схеме
        И что не так с ФВП?


        1. kanstantsin
          26.04.2017 14:19
          #10192004

          Я не хочу вступать в полемику, просто на проекте в ~25k строк кода со значительным кол-вом запросов к api размер, поддерживаемость, читаемость кода начинают иметь особое значение, поэтому отказ от redux оказался верным решением. На простых примерах типа todo все выглядит прилично, но на реальных проектах появляются проблемы. Только личный опыт :)


          1. raveclassic
            26.04.2017 16:09
            #10192252

            Возможно из-за того, что redux не дает каких-либо внятных рекомендаций по архитектуре сервисного и доменного слоев, предоставляя лишь паттерн для организации внутреннего взаимодействия UI. То, что экшены могут быть thunk'ами или promise'ами — не более чем сильное допущение и упрощение. И когда проект начинает разрастаться, становится понятно, что серьезному IO/эффектам не место ни в редьюсерах, ни в экшенах, ни вообще в redux, так как это не его задача (хоть redux и предоставляет возможность вставки middleware).

            Рекомендую посмотреть на redux-saga и redux-observable. Обе решают наболевшую проблему толстых экшенов с кучей копипасты, расширяемости и поддерживаемости. Саги только в качестве бонуса предоставляют тестируемость без каких-либо моков.


      1. comerc
        26.04.2017 11:06
        #10191592

        Вы просто не умеете его готовить. Константы не нужны совсем.


        https://github.com/comerc/yobr/blob/master/src/ducks/postForm.js


  1. raveclassic
    24.04.2017 20:35
    #10189176

    И как только люди не изворачиваются, лишь бы не писать return.


  1. pinebit
    24.04.2017 21:18
    #10189242
    +1

    Это уже наверное пятый улучшитель redux за месяц. Право же, не нужны они.
    Единственный тул который я сделал сам себе — связка redux action, saga и fetch, чтобы один dispatch запустил сагу, та вызвала API и все декларативно. Думал выложить это на гитхаб, но вовремя остановился.


    1. xGromMx
      25.04.2017 21:13
      #10191004

      уж лучше тогда redux-observable куда лучше саг


      1. raveclassic
        25.04.2017 23:11
        #10191150

        А чем лучше?


  1. avdept
    25.04.2017 11:20
    #10189914

    Зачем использовать редюкс если есть alt?

МЕТКИ

  • Хабы
  • Теги

JavaScript

redux

redux-utils

es6

javascript

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Как сделать жизнь Redux разработчика проще? -1

    • 24.04.2017 13:39

    Как я писал web app angular + material и REST на Yii2 + webserver nginx +9

    • 11.01.2016 11:48

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
08:00

Как сэкономить миллиард, если правильно подуть на раскаленную железку +74

08:05

Вышли 25 лет назад и изменили игровую индустрию навсегда. 5 самых важных игр 2001 года +22

05:54

«Оценка 300 часов? ИИ мне сделает за вечер!». Считаем тремя методами, и 300 — ниже плинтуса в индустрии +21

09:01

Как я воскресил Canon 7D Mark II, который продавался «на запчасти» +20

11:30

Тропа хиппи: утраченный маршрут +15

09:00

Как мы подвели Кира Булычёва и почему его книги — об украденном детстве и о том, как его сохранить другим +11

05:33

JOIN как в ORM: связи по foreign key в PostgreSQL +11

05:45

Спустя 6 лет я докопался до ядра компьютера, и там была математическая формула +10

08:22

История о том, как я написал компилятор Svelte на Rust +7

00:21

Феномены памяти +6

00:37

Обзор препринтов научных статей в области астрофизики за июнь 2026 года +5

13:09

Возрастная дискриминация в IT, как IT компании продолжают отсеивать по возрасту +4

13:02

Россия глазами наших инженеров: как сервисная команда К2Тех заменила аккумуляторы в 430+ офисах по всей стране +4

09:06

Если вы думаете, что знаете, чем отличается «Expression» от «Statement», то, скорее всего, вы ошибаетесь +4

08:00

Геометрия ОТО на Python: рисуем эргосферу, черную дыру и фотонную сферу в различных метриках +4

07:20

Ловушка добавления АБГШ +4

13:01

Как избавить гравитацию от времени: теория шейп-динамики +3

10:16

Как оценить стоимость ручного поиска документов в компании на 200 человек +3

09:57

Квадриллион параметров (1Q) для LLM. Когда нам ждать такую модель? +3

11:46

Homelab для дата инженерии из игрового ПК +2

10:49

Фильтрация ТСПУ у серверов Таймвеб Cloud: диагностика, обход через reverse-proxy и СDN +59

09:00

Эхолокация: микрофон и фазированная решётка из колонок +48

19:23

7 месяцев вайбкодинга: как в одиночку делать то, что раньше требовало команду +42

14:05

Подробная история развития 2D-графики в PC +32

13:01

Не самый дешёвый суперстрат Cort G250 Spectrum +31

09:01

Как изобрели письменность? Часть 3. От египетских иероглифов к финикийскому алфавиту через синайские копи +31

09:01

От Dune II до Dune: Awakening: как менялась легендарная серия игр по «Дюне» +25

08:00

5 странных гаджетов 2026 года: смартфоны с E‑Ink, Linux‑раскладушка, наладонник и кое‑что еще +21

00:03

Детектор жизни +20

16:35

Нейронные сети нетрадиционного квантования +19

11:30

О микроводорослях, недостижимых идеалах и оплачиваемом веганами будущем +16

21:46

Тёмные паттерны: как закон в России впервые прямо запрещает манипулятивный дизайн +15

12:16

Ловушка для ума разработчика №3: почему самые надёжные инженеры остаются без поддержки +15

11:02

DroneCan. Анатомия +13

07:19

«У вас в резюме указаны навыки ИИ. Что вы имели в виду?» Что отвечать, кроме количества потраченных токенов +11

08:57

Двенадцать символов, двадцать один байт: как я научил голый RISC-V говорить «Привет, мир!» +10

07:21

Папа, мне нужен пульт: как я подключил DualSense к детской машинке +10

18:19

Стохастический клеточный автомат на системе типов +9

16:14

Делаем себе сложно +9

12:33

ИИ-агент 4 месяца дежурит на наших прод-логах: 113 алертов, 2 галлюцинации и фикс за 3,5 часа +9

19:49

Мой агент Ouroboros побил Codex с Claude Code на Terminal-Bench, OSWorld и CL-Bench. Он написал себя сам +81

12:35

Леопольд Ашенбреннер: Как 24-летний щегол заработал $30 млрд на инвестициях в AI (и потерял их вчера) +72

07:01

MicroBee — история маленького компьютера, сумевшего победить Apple +62

13:27

Находки в опенсорсе: мир питона за июль 2026 +46

13:01

Писать от руки полезно для мозга, и вот вам несколько советов +46

07:02

Последние из серверной: почему эпоха трушных сисадминов заканчивается (или только начинается) +44

09:01

Не все герои носят плащи. Некоторые носят патчкорды +36

07:05

Механический «диодный мост»? +34

06:05

Полтора месяца зависаний, ноль дампов и 44 байта нулей +34

18:10

Моя котельная +32

08:00

IaC в гибридной IT-инфраструктуре: решаем проблемы разрозненного управления с Terraform +32

10:35

Окраины городов и полукабины-призраки. Ищем последние рабочие таксофоны +31

07:05

Программируемые калькуляторы. Часть 4.1. «Лаборатория счетных машин доктора Вана. LOCI-2» +20

11:00

Как выбрать OCR в 2026-м: тестируем девять моделей на трех движках инференса на рукописном русском +19

11:00

Как выбрать OCR в 2026-м: тестируем девять моделей на трех движках инференса на рукописном русском +19

09:44

Боты уже составляют большую часть интернет-трафика. Почему это проблема не только ИБ +18

08:49

Следующая ИТ‑революция уже на пороге: как Physical AI меняет наше представление о роботах +18

08:33

Сбрасываем счетчик на принтере Epson с помощью ghidra-mcp +18

19:19

Уведомления на Android без Google: почему UnifiedPush через публичный ntfy у вас не работает +17

17:15

ИИ умеет придумывать идеи, но не умеет в них верить +15

ОБСУЖДАЕМОЕ

  • 7 месяцев вайбкодинга: как в одиночку делать то, что раньше требовало команду +42

    • 101   21000

    Леопольд Ашенбреннер: Как 24-летний щегол заработал $30 млрд на инвестициях в AI (и потерял их вчера) +72

    • 89   25000

    Фильтрация ТСПУ у серверов Таймвеб Cloud: диагностика, обход через reverse-proxy и СDN +59

    • 75   22000

    Писать от руки полезно для мозга, и вот вам несколько советов +46

    • 75   16000

    Последние из серверной: почему эпоха трушных сисадминов заканчивается (или только начинается) +44

    • 54   29000

    Мой агент Ouroboros побил Codex с Claude Code на Terminal-Bench, OSWorld и CL-Bench. Он написал себя сам +81

    • 37   16000

    Моя котельная +32

    • 37   15000

    Находки в опенсорсе: мир питона за июль 2026 +46

    • 36   11000

    Эхолокация: микрофон и фазированная решётка из колонок +48

    • 34   10000

    Уведомления на Android без Google: почему UnifiedPush через публичный ntfy у вас не работает +17

    • 33   12000

    «Оценка 300 часов? ИИ мне сделает за вечер!». Считаем тремя методами, и 300 — ниже плинтуса в индустрии +21

    • 32   7400

    Семь роутеров для гигабитного интернета: на что смотреть, кроме скорости +4

    • 31   14000

    Селлеры плакали, кололись, но продолжали торговать на маркетплейсах +5

    • 28   5600

    Механический «диодный мост»? +34

    • 28   14000

    Чтение на выходные: «Теория каст и ролей» Алекса Крола +5

    • 25   7400
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.