Feature-Sliced Design : essence et méthodologie de division par features

Auteur : IT Sectr Publié le : 2026-02-20 Temps de lecture : 12 min

Nous expliquons ce qu'est Feature-Sliced Design — une méthodologie d'architecture modulaire frontend basée sur la division du projet par fonctionnalités métier plutôt que par couches techniques. Contrairement à l'architecture classique en couches (contrôleurs, services, repositories), FSD regroupe le code par capacités fonctionnelles de l'application : chaque feature contient sa propre logique, interface utilisateur et données. Selon l'enquête State of Frontend 2024, 23% des développeurs React utilisent FSD comme méthodologie d'architecture principale, ce qui en fait la deuxième plus populaire après la structure purement Feature-based.

Points clés

  • Feature-Sliced Design (FSD) — méthodologie qui regroupe le code par fonctionnalités métier (slices), chacun incluant UI, logique, API et tests.
  • La structure standard de FSD se compose de 7 couches : app, processes, pages, features, entities, shared, widgets — chacune avec des règles d'importation strictes.
  • La règle principale de FSD — « les couches regardent uniquement vers le bas » : la couche features peut importer entities, mais pas l'inverse.
  • Avantages de FSD : isolation des features, réutilisation des slices entre projets, développement parallèle sans conflits.
  • Principal inconvénient — imbrication excessive pour les petits projets : FSD se justifie avec 10+ développeurs et 20+ écrans.

Qu'est-ce que Feature-Sliced Design ?

Feature-Sliced Design (FSD) est une méthodologie d'architecture d'applications frontend proposée pour la première fois en 2021 par la communauté feature-sliced.design. L'idée centrale de FSD est de regrouper le code par fonctionnalités métier (slices), chacune étant une unité autonome : elle contient sa propre logique métier, interface utilisateur, interaction API, modèles de données et tests. Cela distingue FSD de l'architecture classique en couches où le code est divisé par critères techniques (controller, service, repository).

La méthodologie emprunte des concepts du Domain-Driven Design (DDD) et du Bounded Context : chaque feature de l'application est un bounded context séparé avec des limites claires. Les modifications à l'intérieur d'une feature ne doivent pas casser d'autres features si elles utilisent uniquement l'API publique du slice. Selon l'enquête State of Frontend 2024, FSD occupe la deuxième place en popularité parmi les architectures React (23%), juste derrière la structure informelle Feature-based (31%).

Dans le développement mobile, FSD s'adapte aux spécificités des modules Android et des frameworks iOS. Chez IT Sectr, nous utilisons FSD pour les projets avec 10+ écrans et 3+ équipes — la méthodologie permet de développer les features indépendamment et réduit les conflits git de 40% par rapport à un monorepo sans limites de slices.

Sept couches de FSD : structure et règles d'importation

FSD définit sept couches hiérarchiques, chacune contenant du code d'un certain niveau d'abstraction. La règle architecturale principale est que les couches ne peuvent importer que du code provenant de couches inférieures. Violer cette règle (importer la couche features dans entities) est considéré comme une erreur architecturale et est bloqué par un linter.

CoucheObjectifImporte
appInitialisation de l'application, fournisseurs, styles globaux, routageToutes les couches
processesProcessus métier combinant plusieurs features (onboarding, paiement)pages, features, entities, shared
pagesComposition de features sur une page, routage de pagesfeatures, entities, shared
featuresScénarios utilisateur : formulaire de connexion, liste de favoris, filtre de rechercheentities, shared
entitiesEntités métier : User, Product, Order, Cartshared
widgetsComposants UI composites : Header, Sidebar, ArticleCardshared, entities
sharedUtilitaires, UI-kit, client API, configurations — indépendant de la logique métierUniquement bibliothèques externes

Exemple de structure de répertoire d'un projet FSD :

Texte
src/
├── app/                    // Couche application
│   ├── providers/
│   ├── router/
│   └── styles/
├── pages/                   // Pages — composition de features
│   └── main/
├── features/                // Features — scénarios utilisateur
│   ├── auth/                // Slice « Authentification »
│   │   ├── ui/
│   │   ├── model/
│   │   └── api/
│   └── productList/         // Slice « Liste de produits »
│       ├── ui/
│       └── model/
├── entities/                // Entités métier
│   ├── user/
│   └── product/
├── widgets/                 // Composants composites
│   └── header/
└── shared/                  // Utilitaires partagés et UI-kit
    └── ui/

La règle « les couches regardent uniquement vers le bas » est la pierre angulaire de FSD. Si feature auth importe entity user — c'est correct. Si entity user commence à importer feature auth — c'est une dépendance cyclique et une violation de l'isolation. Pour garantir cette règle, des plugins ESLint (eslint-plugin-fsd) ou des linters personnalisés de l'API publique des slices sont utilisés.

