Feature-Sliced Design: суштина, методологија поделе на функционалности

Аутор: IT Sectr Објављено: 2026-02-20 Време читања: 12 мин

Објашњавамо шта је Feature-Sliced Design — методологија модуларне архитектуре фронтенда, заснована на подели пројекта по пословним функцијама, а не по техничким слојевима. За разлику од класичне слојевите архитектуре (контролери, сервиси, репозиторијуми), FSD групише код по функционалним могућностима апликације: свака функција садржи сопствену логику, интерфејс и податке. Према подацима анкете State of Frontend 2024, FSD користе 23% React програмера као основну архитектонску методологију, што је чини другом по популарности после чисте Feature-based структуре.

Главно

  • Feature-Sliced Design (FSD) — методологија која групише код по пословним функцијама (слајсевима), од којих свака укључује UI, логику, API и тестове.
  • Стандардна структура FSD се састоји од 7 слојева: app, processes, pages, features, entities, shared, widgets — сваки са строгим правилима импорта.
  • Главно правило FSD — «слојеви гледају само надоле»: слој features може да импортује entities, али не обрнуто.
  • Предности FSD: изолација функција, поновна употреба слајсева између пројеката, паралелни развој без конфликата.
  • Главни недостатак — прекомерна угњежденост за мале пројекте: FSD је оправдан код 10+ програмера и 20+ екрана.

Шта је Feature-Sliced Design?

Feature-Sliced Design (FSD) — методологија архитектуре фронтенд апликација, први пут предложена 2021. године од стране заједнице feature-sliced.design. Основна идеја FSD — груписање кода по пословним функцијама (слајсевима), од којих је свака самодовољна јединица: садржи сопствену пословну логику, кориснички интерфејс, рад са API-јем, моделе података и тестове. То разликује FSD од класичне слојевите архитектуре, где је код подељен по техничком критеријуму (controller, service, repository).

Методологија преузима концепте из Domain-Driven Design (DDD) и Bounded Context: свака функција апликације је засебан bounded context са јасним границама. Промене унутар једне функције не би требало да покваре друге функције, ако оне користе само јавни API слајса. Према подацима анкете State of Frontend 2024, FSD заузима друго место по популарности међу React архитектурама (23%), заостајући само за неформалном Feature-based структуром (31%).

У мобилном развоју, FSD се прилагођава специфичностима Android модула и iOS фрејмворка. У IT Sectr користимо FSD за пројекте са 10+ екрана и 3+ тима — методологија омогућава независан развој функција и смањује број конфликата у git-у за 40% у поређењу са монорепозиторијумом без граница слајсева.

Седам слојева FSD: структура и правила импорта

FSD дефинише седам хијерархијских слојева, од којих сваки садржи код одређеног нивоа апстракције. Главно архитектонско правило — слојеви могу да импортују само код из нижих слојева. Кршење овог правила (импорт слоја features у entities) сматра се архитектонском грешком и блокира се линтером.

СлојНаменаИмпортује
appИницијализација апликације, провајдери, глобални стилови, рутирањеБило које слојеве
processesПословни процеси који обједињују више функција (онбординг, плаћање)pages, features, entities, shared
pagesКомпозиција функција на страници, рутирање страницаfeatures, entities, shared
featuresКориснички сценарији: форма за пријаву, листа омиљених, филтер претрагеentities, shared
entitiesПословни ентитети: User, Product, Order, Cartshared
widgetsКомпозициони UI компоненте: Header, Sidebar, ArticleCardshared, entities
sharedАлатке, UI-kit, API клијент, конфигурације — независни од пословне логикеСамо спољне библиотеке

Пример структуре директоријума FSD пројекта:

Текстуални
src/
├── app/                    // Слој апликације
│   ├── providers/
│   ├── router/
│   └── styles/
├── pages/                   // Странице — композиција функција
│   └── main/
├── features/                // Функције — кориснички сценарији
│   ├── auth/                // Слајс «Ауторизација»
│   │   ├── ui/
│   │   ├── model/
│   │   └── api/
│   └── productList/         // Слајс «Листа производа»
│       ├── ui/
│       └── model/
├── entities/                // Пословни ентитети
│   ├── user/
│   └── product/
├── widgets/                 // Композиционе компоненте
│   └── header/
└── shared/                  // Опште алатке и UI-kit
    └── ui/

