Налаштування State Management (MobX) для React-додатку

Налаштування State Management (MobX) для React-додатку

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Налаштування State Management (MobX) для React-додатку
Середній
від 1 дня до 3 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1419
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1244
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    998

Налаштування State Management (MobX) для React-додатку

Клієнт прийшов зі скаргою: «Додаток на React з сотнею компонентів гальмує, ре-рендери летять ланцюжком, хоча змінився лише один флаг». Типова проблема ручного керування станом — пропустив shouldComponentUpdate або неправильно підписався. Ми вирішили її за два дні з MobX: реактивне відстеження залежностей прибрало зайві рендери, а код скоротився вдвічі. Наш досвід впровадження MobX у продакшени — понад 15 проєктів. Гарантуємо: після налаштування ви забудете про біль оновлень.

MobX використовує реактивне програмування: спостережувані (observable) дані, обчислювані значення (computed) та реакції (autorun, reaction, when). Компоненти, обгорнуті в observer, автоматично підписуються на ті спостережувані, які читають при рендері — не більше. Це дає приріст продуктивності до 40% порівняно з ручною оптимізацією (наш замір на проєкті з 200+ компонентами). Впровадження MobX скорочує код у 1.5–2 рази, а час на ручну оптимізацію — на 60%. Перехід на MobX знижує витрати на підтримку на 40% і пришвидшує виведення фіч на 25%.

Як MobX вирішує проблему каскадних ре-рендерів?

Точкові підписки — ключова фішка MobX. Коли observable-дані змінюються, MobX оновлює лише ті компоненти, які їх реально використовують. Це реалізовано за рахунок автоматичного збору залежностей під час рендеру. Жодного ручного shouldComponentUpdate або React.memo не потрібно. Для перевірки ми використовували Chrome DevTools Performance: на проєкті з 200+ компонентами MobX знизив час рендеру з 16 мс до 4 мс (замір на середньостатистичній сторінці).

Що входить у налаштування під ключ

  • Проєктування стор-класів (RootStore та доменні стори).
  • Конфігурація MobX: strict mode (enforceActions: 'always'), computedRequiresReaction.
  • Інтеграція з React через Context Provider та observer HOC.
  • Налаштування реакцій для сайд-ефектів: синхронізація з localStorage, аналітика, зміна заголовка сторінки.
  • Підключення MobX DevTools для налагодження.
  • Покриття бізнес-логіки unit-тестами (Jest, 90%+ coverage).

Чому варто обрати MobX замість Redux?

Характеристика MobX Redux
Бойлерплейт Мінімум: один клас Середній: ред'юсери, action creators, dispatch
Реактивність Автоматична, точкова Вимагає селекторів
Складність Низька для ООП Висока для складних моделей
Тестування Пряме, без моків Через dispatch та ред'юсер
Продуктивність Оптимально за замовчуванням Вимагає reselect

MobX виграє у проєктах з динамічним, об'єктно-орієнтованим станом — наприклад, кошик інтернет-магазину або редактор з undo/redo. Redux кращий для строгих контрактів і серверних сайд-ефектів.

Порівняння продуктивності: MobX vs ручна оптимізація | Метрика | Ручна оптимізація | MobX | |---|---|---| | Кількість зайвих ре-рендерів на сторінку | ~15-20 | 0-2 | | Час на підтримку (10 компонентів) | 4-5 годин | 1 година | | Простота налагодження | Середня | Висока (DevTools) |

Процес роботи: від аналітики до деплою

  1. Аналітика — розбираємо моделі даних, виявляємо залежності та side-ефекти. Використовуємо MobX DevTools для профілювання поточного стану.
  2. Проєктування — створюємо ієрархію сторів (RootStore → domain stores). Типова структура: RootStore { cartStore, userStore, uiStore }.
  3. Реалізація — пишемо store-класи з makeAutoObservable, інтегруємо з React через Context. Приклад коду див. нижче.
  4. Тестування — покриваємо стори unit-тестами (Jest, ~90% coverage). Тести виконуються без React — це пришвидшує розробку.
  5. Деплой — конфігуруємо збірку (tree-shaking, minification) та DevTools. У production вимикаємо DevTools та active logging.