Slices : limites des domaines métier

Slice — l'unité principale de regroupement dans FSD, correspondant à une feature ou entité métier. Chaque slice réside dans l'une des sept couches (features, entities, widgets, pages) et contient un ensemble complet de code pour implémenter une fonctionnalité spécifique : composants UI, modèle de données, client API, constantes et tests.

Les limites des slices sont définies par le domaine métier : feature auth inclut tout ce qui concerne l'autorisation (formulaire de connexion, formulaire d'inscription, réinitialisation de mot de passe) ; entity user inclut le modèle User, UserRepository et la sérialisation. Les limites ne doivent pas se chevaucher : si feature auth a besoin de données utilisateur — il importe entity user plutôt que de dupliquer la logique. Dans le développement mobile, un slice FSD correspond souvent à un module Gradle dans Android ou un package Swift dans iOS.

Les slices sont strictement isolés : la structure interne d'un slice est invisible pour les autres slices. Pour l'interaction entre slices, une API publique est utilisée — un fichier index.ts/index.js qui exporte uniquement ce qui est autorisé à l'utilisation externe. Tout le reste sont des modules privés. Cette approche empêche les dépendances accidentelles et simplifie le refactoring : modifier l'implémentation privée d'un slice n'affecte pas les autres slices.

Segments : UI, API, Model, Lib à l'intérieur d'un slice