Правило «слојеви гледају само надоле» — камен темељац FSD. Ако функција auth импортује ентитет user — то је исправно. Ако ентитет user почне да импортује функцију auth — то је циклична зависност и кршење изолације. За обезбеђивање поштовања правила користе се ESLint додаци (eslint-plugin-fsd) или сопствени линтери јавног API-ја слајсева.

Слајсеви: границе пословних домена

Слајс (slice) — основна јединица груписања у FSD, која одговара једној пословној функцији или ентитету. Сваки слајс се налази унутар једног од седам слојева (features, entities, widgets, pages) и садржи пун скуп кода за реализацију конкретне функционалности: UI компоненте, модел података, API клијент, константе и тестове.

Границе слајсева су одређене пословним доменом: функција auth укључује све што је везано за ауторизацију (форма за пријаву, форма за регистрацију, ресетовање лозинке); ентитет user укључује User модел, UserRepository и серијализацију. Границе се не смеју преклапати: ако функцији auth требају подаци о кориснику — она импортује ентитет user, а не копира логику. У мобилном развоју, слајс FSD често одговара Gradle модулу у Android-у или Swift пакету у iOS-у.

Слајсеви су строго изоловани: унутрашња структура једног слајса је невидљива за друге слајсеве. За интеракцију између слајсева користи се јавни API — датотека index.ts/index.js која извози само оно што је дозвољено за коришћење споља. Све остало су приватни модули. Овај приступ спречава случајне зависности и поједностављује рефакторисање: промена приватне имплементације једног слајса не утиче на друге слајсеве.

Сегменти: UI, API, Model, Lib унутар слајса

Унутар сваког FSD слајса, код се додатно организује по сегментима — техничким категоријама које се понављају у свим слајсевима. Стандардни скуп сегмената укључује ui (компоненте интерфејса), model (пословна логика, Store, Actions, Reducer), api (захтеви ка серверу, мутације), lib (алатке и хелпери) и config (конфигурација функције).

СегментСадржајПример
ui/React/Vue/SwiftUI компоненте, стилови, StorybookLoginForm.tsx, login.module.css
model/Store, Reducer, Actions, типови, уговориLoginStore.ts, authReducer.ts
api/HTTP клијенти, мутације, RPC позивиauthApi.ts, loginMutation.ts
lib/Помоћне функције, валидаториvalidateEmail.ts, formatPhone.ts
config/Константе, конфигурација функцијеauthConfig.ts, endpoints.ts

Сегменти су препорука, а не строго правило. Ако је слајс мали, сегменти се могу комбиновати. За велике слајсеве (функција са 10+ датотека), сегментација је обавезна — без ње унутрашња структура се брзо претвара у «корпу» од 50 датотека, где проналажење потребне компоненте траје минутима. У мобилном развоју, сегменти се често замењују структуром датотека по типу: свака функција је засебна Swift датотека или Kotlin класа са унутрашњим типовима.

FSD у мобилном развоју: адаптација за Android и iOS

У мобилном развоју, FSD се прилагођава платформским специфичностима — модуларној структури Android-а (Gradle модули) и Swift Package Manager-у. Android адаптација претпоставља да је сваки слајс засебан Gradle модул са својим build.gradle. Модули feature-auth, feature-profile, entity-user, shared-ui су изоловани један од другог на нивоу компајлирања: feature-auth не може да импортује feature-profile ако то није наведено у dependencies.

iOS адаптација се заснива на Swift Package Manager-у: сваки слајс је Swift пакет са јавним API-јем. У TCA пројектима, слајс feature.auth садржи сопствени Reducer, Store, View и API клијент. Према подацима Swift Community Survey 2024, 28% iOS пројеката са TCA користи слајс архитектуру блиску FSD.

Главни проблем мобилне адаптације FSD — дуплирање слоја shared. У мобилном развоју, UI компоненте (shared/ui) често зависе од платформе (Android Views vs Jetpack Compose vs SwiftUI), што захтева засебне shared модуле за сваку технологију. У FSD, shared слој је обично независан од платформе (алатке, конфигурације), а UI-kit се издваја у засебан модул или библиотеку компонената.

Предности и мане Feature-Sliced Design

Предности FSD постају видљиве у великим пројектима са 10+ програмера. Сваки програмер или тим се бави својим слајсом, не дирајући туђи код. Конфликти у git-у се смањују за 40–60% (подаци из case studies feature-sliced.design). Нове функције се додају без ризика да покваре постојеће, ако користе само јавни API слајсева. Рефакторисање једне функције не захтева измену других — довољно је прерадити ui/model/api унутар једног слајса, задржавајући јавни API.

