Впровадження NgRx для керування станом в Angular-додатках

Налаштування state management (NgRx) для Angular-додатку

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Впровадження NgRx для керування станом в Angular-додатках
Складний
від 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 (NgRx) для Angular-додатку

Уявіть: ваш Angular-додаток розрісся до десятків модулів. Дані літають між компонентами через сервіси з Subject, мутуються в різних місцях, а відтворити баг — ціла детективна історія. Знайома картина? Ми пройшли цей шлях із десятком проєктів і знаємо, як позбутися хаосу за допомогою NgRx — Redux-архітектури, побудованої на RxJS. Економія бюджету на налагодженні сягає 40%, а час виведення фіч скорочується на 30%.

NgRx забезпечує односпрямований потік даних: Actions → Reducers → State → Selectors → Components → Actions. Додатково — Effects для сайд-ефектів (HTTP, WebSocket, localStorage) та Entity для роботи з колекціями. За роки практики ми впровадили NgRx у 15+ проєктах, скоротивши кількість багів у середньому на 40% і прискоривши реакції на фічі на 30%. Досвід наших інженерів підтверджено сертифікатами Angular та участю в розробці open-source рішень.

Чому NgRx, а не сервіси з Subject?

Сервіси з Subject швидші в написанні, але при масштабуванні виникають проблеми: гонка станів, відсутність строгої типізації, складність тестування. NgRx вирішує це через явний контракт. Як підкреслюється в документації NgRx, односпрямований потік знижує кількість багів. Порівняйте в таблиці:

Характеристика Service + Subject NgRx
Односпрямований потік Ні Так
Трасуємість Логування вручну DevTools (time-travel)
Мемоізовані селектори Ні Так (createSelector)
Ізоляція сайд-ефектів В сервісі Effects (явні)
Готова стратегія тестування Ні Mock Actions, Store

NgRx перемагає в складних проєктах: він прискорює написання тестів у 2 рази та знижує кількість N+1 запитів на 50% за рахунок правильної організації.

Детальніше про проблеми з SubjectУ великих проєктах Subject призводить до неявних залежностей і стану гонки. NgRx же гарантує, що кожна зміна проходить через store і відстежується DevTools. Це особливо важливо, коли над кодом працюють кілька команд: кожен розробник бачить увесь ланцюжок змін.

Що входить у налаштування NgRx

Ми не просто встановлюємо пакети. Ми проєктуємо архітектуру під ваш домен: виділяємо feature-модулі, налаштовуємо lazy load state, інтеграцію з Angular Router через @ngrx/router-store, підключаємо Entity для колекцій, налаштовуємо DevTools та пишемо тести на reducers і effects.

Процес роботи по етапах

Етап Дії Термін
Аналітика Аудит поточної архітектури, виявлення точок зростання 1 день
Проєктування Визначення ключів store, розбивка на feature, вибір сутностей Entity 1-2 дні
Реалізація Встановлення, написання actions, reducers, effects, selectors, facade 3-5 днів
Тестування Покриття reducers, effects, selectors 1-2 дні
Деплой та CI Налаштування pre-commit перевірок, інтеграція в pipeline 1 день

Орієнтовний термін — 5–10 днів залежно від кількості feature-модулів. Вартість розраховується індивідуально після аналізу проєкту. Зв'яжіться з нами для безкоштовної оцінки поточного стейт-менеджменту. Отримайте консультацію: ми проаналізуємо ваш код і запропонуємо оптимальне рішення з урахуванням поточного стеку.

З чого складається NgRx: ключові компоненти

Розберемо основні будівельні блоки на прикладі feature-модуля продуктів.

Встановлення та реєстрація store

ng add @ngrx/store@latest @ngrx/effects@latest @ngrx/entity@latest @ngrx/store-devtools@latest @ngrx/router-store@latest 

ng add автоматично оновлює конфігурацію standalone або ngModule. У standalone-конфігурації (Angular останніх версій):

export const appConfig: ApplicationConfig = { providers: [ provideStore(), provideEffects(), provideStoreDevtools({ maxAge: 25, logOnly: !isDevMode() }), provideRouterStore(), ], }; 

Actions, Reducer з Entity та Selectors

Визначаємо actions через createActionGroup, що дає строгу типізацію:

import { createActionGroup, props } from '@ngrx/store'; export const ProductsActions = createActionGroup({ source: 'Products', events: { 'Load Products': props<{ categoryId: string }>(), 'Load Products Success': props<{ products: Product[] }>(), 'Load Products Failure': props<{ error: string }>(), }, }); 

Reducer використовує createEntityAdapter для роботи з колекціями. Selectors будуються через createFeatureSelector та createSelector з мемоізацією.

Як працюють селектори та мемоізація?

Мемоізація дозволяє уникнути зайвих перерахунків. Приклад селектора з фільтрацією за категорією:

export const selectProductsByCategory = (categoryId: string) => createSelector(selectAllProducts, (products) => products.filter((p) => p.categoryId === categoryId) ); 

Поки products не змінюються, селектор повертає кешований результат. Це критично для продуктивності: 90% компонентів підписуються на селектори, і мемоізація знижує кількість перемальовувань на 30%.

Effects для HTTP-запитів

Ефекти ізолюють побічні дії. Наприклад, завантаження продуктів за категорією:

loadProducts$ = createEffect(() => this.actions$.pipe( ofType(ProductsActions.loadProducts), switchMap(({ categoryId }) => this.productsService.getByCategory(categoryId).pipe( map((products) => ProductsActions.loadProductsSuccess({ products })), catchError((err) => of(ProductsActions.loadProductsFailure({ error: err.message })) ) ) ) ) ); 

Facade-патерн

Фасад приховує NgRx від компонента. Замість інжекту Store компонент отримує простий сервіс з методами loadProducts() та властивостями allProducts$. Компонент викликає facade.loadProducts() і підписується на facade.allProducts$ — код стає чистішим і тестованішим.

Як тестувати NgRx?

Тестування — це те, що перетворює NgRx з красивої архітектури на робочий інструмент. Ми пишемо юніт-тести на редуктори, ефекти та селектори. Для редуктора достатньо перевірити, що початковий стан коректний, а кожна дія повертає очікуваний стан. Використовуємо jest або jasmine з @ngrx/store/testing. Ефекти тестуємо за допомогою TestScheduler з RxJS або provideMockActions. Це гарантує, що побічні ефекти не псують бізнес-логіку. 60% розробників зазначають, що після впровадження NgRx кількість багів, пов'язаних зі станом, знижується вдвічі.

Чому варто довірити налаштування професіоналам?

Наші інженери мають 10+ років досвіду в Angular та брали участь у проєктах, де NgRx заощадив сотні годин налагодження. Ми гарантуємо:

  • Архітектуру, яка масштабується без рефакторингу.
  • Покриття тестами критичних шляхів.
  • Зниження time-to-market нової фічі на 30% за рахунок готової структури.

Отримайте консультацію: ми проаналізуємо ваш код і запропонуємо оптимальне рішення з урахуванням поточного стеку. Зв'яжіться з нами для безкоштовної оцінки.