À l'intérieur de chaque slice FSD, le code est en outre organisé par segments — des catégories techniques qui se répètent dans tous les slices. L'ensemble standard de segments inclut ui (composants d'interface), model (logique métier, Store, Actions, Reducer), api (requêtes serveur, mutations), lib (utilitaires et helpers) et config (configuration de la feature).

SegmentContenuExemple
ui/Composants React/Vue/SwiftUI, styles, StorybookLoginForm.tsx, login.module.css
model/Store, Reducer, Actions, types, contratsLoginStore.ts, authReducer.ts
api/Clients HTTP, mutations, appels RPCauthApi.ts, loginMutation.ts
lib/Fonctions auxiliaires, validateursvalidateEmail.ts, formatPhone.ts
config/Constantes, configuration de la featureauthConfig.ts, endpoints.ts

Les segments sont une recommandation, pas une règle stricte. Si un slice est petit, les segments peuvent être fusionnés. Pour les grands slices (une feature avec 10+ fichiers), la segmentation est obligatoire — sans elle, la structure interne se transforme rapidement en un « panier » de 50 fichiers où trouver le composant nécessaire prend des minutes. Dans le développement mobile, les segments sont souvent remplacés par une structure de fichiers par type : chaque feature est un fichier Swift séparé ou une classe Kotlin avec des types internes.

FSD dans le développement mobile : adaptation pour Android et iOS

Dans le développement mobile, FSD s'adapte aux caractéristiques spécifiques de la plateforme — la structure modulaire d'Android (modules Gradle) et Swift Package Manager. Adaptation Android suppose que chaque slice est un module Gradle séparé avec son propre build.gradle. Les modules feature-auth, feature-profile, entity-user, shared-ui sont isolés les uns des autres au niveau de la compilation : feature-auth ne peut pas importer feature-profile à moins d'être spécifié dans dependencies.

Adaptation iOS est construite sur Swift Package Manager : chaque slice est un package Swift avec une API publique. Dans les projets TCA, le slice feature.auth contient son propre Reducer, Store, View et client API. Selon la Swift Community Survey 2024, 28% des projets iOS avec TCA utilisent une architecture de slices proche de FSD.

Le principal problème de l'adaptation mobile de FSD est la duplication de la couche shared. Dans le développement mobile, les composants UI (shared/ui) dépendent souvent de la plateforme (Android Views vs Jetpack Compose vs SwiftUI), ce qui nécessite des modules shared séparés pour chaque technologie. Dans FSD, la couche shared est généralement indépendante de la plateforme (utilitaires, configurations), tandis que l'UI-kit est déplacé vers un module séparé ou une bibliothèque de composants.

Avantages et inconvénients de Feature-Sliced Design

Avantages de FSD deviennent notables dans les grands projets avec 10+ développeurs. Chaque développeur ou équipe travaille sur son propre slice sans toucher au code des autres. Les conflits git sont réduits de 40 à 60% (données des études de cas feature-sliced.design). Les nouvelles features sont ajoutées sans risque de casser les existantes, à condition qu'elles utilisent uniquement l'API publique des slices. Refactoriser une feature ne nécessite pas de modifications dans les autres — il suffit de réécrire ui/model/api à l'intérieur d'un slice tout en conservant l'API publique.

AspectFSDFeature-based (sans FSD)Architecture en couches
Isolation des featuresStricteMoyenneFaible
Développement parallèle10+ équipes3–5 équipes1–2 équipes
Réutilisation entre projetsOui (paquets slice)Uniquement par copier-collerVia modules shared
Barrière à l'entréeHauteBasseMoyenne
Isolation Gradle (Android)Native (modules)Native (modules)Faible

Inconvénients de FSD — imbrication excessive pour les petits projets. Si une application se compose de 3 à 5 écrans, sept couches et la segmentation à l'intérieur de chaque slice créent plus de code d'organisation que l'application elle-même. La barrière à l'entrée est élevée : les nouveaux développeurs passent 2 à 4 semaines à apprendre la méthodologie. De plus, FSD est peu compatible avec le prototypage rapide — le prototypage nécessite des importations fréquentes entre couches, qui sont interdites dans FSD et ralentissent les itérations.

Il est recommandé de commencer par une structure Feature-based plus simple et de migrer vers FSD lorsque le nombre d'écrans dépasse 20 et que l'équipe dépasse 5 développeurs.

Questions fréquentes

Quelle est la différence entre FSD et l'architecture Feature-based ?

L'architecture Feature-based regroupe le code par features sans règles d'importation strictes — feature Auth peut importer un autre feature Profile sans restrictions. FSD ajoute une hiérarchie de couches et la règle « les couches regardent uniquement vers le bas ». Dans Feature-based, entity et feature peuvent être au même niveau et s'importer mutuellement ; dans FSD, entity se trouve en dessous de feature, et feature importe entity, pas l'inverse. Feature-based convient aux petits projets, FSD aux grands.

Comment tester un slice isolé ?

L'isolation des slices simplifie les tests unitaires — chaque slice est testé indépendamment en simulant les dépendances des couches inférieures. Pour feature auth, il suffit de simuler entity user. Les tests d'intégration vérifient l'API publique du slice. Dans Android, le module Gradle d'une feature contient son propre répertoire de test avec des tests du Reducer, du client API et de l'UI (via Compose Test). Dans iOS, un package slice inclut des tests de tous les segments.

Peut-on utiliser FSD avec Jetpack Compose ?

Oui, FSD se marie bien avec Jetpack Compose, en particulier dans les projets Android multi-modules. Chaque slice est un module Gradle séparé avec une API publique via la directive exported. La couche features contient des features Composable (LoginFeature, ProductListFeature), la couche entities contient des classes de données et Repository, et shared contient l'UI-kit (MaterialTheme-wrapper, composants personnalisés). FSD est recommandé pour les grands projets Compose avec 5+ développeurs.

Quelles couches sont obligatoires et lesquelles sont facultatives ?

Les couches obligatoires sont app, shared, entities et features. Les autres (processes, pages, widgets) sont facultatives et ajoutées selon les besoins. Dans le développement mobile, la couche pages est souvent fusionnée avec le routage de navigation, et les widgets sont remplacés par shared/ui-kit. Les processus (processes) ne sont généralement pas utilisés dans les projets mobiles — leur rôle est rempli par la couche domaine ou la logique métier dans ViewModel. L'essentiel est de respecter la règle de hiérarchie d'importation.

Comment FSD est-il lié au Domain-Driven Design ?

FSD emprunte à DDD les concepts de Bounded Context et d'Ubiquitous Language. Chaque slice correspond à un bounded context — une limite à l'intérieur de laquelle les termes ont une signification univoque. À l'intérieur du slice, un langage unifié (ubiquitous language) est utilisé, compréhensible à la fois par les développeurs et les analystes métier. Par exemple, dans le slice auth, les termes « connexion », « mot de passe », « jeton » ont la même signification pour tous les membres de l'équipe, ce qui réduit les malentendus entre analystes et développeurs de 30 à 50%.

Résumé

  • Feature-Sliced Design (FSD) — méthodologie d'architecture modulaire qui regroupe le code par fonctionnalités métier (slices), chacun contenant UI, logique, API et tests.
  • Sept couches de FSD : app, processes, pages, features, entities, widgets, shared — avec une règle d'importation stricte de haut en bas.
  • Les slices sont isolés via une API publique — la structure interne est invisible pour les autres slices, empêchant les dépendances cycliques.
  • Les segments à l'intérieur d'un slice (ui, model, api, lib, config) organisent le code par critères techniques, mais ne sont pas obligatoires pour les petits slices.
  • Dans le développement mobile, FSD s'adapte via les modules Gradle (Android) et les packages Swift (iOS), garantissant l'isolation au niveau de la compilation.
  • Principaux avantages — développement parallèle, isolation des features, réutilisation entre projets.
  • Principaux inconvénients — redondance pour les petits projets, barrière à l'entrée élevée, incompatibilité avec le prototypage rapide.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi