Feature-Sliced Design: lényeg, a funkciókra bontás módszertana

Szerző: IT Sectr Megjelenés: 2026-02-20 Olvasási idő: 12 perc

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) — módszertan, amely a kódot üzleti funkciók (szeletek) szerint csoportosítja, mindegyik tartalmaz UI-t, logikát, API-t és teszteket.
  • Az FSD szabványos struktúrája 7 rétegből áll: app, processes, pages, features, entities, shared, widgets — mindegyik szigorú importálási szabályokkal.
  • Az FSD fő szabálya — a rétegek csak lefelé néznek: a features réteg importálhat entities-t, de fordítva nem.
  • Az FSD előnyei: a funkciók elkülönítése, a szeletek újrahasználata projektek között, párhuzamos fejlesztés konfliktusok nélkül.
  • Fő hátrány — túlzott egymásba ágyazás kis projekteknél: az FSD 10+ fejlesztő és 20+ képernyő esetén indokolt.

Mi az a Feature-Sliced Design?

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 rétege: struktúra és importálási szabályok

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étegRendeltetésImportál
appAlkalmazás inicializálása, szolgáltatók, globális stílusok, útválasztásBármilyen réteget
processesTöbb funkciót összekötő üzleti folyamatok (bevezetés, fizetés)pages, features, entities, shared
pagesFunkciók kompozíciója az oldalon, oldalútválasztásfeatures, entities, shared
featuresFelhasználói forgatókönyvek: bejelentkezési űrlap, kedvencek lista, keresési szűrőentities, shared
entitiesÜzleti entitások: User, Product, Order, Cartshared
widgetsUI kompozíciós komponensek: Header, Sidebar, ArticleCardshared, entities
sharedSegédprogramok, UI-kit, API-kliens, konfigurációk — üzleti logikától függetlenCsak külső könyvtárak

Példa egy FSD-projekt könyvtárszerkezetére:

Szöveges
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.

Szeletek: az üzleti tartományok határai

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.

Szegmensek: UI, API, Model, Lib a szeleten belül

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).

SzegmensTartalomPélda
ui/React/Vue/SwiftUI komponensek, stílusok, StorybookLoginForm.tsx, login.module.css
model/Store, Reducer, Actions, típusok, szerződésekLoginStore.ts, authReducer.ts
api/HTTP-kliens, mutációk, RPC-hívásokauthApi.ts, loginMutation.ts
lib/Segédfüggvények, érvényesítőkvalidateEmail.ts, formatPhone.ts
config/Konstansok, funkció konfigurációjaauthConfig.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.

FSD a mobilfejlesztésben: adaptáció Androidra és iOS-re

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.

A Feature-Sliced Design előnyei és hátrányai

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.

SzempontFSDFeature-based (FSD nélkül)Réteges architektúra
Funkciók elkülönítéseSzigorúKözepesAlacsony
Párhuzamos fejlesztés10+ csapat3–5 csapat1–2 csapat
Újrahasználat projektek közöttIgen (szelet-csomagok)Csak copy-paste útjánShared-modulokon keresztül
Belépési küszöbMagasAlacsonyKö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

Mi a különbség az FSD és a Feature-based architektúra között?

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ó.

Hogyan teszteljünk egy elkülönített szeletet?

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.

Használható az FSD Jetpack Compose-szal?

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.

Mely rétegek kötelezőek és melyek opcionálisak?

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.

Hogyan kapcsolódik az FSD a Domain-Driven Design-hoz?

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

  • Feature-Sliced Design (FSD) — moduláris architektúra módszertan a kód üzleti funkciók (szeletek) szerinti csoportosításával, mindegyik tartalmaz UI-t, logikát, API-t és teszteket.
  • Az FSD hét rétege: app, processes, pages, features, entities, widgets, shared — szigorú importálási szabállyal fentről lefelé.
  • A szeletek nyilvános API-n keresztül elkülönülnek — a belső struktúra láthatatlan a többi szelet számára, megakadályozva a ciklikus függőségeket.
  • A szeleten belüli szegmensek (ui, model, api, lib, config) technikai szempont szerint szervezik a kódot, de kis szeleteknél nem kötelezőek.
  • A mobilfejlesztésben az FSD Gradle-modulokon (Android) és Swift-csomagokon (iOS) keresztül adaptálódik, biztosítva az elkülönítést fordítási szinten.
  • Fő előnyök — párhuzamos fejlesztés, funkciók elkülönítése, újrahasználat projektek között.
  • Fő hátrányok — túlzott méret kis projekteknél, magas belépési küszöb, nem kompatibilis a gyors prototípuskészítéssel.

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.

Projekt megbeszélése

Olvassa el is