Explicamos qué es Feature-Sliced Design — una metodología de arquitectura modular de frontend basada en dividir el proyecto por funcionalidades de negocio en lugar de capas técnicas. A diferencia de la arquitectura clásica en capas (controladores, servicios, repositorios), FSD agrupa el código según las capacidades funcionales de la aplicación: cada feature contiene su propia lógica, interfaz de usuario y datos. Según la encuesta State of Frontend 2024, el 23% de los desarrolladores React usan FSD como metodología arquitectónica principal, lo que la convierte en la segunda más popular después de la estructura puramente Feature-based.
Puntos clave
Feature-Sliced Design (FSD) es una metodología de arquitectura de aplicaciones frontend propuesta por primera vez en 2021 por la comunidad feature-sliced.design. La idea central de FSD es agrupar el código por funcionalidades de negocio (slices), cada una de las cuales es una unidad autónoma: contiene su propia lógica de negocio, interfaz de usuario, interacción con API, modelos de datos y pruebas. Esto diferencia a FSD de la arquitectura clásica en capas donde el código se divide por criterios técnicos (controller, service, repository).
La metodología toma prestados conceptos de Domain-Driven Design (DDD) y Bounded Context: cada feature de la aplicación es un bounded context separado con límites claros. Los cambios dentro de una feature no deben romper otras features si solo usan la API pública del slice. Según la encuesta State of Frontend 2024, FSD ocupa el segundo lugar en popularidad entre las arquitecturas React (23%), solo detrás de la estructura informal Feature-based (31%).
En el desarrollo móvil, FSD se adapta a las particularidades de los módulos Android y los frameworks iOS. En IT Sectr, usamos FSD para proyectos con 10+ pantallas y 3+ equipos — la metodología permite desarrollar features de forma independiente y reduce los conflictos en git en un 40% en comparación con un monorrepositorio sin límites de slices.
FSD define siete capas jerárquicas, cada una contiene código de un cierto nivel de abstracción. La regla arquitectónica principal es que las capas solo pueden importar código de capas inferiores. Violar esta regla (importar la capa features en entities) se considera un error arquitectónico y es bloqueado por un linter.
| Capa | Propósito | Importa |
|---|---|---|
| app | Inicialización de la aplicación, proveedores, estilos globales, enrutamiento | Cualquier capa |
| processes | Procesos de negocio que combinan múltiples features (onboarding, pago) | pages, features, entities, shared |
| pages | Composición de features en una página, enrutamiento de páginas | features, entities, shared |
| features | Escenarios de usuario: formulario de inicio de sesión, lista de favoritos, filtro de búsqueda | entities, shared |
| entities | Entidades de negocio: User, Product, Order, Cart | shared |
| widgets | Componentes de UI compuestos: Header, Sidebar, ArticleCard | shared, entities |
| shared | Utilidades, UI-kit, cliente API, configuraciones — independiente de la lógica de negocio | Solo bibliotecas externas |
Ejemplo de estructura de directorios de un proyecto FSD:
src/
├── app/ // Capa de aplicación
│ ├── providers/
│ ├── router/
│ └── styles/
├── pages/ // Páginas — composición de features
│ └── main/
├── features/ // Features — escenarios de usuario
│ ├── auth/ // Slice «Autenticación»
│ │ ├── ui/
│ │ ├── model/
│ │ └── api/
│ └── productList/ // Slice «Lista de productos»
│ ├── ui/
│ └── model/
├── entities/ // Entidades de negocio
│ ├── user/
│ └── product/
├── widgets/ // Componentes compuestos
│ └── header/
└── shared/ // Utilidades compartidas y UI-kit
└── ui/La regla «las capas miran solo hacia abajo» es la piedra angular de FSD. Si feature auth importa entity user — es correcto. Si entity user comienza a importar feature auth — es una dependencia cíclica y una violación del aislamiento. Para garantizar esta regla se utilizan plugins de ESLint (eslint-plugin-fsd) o linters personalizados de la API pública de los slices.
Slice — la unidad principal de agrupación en FSD, correspondiente a una feature o entidad de negocio. Cada slice reside dentro de una de las siete capas (features, entities, widgets, pages) y contiene un conjunto completo de código para implementar una funcionalidad específica: componentes UI, modelo de datos, cliente API, constantes y pruebas.
Los límites de los slices se definen por el dominio de negocio: feature auth incluye todo lo relacionado con la autorización (formulario de inicio de sesión, formulario de registro, restablecimiento de contraseña); entity user incluye el modelo User, UserRepository y serialización. Los límites no deben superponerse: si feature auth necesita datos de usuario — importa entity user en lugar de duplicar la lógica. En el desarrollo móvil, un slice FSD a menudo corresponde a un módulo Gradle en Android o un paquete Swift en iOS.
Los slices están estrictamente aislados: la estructura interna de un slice es invisible para otros slices. Para la interacción entre slices se utiliza una API pública — un archivo index.ts/index.js que exporta solo lo que está permitido para uso externo. Todo lo demás son módulos privados. Este enfoque previene dependencias accidentales y simplifica la refactorización: cambiar la implementación privada de un slice no afecta a otros slices.
Dentro de cada slice de FSD, el código se organiza adicionalmente por segmentos — categorías técnicas que se repiten en todos los slices. El conjunto estándar de segmentos incluye ui (componentes de interfaz), model (lógica de negocio, Store, Actions, Reducer), api (solicitudes al servidor, mutaciones), lib (utilidades y ayudantes) y config (configuración de la feature).
| Segmento | Contenido | Ejemplo |
|---|---|---|
| ui/ | Componentes React/Vue/SwiftUI, estilos, Storybook | LoginForm.tsx, login.module.css |
| model/ | Store, Reducer, Actions, tipos, contratos | LoginStore.ts, authReducer.ts |
| api/ | Clientes HTTP, mutaciones, llamadas RPC | authApi.ts, loginMutation.ts |
| lib/ | Funciones auxiliares, validadores | validateEmail.ts, formatPhone.ts |
| config/ | Constantes, configuración de la feature | authConfig.ts, endpoints.ts |
Los segmentos son una recomendación, no una regla estricta. Si un slice es pequeño, los segmentos pueden combinarse. Para slices grandes (una feature con 10+ archivos), la segmentación es obligatoria — sin ella, la estructura interna se convierte rápidamente en una «canasta» de 50 archivos donde encontrar el componente necesario lleva minutos. En el desarrollo móvil, los segmentos a menudo se reemplazan por una estructura de archivos por tipo: cada feature es un archivo Swift separado o una clase Kotlin con tipos internos.
En el desarrollo móvil, FSD se adapta a las características específicas de la plataforma — la estructura modular de Android (módulos Gradle) y Swift Package Manager. Adaptación para Android supone que cada slice es un módulo Gradle separado con su propio build.gradle. Los módulos feature-auth, feature-profile, entity-user, shared-ui están aislados entre sí a nivel de compilación: feature-auth no puede importar feature-profile a menos que se especifique en dependencies.
Adaptación para iOS se basa en Swift Package Manager: cada slice es un paquete Swift con una API pública. En proyectos TCA, el slice feature.auth contiene su propio Reducer, Store, View y cliente API. Según la Swift Community Survey 2024, el 28% de los proyectos iOS con TCA usan una arquitectura de slices cercana a FSD.
El principal problema de la adaptación móvil de FSD es la duplicación de la capa shared. En el desarrollo móvil, los componentes UI (shared/ui) a menudo dependen de la plataforma (Android Views vs Jetpack Compose vs SwiftUI), lo que requiere módulos shared separados para cada tecnología. En FSD, la capa shared suele ser independiente de la plataforma (utilidades, configuraciones), mientras que el UI-kit se traslada a un módulo separado o biblioteca de componentes.
Ventajas de FSD se hacen notables en proyectos grandes con 10+ desarrolladores. Cada desarrollador o equipo trabaja en su propio slice sin tocar el código de otros. Los conflictos en git se reducen en un 40–60% (datos de estudios de caso de feature-sliced.design). Las nuevas features se añaden sin riesgo de romper las existentes, siempre que solo usen la API pública de los slices. Refactorizar una feature no requiere cambios en otras — basta con reescribir ui/model/api dentro de un slice manteniendo la API pública.
| Aspecto | FSD | Feature-based (sin FSD) | Arquitectura en capas |
|---|---|---|---|
| Aislamiento de features | Estricto | Medio | Bajo |
| Desarrollo paralelo | 10+ equipos | 3–5 equipos | 1–2 equipos |
| Reutilización entre proyectos | Sí (paquetes slice) | Solo mediante copy-paste | Mediante módulos shared |
| Barrera de entrada | Alta | Baja | Media |
| Aislamiento Gradle (Android) | Nativa (módulos) | Nativa (módulos) | Débil |
Desventajas de FSD — anidación excesiva para proyectos pequeños. Si una aplicación consta de 3–5 pantallas, siete capas y segmentación dentro de cada slice crean más código organizativo que la propia aplicación. La barrera de entrada es alta: los nuevos desarrolladores tardan de 2 a 4 semanas en aprender la metodología. Además, FSD es poco compatible con la creación rápida de prototipos — el prototipado requiere importaciones frecuentes entre capas, que en FSD están prohibidas y ralentizan las iteraciones.
Se recomienda comenzar con una estructura Feature-based más simple y migrar a FSD cuando el número de pantallas supere las 20 y el equipo supere los 5 desarrolladores.
Preguntas frecuentes
La arquitectura Feature-based agrupa el código por features sin reglas estrictas de importación — feature Auth puede importar otro feature Profile sin restricciones. FSD añade una jerarquía de capas y la regla «las capas miran solo hacia abajo». En Feature-based, entity y feature pueden estar al mismo nivel e importarse mutuamente; en FSD, entity está por debajo de feature, y feature importa entity, no al revés. Feature-based es adecuada para proyectos pequeños, FSD para grandes.
El aislamiento de slices simplifica las pruebas unitarias — cada slice se prueba de forma independiente simulando las dependencias de las capas inferiores. Para feature auth, basta con simular entity user. Las pruebas de integración verifican la API pública del slice. En Android, el módulo Gradle de una feature contiene su propio directorio de pruebas con pruebas del Reducer, cliente API y UI (mediante Compose Test). En iOS, un paquete slice incluye pruebas de todos los segmentos.
Sí, FSD se combina bien con Jetpack Compose, especialmente en proyectos Android multimódulo. Cada slice es un módulo Gradle separado con una API pública mediante la directiva exported. La capa features contiene features Composable (LoginFeature, ProductListFeature), la capa entities contiene clases de datos y Repository, y shared contiene el UI-kit (MaterialTheme-wrapper, componentes personalizados). FSD es recomendado para proyectos grandes de Compose con 5+ desarrolladores.
Las capas obligatorias son app, shared, entities y features. Las demás (processes, pages, widgets) son opcionales y se añaden según sea necesario. En el desarrollo móvil, la capa pages a menudo se fusiona con el enrutamiento de navegación, y los widgets se reemplazan por shared/ui-kit. Los procesos (processes) generalmente no se usan en proyectos móviles — su función la cumple la capa de dominio o la lógica de negocio en ViewModel. Lo principal es cumplir con la regla de jerarquía de importaciones.
FSD toma prestados de DDD los conceptos de Bounded Context y Ubiquitous Language. Cada slice corresponde a un bounded context — un límite dentro del cual los términos tienen un significado inequívoco. Dentro del slice se utiliza un lenguaje unificado (ubiquitous language), comprensible tanto para desarrolladores como para analistas de negocio. Por ejemplo, en el slice auth, los términos «inicio de sesión», «contraseña», «token» tienen el mismo significado para todos los miembros del equipo, lo que reduce los malentendidos entre analistas y desarrolladores en un 30–50%.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también