Elmagyarázzuk, mi az a Feature-Sliced Design — a frontend moduláris architektúrájának módszertana, amely a projekt üzleti funkciók szerinti felosztásán alapul, nem pedig technikai rétegek szerint. Ellentétben a klasszikus réteges architektúrával (vezérlők, szolgáltatások, adattárak), az FSD a kódot az alkalmazás funkcionális képességei szerint csoportosítja: minden funkció tartalmazza a saját logikáját, felületét és adatait. A State of Frontend 2024 felmérés adatai szerint az FSD-t a React-fejlesztők 23%-a használja elsődleges architekturális módszertanként, ami a második legnépszerűbbé teszi a tiszta Feature-based struktúra után.
Főbb pontok
Feature-Sliced Design (FSD) — a frontend alkalmazások architektúrájának módszertana, amelyet először 2021-ben javasolt a feature-sliced.design közösség. Az FSD fő gondolata — a kód csoportosítása üzleti funkciók (szeletek) szerint, amelyek mindegyike egy önellátó egység: tartalmazza a saját üzleti logikáját, felhasználói felületét, API-működését, adatmodelljeit és tesztjeit. Ez különbözteti meg az FSD-t a klasszikus réteges architektúrától, ahol a kód technikai szempont szerint van felosztva (controller, service, repository).
A módszertan a Domain-Driven Design (DDD) és a Bounded Context koncepcióit kölcsönzi: az alkalmazás minden funkciója egy külön bounded context, világos határokkal. Az egyik funkción belüli változtatások nem ronthatják el a többi funkciót, ha azok csak a szelet nyilvános API-ját használják. A State of Frontend 2024 felmérés adatai szerint az FSD a második helyen áll a népszerűségben a React architektúrák között (23%), csak az informális Feature-based struktúra (31%) előzi meg.
A mobilfejlesztésben az FSD az Android-modulok és iOS-keretrendszerek sajátosságaihoz igazodik. Az IT Sectr-ben az FSD-t 10+ képernyős és 3+ csapatos projektekhez használjuk — a módszertan lehetővé teszi a funkciók független fejlesztését, és 40%-kal csökkenti a git-konfliktusok számát a szelethatárok nélküli monorepozitóriumhoz képest.
Az FSD hét hierarchikus réteget határoz meg, amelyek mindegyike egy bizonyos absztrakciós szintű kódot tartalmaz. A fő architekturális szabály — a rétegek csak az alattuk lévő rétegekből importálhatnak kódot. Ennek a szabálynak a megsértése (a features réteg importálása entities-ben) architekturális hibának minősül, és a linter blokkolja.
| Réteg | Rendeltetés | Importál |
|---|---|---|
| app | Alkalmazás inicializálása, szolgáltatók, globális stílusok, útválasztás | Bármilyen réteget |
| processes | Több funkciót összekötő üzleti folyamatok (bevezetés, fizetés) | pages, features, entities, shared |
| pages | Funkciók kompozíciója az oldalon, oldalútválasztás | features, entities, shared |
| features | Felhasználói forgatókönyvek: bejelentkezési űrlap, kedvencek lista, keresési szűrő | entities, shared |
| entities | Üzleti entitások: User, Product, Order, Cart | shared |
| widgets | UI kompozíciós komponensek: Header, Sidebar, ArticleCard | shared, entities |
| shared | Segédprogramok, UI-kit, API-kliens, konfigurációk — üzleti logikától független | Csak külső könyvtárak |
Példa egy FSD-projekt könyvtárszerkezetére:
src/
├── app/ // Alkalmazás rétege
│ ├── providers/
│ ├── router/
│ └── styles/
├── pages/ // Oldalak — funkciók kompozíciója
│ └── main/
├── features/ // Funkciók — felhasználói forgatókönyvek
│ ├── auth/ // Hitelesítés szelet
│ │ ├── ui/
│ │ ├── model/
│ │ └── api/
│ └── productList/ // Terméklista szelet
│ ├── ui/
│ └── model/
├── entities/ // Üzleti entitások
│ ├── user/
│ └── product/
├── widgets/ // Kompozíciós komponensek
│ └── header/
└── shared/ // Általános segédprogramok és UI-kit
└── ui/A rétegek csak lefelé néznek szabály — az FSD sarokköve. Ha az auth funkció importálja a user entitást — ez helyes. Ha a user entitás elkezdi importálni az auth funkciót — ez ciklikus függőség és az elkülönítés megsértése. A szabály betartásának biztosításához ESLint-bővítményeket (eslint-plugin-fsd) vagy a szeletek nyilvános API-jának saját lintjeit használják.
A szelet (slice) — az FSD alapvető csoportosítási egysége, amely egy üzleti funkciónak vagy entitásnak felel meg. Minden szelet a hét réteg egyikében (features, entities, widgets, pages) található, és tartalmazza a teljes kódkészletet egy adott funkció megvalósításához: UI-komponensek, adatmodell, API-kliens, konstansok és tesztek.
A szeletek határait az üzleti tartomány határozza meg: az auth funkció magában foglal mindent, ami a hitelesítéssel kapcsolatos (bejelentkezési űrlap, regisztrációs űrlap, jelszó-visszaállítás); a user entitás magában foglalja a User modellt, UserRepository-t és a szerializációt. A határok nem fedhetik egymást: ha az auth funkciónak felhasználói adatokra van szüksége — importálja a user entitást, nem másolja a logikát. A mobilfejlesztésben az FSD szelet gyakran egy Gradle-modulnak felel meg Androidon vagy egy Swift-csomagnak iOS-en.
A szeletek szigorúan elkülönülnek: egy szelet belső szerkezete láthatatlan a többi szelet számára. A szeletek közötti interakcióhoz a nyilvános API-t használják — az index.ts/index.js fájlt, amely csak azt exportálja, amit kívülről szabad használni. Minden más privát modul. Ez a megközelítés megakadályozza a véletlen függőségeket és leegyszerűsíti a refaktorálást: egy szelet privát megvalósításának megváltoztatása nem érinti a többi szeletet.
Minden FSD szeleten belül a kód további szegmensek szerint van szervezve — technikai kategóriák, amelyek minden szeletben ismétlődnek. A szabványos szegmenscsoport tartalmazza: ui (felületi komponensek), model (üzleti logika, Store, Actions, Reducer), api (szerverkérelmek, mutációk), lib (segédprogramok és helperek) és config (funkció konfigurációja).
| Szegmens | Tartalom | Példa |
|---|---|---|
| ui/ | React/Vue/SwiftUI komponensek, stílusok, Storybook | LoginForm.tsx, login.module.css |
| model/ | Store, Reducer, Actions, típusok, szerződések | LoginStore.ts, authReducer.ts |
| api/ | HTTP-kliens, mutációk, RPC-hívások | authApi.ts, loginMutation.ts |
| lib/ | Segédfüggvények, érvényesítők | validateEmail.ts, formatPhone.ts |
| config/ | Konstansok, funkció konfigurációja | authConfig.ts, endpoints.ts |
A szegmensek ajánlások, nem szigorú szabályok. Ha a szelet kicsi, a szegmensek összevonhatók. Nagy szeleteknél (10+ fájlos funkció) a szegmentálás kötelező — enélkül a belső struktúra gyorsan egy 50 fájlos kosárrá válik, ahol a szükséges komponens megtalálása percekig tart. A mobilfejlesztésben a szegmenseket gyakran fájlszerkezet váltja fel típus szerint: minden funkció egy külön Swift-fájl vagy Kotlin-osztály belső típusokkal.
A mobilfejlesztésben az FSD a platform-specifikus jellemzőkhöz igazodik — az Android moduláris szerkezetéhez (Gradle-modulok) és a Swift Package Manager-hez. Android-adaptáció feltételezi, hogy minden szelet egy külön Gradle-modul a saját build.gradle fájljával. A feature-auth, feature-profile, entity-user, shared-ui modulok fordítási szinten el vannak különítve egymástól: a feature-auth nem importálhatja a feature-profile-t, ha az nincs megadva a dependencies-ben.
iOS-adaptáció a Swift Package Manager-en alapul: minden szelet egy Swift-csomag nyilvános API-val. A TCA-projektekben a feature.auth szelet tartalmazza a saját Reducer-t, Store-t, View-t és API-klienst. A Swift Community Survey 2024 adatai szerint a TCA-val rendelkező iOS-projektek 28%-a az FSD-hez közeli szeletarchitektúrát használ.
A mobil FSD-adaptáció fő problémája — a shared réteg duplikálása. A mobilfejlesztésben az UI-komponensek (shared/ui) gyakran platformfüggők (Android Views vs Jetpack Compose vs SwiftUI), ami külön shared-modulokat igényel minden technológiához. Az FSD-ben a shared réteg általában platformfüggetlen (segédprogramok, konfigurációk), az UI-kit pedig külön modulba vagy komponenskönyvtárba kerül.
Előnyök Az FSD előnyei nagy, 10+ fejlesztős projektekben válnak láthatóvá. Minden fejlesztő vagy csapat a saját szeletével foglalkozik, nem nyúl mások kódjához. A git-konfliktusok 40–60%-kal csökkennek (feature-sliced.design esettanulmányok adatai). Új funkciók a meglévők elrontásának kockázata nélkül adhatók hozzá, ha csak a szeletek nyilvános API-ját használják. Egy funkció refaktorálása nem igényli mások módosítását — elég átírni az ui/model/api-t egy szeleten belül, megtartva a nyilvános API-t.
| Szempont | FSD | Feature-based (FSD nélkül) | Réteges architektúra |
|---|---|---|---|
| Funkciók elkülönítése | Szigorú | Közepes | Alacsony |
| Párhuzamos fejlesztés | 10+ csapat | 3–5 csapat | 1–2 csapat |
| Újrahasználat projektek között | Igen (szelet-csomagok) | Csak copy-paste útján | Shared-modulokon keresztül |
| Belépési küszöb | Magas | Alacsony | Közepes |
| Gradle-elkülönítés (Android) | Natív (modulok) | Natív (modulok) | Gyenge |
Hátrányok Az FSD hátránya — túlzott egymásba ágyazás kis projekteknél. Ha az alkalmazás 3–5 képernyőből áll, hét réteg és szegmentálás minden szeleten belül több szervezési kódot hoz létre, mint maga az alkalmazás. A belépési küszöb magas: az új fejlesztők 2–4 hetet töltenek a módszertan elsajátításával. Az FSD rosszul kompatibilis a gyors prototípuskészítéssel is — a prototípus gyakori cross-layer importálást igényel, ami az FSD-ben tilos és lassítja az iterációkat.
Ajánlott egyszerűbb Feature-based struktúrával kezdeni, és FSD-re migrálni, amikor a képernyők száma meghaladja a 20-at, a csapat pedig az 5 fejlesztőt.
Gyakran Ismételt Kérdések
A Feature-based architektúra a kódot funkciók szerint csoportosítja szigorú importálási szabályok nélkül — az Auth funkció importálhatja a másik Profile funkciót korlátozás nélkül. Az FSD hozzáadja a rétegek hierarchiáját és a rétegek csak lefelé néznek szabályt. A Feature-based-ben az entitás és a funkció egy szinten lehetnek és importálhatják egymást; az FSD-ben az entitás a funkció alatt van, és a funkció importálja az entitást, de fordítva nem. A Feature-based kis projektekhez, az FSD nagy projektekhez való.
A szeletek elkülönítése leegyszerűsíti a moduláris tesztelést — minden szelet függetlenül tesztelhető az alsóbb rétegek függőségeinek helyettesítésével. Az auth funkcióhoz elég mockolni a user entitást. Az integrációs tesztek ellenőrzik a szelet nyilvános API-ját. Az Android Gradle-modulban a funkció tartalmazza a saját test könyvtárát a Reducer, API-kliens és UI tesztjeivel (Compose Test segítségével). iOS-ben a szelet-csomag tartalmazza az összes szegmens tesztjeit.
Igen, az FSD jól kombinálható a Jetpack Compose-szal, különösen többmodulos Android-projektekben. Minden szelet egy külön Gradle-modul nyilvános API-val az exported direktíván keresztül. A features réteg Composable funkciókat (LoginFeature, ProductListFeature), az entities réteg adatosztályokat és Repository-t, a shared pedig UI-kit-et (MaterialTheme-wrapper, egyéni komponensek) tartalmaz. Az FSD nagy Compose-projektekhez ajánlott 5+ fejlesztővel.
A kötelező rétegek: app, shared, entities és features. A többi (processes, pages, widgets) opcionális, és szükség szerint adható hozzá. A mobilfejlesztésben a pages réteget gyakran összevonják a navigációs útválasztással, a widgets-t pedig shared/ui-kit helyettesíti. A folyamatok (processes) általában nem használatosak mobil projektekben — szerepüket a domain réteg vagy a ViewModel üzleti logikája tölti be. A legfontosabb az importálási hierarchia szabályának betartása.
Az FSD a DDD-től kölcsönzi a Bounded Context és Ubiquitous Language koncepcióját. Minden szelet egy bounded context-nek felel meg — egy olyan határnak, amelyen belül a kifejezések egyértelmű jelentéssel bírnak. A szeleten belül egységes nyelvet (ubiquitous language) használnak, amely érthető a fejlesztők és az üzleti elemzők számára is. Például az auth szeletben a bejelentkezés, jelszó, token kifejezések ugyanazt jelentik a csapat minden tagja számára, ami 30–50%-kal csökkenti a félreértések számát az elemzők és a fejlesztők között.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is