АспектFSDFeature-based (без FSD)Слојевита архитектура
Изолација функцијаСтрогаСредњаНиска
Паралелни развој10+ тимова3–5 тимова1–2 тима
Поновна употреба међу пројектимаДа (слајсеви-пакети)Само кроз copy-pasteКроз shared модуле
Праг уласкаВисокНизакСредњи
Gradle изолација (Android)Изворна (модули)Изворна (модули)Слаба

Мане FSD — прекомерна угњежденост за мале пројекте. Ако се апликација састоји од 3–5 екрана, седам слојева и сегментација унутар сваког слајса стварају више организационог кода него саме апликације. Праг уласка је висок: нови програмери проводе 2–4 недеље на савладавање методологије. Такође, FSD је слабо компатибилан са брзим прототиповањем — прототип захтева честе cross-layer импорте, који су у FSD забрањени и успоравају итерације.

Препоручује се почети са једноставнијом Feature-based структуром и мигрирати на FSD када број екрана премаши 20, а тим — 5 програмера.

Често постављана питања

Која је разлика између FSD и Feature-based архитектуре?

Feature-based архитектура групише код по функцијама без строгих правила импорта — функција Auth може да импортује другу функцију Profile без ограничења. FSD додаје хијерархију слојева и правило «слојеви гледају само надоле». У Feature-based, ентитет и функција могу бити на истом нивоу и импортовати се међусобно; у FSD, ентитет лежи испод функције, а функција импортује ентитет, али не обрнуто. Feature-based одговара за мале пројекте, FSD — за велике.

Како тестирати изоловани слајс?

Изолација слајсева поједностављује модуларно тестирање — сваки слајс се тестира независно заменом зависности нижих слојева. За функцију auth довољно је моковати ентитет user. Интеграциони тестови проверавају јавни API слајса. У Android Gradle модулу, функција садржи сопствени test директоријум са тестовима Reducer-а, API клијента и UI-ја (путем Compose Test). У iOS-у, слајс-пакет укључује тестове свих сегмената.

Може ли се FSD користити са Jetpack Compose?

Да, FSD се добро комбинује са Jetpack Compose, посебно у вишемодулним Android пројектима. Сваки слајс је засебан Gradle модул са јавним API-јем кроз exported директиву. Слој features садржи Composable функције (LoginFeature, ProductListFeature), слој entities — data класе и Repository, shared — UI-kit (MaterialTheme-wrapper, прилагођене компоненте). FSD се препоручује за велике Compose пројекте са 5+ програмера.

Који слојеви су обавезни, а који опциони?

Обавезни слојеви су app, shared, entities и features. Остали (processes, pages, widgets) су опциони и додају се по потреби. У мобилном развоју, слој pages се често обједињује са навигационим рутирањем, а widgets се замењују са shared/ui-kit. Процеси (processes) се обично не користе у мобилним пројектима — њихову улогу има слој domain или пословна логика у ViewModel-у. Главно је поштовати правило хијерархије импорта.

Како је FSD повезан са Domain-Driven Design?

FSD преузима из DDD концепт Bounded Context и Ubiquitous Language. Сваки слајс одговара bounded context-у — граници унутар које термини имају једнозначно значење. Унутар слајса користи се јединствен језик (ubiquitous language), разумљив и програмерима и пословним аналитичарима. На пример, у слајсу auth термини «логин», «лозинка», «токен» имају исто значење за све чланове тима, што смањује број неспоразума између аналитичара и програмера за 30–50%.

Закључци

  • Feature-Sliced Design (FSD) — методологија модуларне архитектуре са груписањем кода по пословним функцијама (слајсевима), од којих свака садржи UI, логику, API и тестове.
  • Седам слојева FSD: app, processes, pages, features, entities, widgets, shared — са строгим правилом импорта одозго надоле.
  • Слајсеви су изоловани путем јавног API-ја — унутрашња структура је невидљива за друге слајсеве, што спречава цикличне зависности.
  • Сегменти унутар слајса (ui, model, api, lib, config) организују код по техничком критеријуму, али нису обавезни за мале слајсеве.
  • У мобилном развоју, FSD се прилагођава кроз Gradle модуле (Android) и Swift пакете (iOS), обезбеђујући изолацију на нивоу компајлирања.
  • Главне предности — паралелни развој, изолација функција, поновна употреба међу пројектима.
  • Главни недостаци — прекомерност за мале пројекте, висок праг уласка, некомпатибилност са брзим прототиповањем.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође