Pull to refresh

Comments 77

Добавьте голосование чтоли=) Отдам голос за mobx

Язык схем, наверное автор комментария подразумевал Apollo, реализацию real-time подписочного backend-agnostic фреймворка, созданного изначально под graphql

Да, именно это и имел ввиду

Почитал и не понял почему стоит отказаться от Redux + Redux Toolkit в серьёзном продакшн если предположить, что команда в него уже умеет, а в Recoil нет, да и последний всё ещё в разработке.

Да, старое. Но это похоже единственный недостаток Redux. Зато хорошо поддерживаемое, стабильное и проверенное временем.

Не единственный. Redux создаёт тонны boilerplate. С эти можно бороться, если создать фабрику редьюсеров, но это ж надо сделать

Звучит как «ну чтобы нормально было, надо нормально делать». :)

Мы его ещё с reselect и immutability-helper используем.

Звучит как все настолько обленились что ищут какой-то идеальный инструмент который решил бы все их проблемы из коробки. Но думаю такого не бывает. Через год ждем статью почему я перешел с recoil на....

Не совсем. Если посмотреть на доки redux, то там именно предлагается копипастить. Не все же сразу знают про то, что бывают фабрики. По-умолчанию новичок будет именно следовать доке, т.е. безбожно попипастить.

Рекомендуемый разработчиками redux подход к его использованию, это redux-toolkit. (RTK)

Никакого бойлерплейта и лишних абстракции с акшн креэйторами там уже несколько лет нет.

В дополнение к нему есть RTK query. - симбиоз RTK и React Query.

Recoil — это не более, чем нескучный Mobx, потому что кому-то надо было Mobx, но не Mobx.


Но это похоже единственный недостаток Redux.

Редакс не умеет идиоматически описывать события — когда у вас что-то произошло, и вам просто надо сайдэффекты. В терминах редакса это всегда превращается в монстров, когда пишут в стейт какие-нибудь пустые объекты (для change detection), и запускают рендер компонентов, когда он по факту не нужен (редакс не умеет просто сообщить в реакт о факте изменения стейта, это обязательно сопровождается рендером).
Из-за этого всего неаккуратная попытка создания в редаксе сайдэффектов на какие-нибудь частые события (scroll, мыша) может очень легко отожрать весь процессор и привести к тормозам на ровном месте. При этом весь код будет написан "по заветам" официальной документации.

Минуточку, но редакс не для того. Не надо скролл в него писать.

Что значит "не для того"? Скролл так и вовсе очень легко бывает полноценной частью стейта, а не заглушкой чисто для сайдэффектов. Стейт-менеджер, в котором тут стейт, тут не стейт, а тут рыбу заворачивали?

Значит, что можно писать скролл в стейт, но нужно же ещё учитывать базовые особенности Javascript да и вообще правила хорошего тона (читай производительности).

Итак весь современный интернет тормозит. Посмотрите вокруг.

Да что далеко ходить, это форма ввода комментария, на самом специализированном сайте для разработчиков и то тормозит.

но нужно же ещё учитывать базовые особенности Javascript

А при чем тут "базовые особенности Javascript", если я могу взять тот же Mobx, минимальные знания о реакте (чтоб не запускать рендер на каждый scroll event), и у меня ничего тормозить не будет? Может, дело таки не в Javascript?
А уж если реакт исключить из уравнения, то и тем более, чтоб сделать откровенно тормозящую обработку скролла — придётся что-то особенное придумывать.

Вообще кстати (не сочтите это за персональный выпад, я это далеко не первый раз наблюдаю) очень показательно, что современные модные фронтэндеры частенько на голубом глазу заявляют что-то типа "JS тормозной, с ним нужно аккуратно!". Хотя по факту JS был очень даже неплох еще 15 лет назад, а в нынешнее время так и вовсе летает. Но обычно никто не хочет задумываться над тем, а сколько же именно кода выполняется в модных популярных библиотеках типа реакта, когда вы вроде бы почти совсем ничего не делаете.


Потому что причина "итак весь современный интернет тормозит" — она не в том, что JS медленный. Она в том, что "весь современный интернет" — он, типа, ничего особенного и не делает… ой, как это весь процессор сожрали?? Это не мы, мы ничего особенного не делаем!

Всё правильно Вы говорите, я тоже именно об этом и говорю.

Если мы говорим про современных модных фронтэндеров, то они даже не понимают как React устроен и во что компилируется их красивенький ES6 и как это работает в браузере.

В 2000-х был медленный интернет, медленные браузеры, и мало возможностей у JS, и люди писали аккуратный производительный код. То что пишут сейчас меня иногда повергает в ужас.

Ну вот тогда вы должны понимать, почему меня напрягает редакс, в котором принципиально нет человеческого способа доставить обновление стейта в компонент реакта без рендера. Способ придумать можно, но будет несколько… нечеловечески.

Толко что дошло.

А зачем доставлять стейт в компонент если не надо рендерить? Что-то мне подсказывает, что не место ему в компоненте в таком случае.

Затем, что показать в браузере вещи можно гораздо быстрее, чем это делает реакт. В некоторых случаях — в сотни и тысячи раз быстрее. При работе с вещами типа скролла это имеет первостепенное значение, и "не рендерить силами реакта" — это и в 2021 году самый распространённый момент, когда на реакт кладётся болт и руками проделываются необходимые манипуляции в DOM.


Еще лучше, конечно, просто не иметь реакта (и любых других квадратно-гнездовых библиотек и фреймворков), но в кровавом энтерпрайзе это скорее не выйдет, чем выйдет.

Зачем вам тогда Реакт-компонент?

Не стоит смешивать логику и отображение.

Не стоит смешивать реакт и нон-Реакт.

Зачем вам тогда Реакт-компонент?

Компонентная отрисовка UI (безотносительно реакта) — отлично масштабируемый подход. Поэтому если у вас интерфейс сложнее хеллоуворлд — нет никаких причин отказываться от компонентного подхода.


Не стоит смешивать логику и отображение.

Где в моих комментариях вы видите указание на смешивание логики и отображения?


Не стоит смешивать реакт и нон-Реакт.

Вежливо спрошу — сфигали?
Реакт не является цельным нерасширяемым решением для создания абсолютно любых веб-приложений.

Не стоит смешивать реакт и нон-Реакт.

Смешивать можно, эта одна из основных фич Реакта, google-map-react не даст соврать (и куча других подобных оберток). Подозреваю, что без такой возможности Реакт вообще бы не взлетел.

У меня у самого есть вопросы к реализации вычислимых полей через селекторы, равно как и использование чистых функций в языке без даже намека на ссылочную прозрачность.

Но конкретно для вашего примера сразу несколько вариантов приходит в голову

  • Просто импортировать стор в компонент вручную и вручную привязаться к стору через subscribe внутри компонента, один раз при создании компонента.

  • Написать свою обертку вокруг useSelector, которая будет принимать на вход селектор и колбек, который нужно дернуть при изменении результата селектора. Внутри обертки дергаем useSelector со вторым параметром (prev, next) => {if(prev !== next) {setTimeout(()=>callback(next))};return true}

  • Тупо мутировать стейт, но тогда не понятно как передавать информацию об изменении, и почему просто не использовать отдельный синглтон

Первые два способа может и не совсем стандартные, но вроде должны работать.

Первый способ при допиливании (отписка по анмаунту, проверка что изменилось, использование useStore вместо импорта) в итоге приведет ко второму способу плюс самостоятельная реализация почти всего useSelector :)

Я правильно понимаю, что в компоненте есть ref на какой-то внутренний элемент, и надо с этим элементом что-то делать при некоторых изменениях редуксового стора, но без перерендера самого компонента?

Угу, в общем случае картина именно такая.

Это "императивный" подход, который авторы редукса не приветствуют, потому готового хука конечно же не будет, но легко сделать свой, по описанию выше от @DarthVictor

Особенно это будет прекрасно делать без функциональных компонентов, ага.
А проекты на редаксе часто такие.

Так редакс вообще ни для чего не годится, и не годился никогда, с момента появления мертворожденная либа. Или вы не знаете что такое MobX и не пробовали его?

