Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Интересно ваше мнение об effector
Автоматика — это хорошо, особенно, если вы делайте одноразовый, быстрый проект, который после релиза уйдет в пыльный ящик или будет поддерживаться небольшой командой. Но если вы разрабатываете более крупный проект, над котором работают смеженные команды, то от всей этой архитектурной свободы вы скорее всего получите максимум боли… Иной раз вы потратите не один час, чтобы понять, что откуда тянется.
Боже откуда вы только берете такие мысли, сразу видно тех кто никогда не юзал MobX на реальном проекте в бою, однако ещё заключения какие-то умудряются делать.
Если есть MobX который на порядок лучше абсолютно по всем параметрам всех redux-like поделок и redux'a.
Я честно говоря, не понимаю, зачем нужно сравнивать «пассатижи» c «плоскогубцами».
Каждый инструмент по-своему хорош.
Тут вы неправы… По воле судьбы я сейчас работаю на проекте завязанном, на Mobx, в котором принимают участия более 5 смежных команд.
И поверьте то что я написал, я взял не из своей бурной фантазии.
Вы никогда не потратите час другой чтобы что-то понять, потому что там все абсолютно прямо и просто. Там просто невозможно не понять что откуда берется и что когда изменяется. Импортируешь экземпляр стора и просто читаешь его свойства и вызываешь его методы. В чем тут может быть сложность и непонятность??
Но если вы разрабатываете более крупный проект, над котором работают смежные команды, то от всей этой архитектурной свободы вы скорее всего получите максимум болиНе понимаю зачем включать в статью голословные заявления и объяснять это субъективным мнением. Мнение без аргументов бесполезно и вредно. Касательно вашего примера — какой смысл разделять стор от экшенов? Зачем прокидывать экшны в аргументы observer? Что за странная конвенция импортировать connect как adapter и добавлять его в массив middleware? У вас стор импортируется из модуля инициализированный, как мне создать 2 инстанса стора (пример — 2 независимых инстанса duck)? Как написать юнит-тест на стор, не сбрасывая его состояние перед каждым тестом? Напоминаю, что импорт из модуля делает стор синглтоном. Почему экшн duckQuack переименовался в setQuack? При чтении кода возникают регулярные WTF, которые не возникают при чтении кода на Mobx:
const createDuck = () => {
return makeAutoObservable({
value: '',
swim() {
this.value = 'duck swims'
},
fly() {
this.value = 'duck flews'
},
quack() {
this.value = 'duck quacks'
}
})
}
const App = observer(() => {
const [duck] = useState(createDuck);
return (
<div className='DuckWrapper'>
<p>action: {duck.value}</p>
<button onClick={duck.quack}>Duck quacks</button>
</div>
)
})
Не понимаю зачем включать в статью голословные заявления и объяснять это субъективным мнением.
Какой смысл разделять стор от экшенов?
Зачем прокидывать экшны в аргументы observer?
Что за странная конвенция импортировать connect как adapter и добавлять его в массив middleware?
У вас стор импортируется из модуля инициализированный, как мне создать 2 инстанса стора (пример — 2 независимых инстанса duck)?
Как написать unit-test на store, не сбрасывая его состояние перед каждым тестом?
Почему экшн duckQuack переименовался в setQuack?
чем больше есть возможностей декомпозиции тем лучше.Код более поддерживаемый когда он имеет не только низкую связанность (coupling), но и высокую связность (cohesion): medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6
Если вы подробно ознакомитесь с паттерном проектирования observer, то поймете что явное указание подписчиков в слушателе является более правильной практикой.Там пример для бекенда и там ни слова о том, что это более правильная практика — на бекенде по-другому нельзя. На фронте можно вычислять зависимости изменяемых значений через прокси. Именно благодаря им Mobx и запоминает какие компоненты от каких изменяемых значений зависят. Подход называется Transparent Reactive Programming: github.com/mobxjs/mobx/wiki/Mobx-vs-Reactive-Stream-Libraries-(RxJS,-Bacon,-etc)/
Ручная подписка на определенные состояния помогает избежать незапланированных перерисовок компонента.Ручная подписка как раз может привести к незапланированным перерисовкам компонента, например вы удалили стор из компонента, но забыли удалить его из списка зависимостей у функции observer. У Transparent Reactive Programming этой проблемы нет.
А зачем? Что бы ваш код было сложней поддерживать?Нет, 2 и более инстанса стора — вполне частая ситуация. Простой пример — сделайте 2 счётчика на странице, независимых, но с одинаковой логикой и без копипаста кода. В Mobx это 2 разных инстанса одного и того же класса.
Зачем имплементировать встроенный state-managment React совместно со стейт-машиной mobxuseState здесь это простой способ сохранения значения между перерисовками. Лишь один из способов использовать Mobx. Встроенный хук useLocalObservable делает тоже самое: github.com/mobxjs/mobx/blob/main/packages/mobx-react-lite/src/useLocalObservable.ts#L8
но ваш store предоставляет мутабельное поле value во внешний мир, Нарушая принцип инкапсуляции.Это поле никто извне поменять не сможет — Mobx в строгом режиме (по умолчанию в версии 6) запретит изменять его вне экшнов. Ещё никто не мешает создать класс с приватным свойством. Для простого примера это было лишнее.
Biscuit-store — еще один взгляд на state-management в JavaScript приложениях