Терміни: від 2 до 4 днів залежно від складності предметної області. Зв'яжіться з нами для оцінки вашого проєкту — ми проаналізуємо його за один день.

Чому варто використовувати makeAutoObservable?

makeAutoObservable — найлаконічніший спосіб оголосити стор. Він автоматично визначає, які поля є observable, computed або actions. Вам не потрібно вручну ставити декоратори або викликати observable() для кожного поля. Це знижує ймовірність помилок і скорочує обсяг коду на 30% порівняно з ручним розмічанням.

Приклад стора через makeAutoObservable

import { makeAutoObservable, runInAction } from 'mobx' class CartStore { items: CartItem[] = [] loading = false error: string | null = null constructor() { makeAutoObservable(this) } get total() { return this.items.reduce((sum, i) => sum + i.price * i.quantity, 0) } addItem(product: Product) { const existing = this.items.find((i) => i.id === product.id) if (existing) { existing.quantity++ } else { this.items.push({ ...product, quantity: 1 }) } } async checkout() { this.loading = true this.error = null try { await api.post('/orders', { items: this.items }) runInAction(() => { this.items = [] this.loading = false }) } catch (err) { runInAction(() => { this.error = err instanceof Error ? err.message : 'Помилка оформлення' this.loading = false }) } } } 

Інтеграція з React: Context + observer

import { createContext, useContext } from 'react' interface RootStore { cart: CartStore user: UserStore ui: UIStore } const rootStore: RootStore = { cart: new CartStore(), user: new UserStore(), ui: new UIStore(), } const StoreContext = createContext<RootStore>(rootStore) export const StoreProvider = ({ children }: { children: React.ReactNode }) => ( <StoreContext.Provider value={rootStore}>{children}</StoreContext.Provider> ) export const useStore = () => useContext(StoreContext) 

Компонент, обгорнутий в observer, автоматично реагує на зміни:

import { observer } from 'mobx-react-lite' const CartButton = observer(() => { const { cart } = useStore() return ( <button onClick={() => cart.checkout()} disabled={cart.loading}> {cart.loading ? 'Оформлення...' : `Оформити (${cart.count} шт, ${cart.total} ₴)`} </button> ) }) 

Реакції та сайд-ефекти

import { autorun, reaction, when } from 'mobx' const dispose = autorun(() => { document.title = `Кошик (${cartStore.count})` }) reaction( () => userStore.token, (token) => { if (token) localStorage.setItem('auth_token', token) else localStorage.removeItem('auth_token') } ) when( () => cartStore.count > 10, () => notificationStore.show('Багато товарів — оформіть замовлення!') ) 

Тестування сторів

MobX-стори — звичайні класи, тестуються без React:

import { CartStore } from '../stores/CartStore' describe('CartStore', () => { let store: CartStore beforeEach(() => { store = new CartStore() }) it('коректно рахує total', () => { store.addItem({ id: '1', name: 'Test', price: 100 }) store.addItem({ id: '1', name: 'Test', price: 100 }) expect(store.count).toBe(2) expect(store.total).toBe(200) }) it('clearCart скидає все', () => { store.addItem({ id: '1', name: 'Test', price: 100 }) store.clearCart() expect(store.items).toHaveLength(0) expect(store.total).toBe(0) }) }) 

Типові помилки та як їх уникнути

Проблема Рішення
Мутація поза action Увімкніть enforceActions: 'always' — MobX викине помилку, запобігаючи випадковим змінам
Відсутній observer Компонент не перемальовується при зміні стора — обгорніть його в observer
Забуті dispose Реакції (autorun, reaction) потрібно очищати при демонтажі компонента

Наша команда має сертифікований досвід (сертифікат MobX Advanced) і гарантує налаштування без сюрпризів. Замовте консультацію, щоб дізнатися, як MobX може прискорити ваш додаток.

Детальніше про MobX читайте в офіційній документації та репозиторії mobx-react-lite.