Feature-Sliced Design (FSD) organiza código front-end en capas y slices con reglas de importación estrictas. En Expo, asigna FSD a app/, features/, entities/ y shared/ - obtienes los beneficios de límites sin siete carpetas de nivel superior desde el primer día.
shared ← importado por todos
↑
entities ← features pueden importar entities; entities nunca importan features
↑
features ← sin importaciones entre características; usa entities u orquestación de capa app
↑
app ← cableado de proveedores; rutas importan APIs públicas de características
Poner lógica de características en rutas Expo app/ - Las rutas se convierten en archivos god. Solución: Re-exporta desde @/features/*; solo analiza parámetros.
Importaciones entre características para "solo un componente" - El gráfico se vuelve cíclico en dos sprints. Solución: Mueve la interfaz compartida a entities/ o shared/ui; orquesta en la ruta.
Barriles index.ts vacíos que exportan todo - Inflado de API pública accidental. Solución: Exporta deliberadamente; trata index.ts como un manifiesto de paquete.
Crear entities/ para cada DTO - No todo respuesta de API es una entidad de dominio. Solución: Mapea DTOs en api/; promueve a entidad cuando dos características necesitan el tipo.
Omitir cumplimiento de ESLint - FSD sin reglas de lint es teatro de carpetas. Solución: Agrega no-restricted-imports antes de que el recuento de características alcance dos dígitos.
Duplicar shared/ui y entities/*/ui - Propiedad poco clara. Solución: La interfaz de entidad muestra un sustantivo (UserAvatar); la interfaz compartida es genérica (Button).
features/orders/model/store.ts monolítico - Se convierte en un módulo god. Solución: Divide por segmento; un hook por orquestación de pantalla.
No. La mayoría de las apps Expo usan app (proveedores), features, entities y shared. Omite pages (Expo Router lo reemplaza) y widgets hasta que un bloque compuesto se repita entre rutas.
¿Cómo encaja la carpeta app/ de Expo Router?
Expo app/ es el shell de enrutamiento - rutas basadas en archivos y diseños. FSD src/app/ contiene proveedores globales y bootstrap. Mantén archivos de ruta delgados; el código del producto vive en src/features/.
¿Pueden las características importar otras características?
No - FSD prohíbe importaciones de slice a slice en la misma capa. Comparte a través de entities, shared, u orquesta en el nivel de ruta / capa src/app.
¿Qué es un segmento?
Una subcarpeta dentro de un slice: ui, model, api, lib. Los segmentos agrupan archivos por rol técnico sin crear nuevas capas de nivel superior.
¿Debería usar la notación de API pública @x?
Opcional. El patrón de exportación cruzada @x de FSD web es menos común en RN. Un barrel index.ts simple por slice es suficiente.
¿Dónde viven los almacenes de Zustand?
En features/<name>/model/ para estado local de características. El estado de sesión global puede vivir en src/app/providers/ o features/session/model/ según el alcance.
¿Cómo funciona FSD con TanStack Query?
Los hooks de Query pertenecen a features/<name>/model/ o entities/<name>/api/. Las consultas a nivel de entidad (useUser) sirven múltiples características; las consultas a nivel de características (useCheckout) permanecen en la característica.
¿Qué va en shared/ui vs entities/user/ui?
shared/ui/Button es genérico. entities/user/ui/UserAvatar conoce sobre User - muestra datos de dominio y puede ser reutilizado por muchas características.
¿Puedo mezclar FSD con un monorepo?
Sí. Los paquetes normalmente contienen shared y entities; la app Expo contiene features y rutas. Ver guía de Metro de paquetes compartidos para resolución de espacio de trabajo.
¿Cómo migro de carpetas planas a FSD?
Una característica por PR: mueve screens/OrdersScreen.tsx - features/orders/ui/, agrega index.ts, actualiza importaciones. Habilita reglas de ESLint después de la segunda característica migrada.
¿Es app/_layout.tsx parte de la capa app de FSD?
Sí - el diseño raíz envuelve proveedores y el chrome de navegación. Registra AppProviders desde src/app/providers/ en app/_layout.tsx, no lógica comercial.
¿Cuándo un widget no es una característica?
Cuando no tiene ninguna historia de usuario independiente - por ejemplo, una StatsCard reutilizada en inicio y panel. Las características entregan valor de usuario ("hacer pedido"); los widgets componen entidades para diseño.
¿FSD reemplaza Clean Architecture?
Se complementan entre sí. FSD organiza la estructura de archivos; Clean Architecture organiza la dirección de dependencia dentro de una característica (casos de uso, adaptadores). Usa ambos cuando la complejidad lo justifique.
¿Cuántas características son demasiadas?
No hay un límite fijo - los slices deberían coincidir con dominios de productos. Si aparece features/misc, divide por viaje del usuario o fusiona en un slice existente.