Ммм. Странно что миллионы продакшнов об этом утверждении не знают и успешно делают деньги на связке React + Redux.

Странно что миллионы продакшнов об этом утверждении не знают

Это у вас такое оправдание не знания? Логика «если большинство дураки, значит это норма и мне тогда зачем быть лучше» так себе, не только в профессии, а вообще в принципе по жизни.

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

Редакс не мертворожденный, а вполне успешный, неидеальный и проверенный временем проект.

Редакс не мертворожденный, а вполне успешный, неидеальный и проверенный временем проект.

Вы в каком мире живете? В каком месте он успешный? Если его кто-то там использует по сей день не говорит о том, что он успешный и не мертворожденный, это лишь выставляет их в плохом свете и диком легаси.

Неидеальный? Да куда там, он реально ущербный, без шуток. Ну это же очевидно. Если вы это не видите и по сей день используете React + Redux, то у меня для вас плохие новости.

А вот MobX реально отличная штука в рамках возможностей языка, проверенный временем проект. И сознательно его игнорировать просто смешно и абсурдно. React юзабилен только в связке с MobX'ом, в противном случае унылое Г.

Да куда там, он реально ущербный, без шуток.

Напишите, пожалуйста, хотя бы 3 проверяемых аргумента этого утверждения. Очень интересно.

Напишите, пожалуйста, хотя бы 3 проверяемых аргумента этого утверждения. Очень интересно.

1) Иммутабильность
2) Лапшекод
3) Бойлерплейт
4) Чистые функции
5) Вообще в целом большая избыточность кода, «спасибо» иммутабильности и чистым функциям.
6) Лишние перерендеры
7) Необходимость борьбы с библиотекой и подключение зоопарка в виде саг, санок, реселеков и прочей ереси.

В чистых функциях как таковых ничего плохого нет, те же компутеды в МобХ - чистые функции. Просто ФП-шники любят сооружать из этих самых функций какие-то немыслимые вещи, в которых хрен разберешься без барреля крепкого пива.

Иммутабельность тоже бывает местами удобна, просто Редукс её агрессивно навязывает там, где не надо. Лишних перерендеров в принципе можно избежать, но таки придется упарываться с реселектами и проч. Скажем так - оптимизация рендеров более дорогая, чем с МобХ.

Immutability - недостаток. Куда катится мир?

Immutability — недостаток. Куда катится мир?

Принудительный да. Во фронте все это не нужно и только мешает.

Очевидно, если такая абстракция состояния плохо решает проблемы приложения, то все же стоит рассмотреть различные альтернативы. А так, если команда знакома с этим подходом, умеет его применять и готова ко всем его ограничениям, то аргумент устаревания для библиотеки, состоящей из 5-6 функций, достаточно странно было бы рассматривать. То есть я бы вообще не стал выделять это каким-либо критерием.

Но недостатки у redux есть. Для меня это в первую очередь сложность, того пути, который он предопределяет, при совершенно неочевидной отдаче. И мне он вообще скорее видится, как нечто, что решает довольно узкий класс проблем. Нечто такое, к чему можно даже неосознанно прийти в ходе решения какой-то локальной проблемы. В глобальном плане не вижу причин сдерживать код такими ограничениями, это если рассматривать redux как один из способов комбинирования чистых функций.

Кстати про то что с ним нужно уметь работать, это с одной стороны справедливо. А с другой, как мне кажется, это может порождать некое искаженное восприятие у новичков. Так как интерфейсы редакса очень просты, и может казаться, что задача сводится к изучению этого интерфейса, плюс к изучению пары-тройки других библиотек, чтобы уж точно все уметь. Будет как минимум не очень эффективно перекладывать проблему применения инструмента на тех, кто просто не знает и не понимает как с ним работать. Сам инструмент при этом ничего не объясняет, да и не должен, и не мог бы, даже при желании.

UFO just landed and posted this here

Почему "увы"? Так хотя бы не возникает вопросов, какой стейт-манагер использовать.

Redux вещь очень хорошая, MobX вещь замечательная, но проекты у меня маленькие, на БТР за пивом в магазин не ездят, по крайней мере вне РФ. Пользуюсь Zustand. Буду благодарен за любую его критику, т.е. плохой опыт с Zustand. Чего стоит опасаться, если вы в курсе?

Проблема такая же, как и с Redux – без мемоизации лагает. В итоге код превращается в лапшу из useStore(useCallback())

Поставил минус, так как нет самого сильного стейт-менеджера - эффектора. Но в принципе не удивительно, автор не русскоязычный, у них там проблемы с СТМ - всё заполонили проекты-однодневки вроде jotai, zustand и т.д, у которых авторы популярные опенсурсеры, пиарящие друг-друга. Ну и в комментах конечно же знакомые лица - те же самые мобхсеры, что и под каждой статьей про стейт-менеджмент. Такое ощущение, что это боты и им кто-то платит за комментарии.

Поставил минус, так как нет самого сильного стейт-менеджера — эффектора.

Лол, так эта дичь ещё хуже Redux'a, казалось бы куда ещё хуже, но есть куда. Логично что его тут не.

С каждой новой подобной статьей все больше хочется перейти на Vue. Почему-то там один стейт менеджер справляется с задачами, для которых в React сообществе понапридумывали сотню стейт менеджеров и продолжают придумывать новые. Там нет избыточного и переусложненного Redux, который не нравится даже его авторам, и при этом на Vue делаются проекты любой сложности, причем быстрее.

Ходят слухи, что Vuex можно использовать и с React. Но, в любом случае, попробовать перейти на Vue.js стоит.

Как-то нет смысла использовать Vuex в React, когда для React есть довольно похожий на него MobX.

А насчет попробовать Vue.js согласен. Мало хороших компаний, где с React не используют Redux, который мне сразу же не понравился. И его уже не искоренить, т.к. им почти всем джунам забивают головы.

В наши дни существует несколько библиотек, позволяющих наладить работу с серверными кешами. Самым популярным решением такого рода является React Query

Никогда не щупал и не видел в проде, но очень много слышу про React Query.
Подскажите пожалуйста какую проблему оно решает, чтобы тащить в проект 50кб? Какая у него киллер-фича?
Пишут, что мол кеширование апи-запросов… но я как-то не могу представить случай где мне может подойти результат какого-то предыдущего 3сек давности запроса. Всегда лучше самый свежий результат.
А если в каком-то специфичном случае нужно организовать кеш — то несложно написать логику для этого.
Страница каталога со списком категорий которые фетчатся, и в футере те же самые категории, чтобы 2 раза запрос слать во время загрузки страницы, нужен какой то глобальный механизм, чтобы через ключ понять, что запрос один и тот же и не делать его одновременно.

Ммм, а зачем запросы делать из под компонентов? Делать запрос за списком категорий должен "слой", который отвечает за эти категории (слой, который ничего не знает про react). А там хоть десять компонентов пусть читают и рисуют эти категории.

Получается React Query - это 50кб-ый костыль для тех, кто делает запросы из-под каждого компонента которому нужны данные.. так что ли?..))

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

Если ваш слой отвечает за то чтобы кешировать и не запрашивать 2 раза при вызове, это значит у него есть своё состояние, а это гемор с реализацией событийной модели в этом слое и подписки реката на эти события, чтобы он знал когда состояние меняется.

50кб это в исходном виде с комментами, а в минифицированном сильно меньше

я ориентируюсь на эти данные react-query v3.19.1 ❘ Bundlephobia
50кб - это уже минифицированный. Плюс это "пережевать/распарсить" нужно.

а это гемор с реализацией событийной модели в этом слое и подписки реката на эти события, чтобы он знал когда состояние меняется.

в контексте обсуждений - mobx как раз решает весь этот "гемор".)

А как же effector ?

Так он даже хуже редакса, его стыдно в список засовывать. Вы ещё скажите, а где же XState, так это ещё на 2 порядка хуже чем redux и effector.

XState - это же не стейт-менеджер, а машина состояний

И чем он хуже редакса? Тем что не шарашит по всем компонентам на перерисовку в случае изменения данных? Тем что позволяет хранить любые данные, в том числе и инстансы классов в отличие от редакса? Ну и видимо тем, что весь необходимый код лежит в одном месте, а не в куче файлов раскиданных по всему проекту. Ну и видимо ещё тем, что эффектор код легко найти по зависимостям в коде, а редакс надо искать по магическим строковым константам? Ах да, может эффектор ещё хуже потому, что не требует дополнительных библиотек для реализации сайд эффектов?

И чем он хуже редакса?

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

А вообще они оба ущербные, просто используйте MobX (не MST, а просто MobX) и все проблемы с состоянием больше перестанут быть проблемами. Сделаете намного лучше для себя и для окружающих.

Ах да, может эффектор ещё хуже потому, что не требует дополнительных библиотек для реализации сайд эффектов?

В редаксе это тоже не обязательно, есть же функция dispatch.

Редукс - это "вариант по умолчанию". Весьма напоминает ситуацию с Интернет-эксплорером в нулевые. Самый хреновый браузер был самым используемым. Так и сейчас: на "курсах по хэтээмелю" впаривают редукс, потому что с ним много вакансий, а вакансий много, потому что большинство реактеров знают только редукс, и из-за этого его используют (ну и конечно же много старых проектов).

А где упоминания хотя-бы о Effector, MST и классику RxJS. А упоминание useState уже показатель, что статью дальше читать не стоит.

А где упоминания хотя-бы о Effector, MST и классику RxJS

Так всё это ещё хуже даже redux'a (эталона всего плохого), логично что этого нет в списке.
RxJS так вообще лютая дичь. Это эталон в мире жестоких извращений.

RxJS для событийного кода очень даже неплох. Проблема с ним в качестве стейт-менеджера — в том, что начинается натяжение совы на глобус, идиом для нормального стейт-менеджмента не хватает. Итого идёт попытка подписать абсолютно всё под потоки событий (даже то, что ими не является), и начинается жесть.

А упоминание useState уже показатель, что статью дальше читать не стоит.

useState упоминается абсолютно по делу - в кейсах, где стейт не надо хранить, где никто не прольёт слезу от его потери по анмаунту.

Страшно все же жить в мире, где каждые полгода мета меняется, только недавно я пользовался одним набором технологий, прошло несколько месяцев и уже нужно учить новый, потому что он быстрее/лучше/younameit.
Страшно все же жить в мире, где каждые полгода мета меняется

Последние 4 года вообще без изменений, React + TS + MobX полет шикарный. Все максимально актуально, быстро и тп) А вообще с реактом уже 6 лет, первые 2 года с реактом были болью и страданиями из-за redux'a, но потом узнал что такое MobX и все как рукой сняло.
Не знаю что вы там учите каждые пол года)
Zustand, Jotai как альтернатива? Чем Redux сильно отличается?

Последние годы только React + Typescript + MobX, идеальное сочетание.

Ссылка на Overmind битая, хотел глянуть что там, но не фартануло

Уже 3 года использую React + Typescript + MobX. Чем больше узнаю MobX тем больше он мне нравится. Я так и не понял зачем юзают Redux.

Я так и не понял зачем юзают Redux.

Банально из-за не знания того, что есть MobX и из-за лени просто посмотреть на него. Т.к. эта категория людей которые пришли в профессию только зарабатывать деньги, а не потому что им нравиться разрабатывать. В них нету предрасположенности к профессии, поэтому они пишут одноразовый write-only говно код, вместо того чтобы думать головой и делать вещи. Самое страшное, что для них не очевидно что они пишут говно, они думают что все правильно делают и у них хорошо получается.

На последней работе хотел все переписать на Редакс (писал на нем несколько лет), но сначала решил посмотреть как оно работает на МобХ. На редакс не стал переписывать и дела с ним иметь больше не хочу. Добавил для мобикса несколько базовых классов для разных целей: данные, страница, диалог, итд, а также общий базовый класс для поддержки иерархии и инициализации. Теперь класс состояния не требует даже конструктора, только логика и состояние и те частично в базовых классах.

Самый кайф что доступны вообще абсолютно все прелести и возможности языка, классы, функции, наследование, композиции и т.д. и т.п., никаких ограничений и рамок. Можно по настоящему делать крутые вещи.
Sign up to leave a comment.