O Feature-Sliced Design (FSD) organiza o código front-end em camadas e slices com regras de importação estritas. No Expo, mapeie FSD para app/, features/, entities/ e shared/ - você obtém os benefícios de limite sem sete pastas de nível superior desde o primeiro dia.
shared ← importado por todos
↑
entities ← features podem importar entities; entities nunca importam features
↑
features ← sem importações entre features; use entities ou orquestração da camada app
↑
app ← conecta provedores; rotas importam APIs públicas de features
Colocar lógica de feature nas rotas app/ do Expo - Rotas se tornam arquivos "deuses". Correção: Reexportar de @/features/*; apenas analisar parâmetros.
Importações entre features para "apenas um componente" - O grafo se torna cíclico em duas sprints. Correção: Mover UI compartilhada para entities/ ou shared/ui; orquestrar na rota.
Barras index.ts vazias exportando tudo - Inchaço acidental da API pública. Correção: Exportar deliberadamente; tratar index.ts como um manifesto de pacote.
Criar entities/ para cada DTO - Nem toda resposta de API é uma entidade de domínio. Correção: Mapear DTOs em api/; promover para entidade quando duas features precisam do tipo.
Pular a aplicação do ESLint - FSD sem regras de lint é teatro de pastas. Correção: Adicionar no-restricted-imports antes que a contagem de features atinja dois dígitos.
Duplicar shared/ui e entities/*/ui - Propriedade incerta. Correção: UI de entidade exibe um substantivo (UserAvatar); UI compartilhada é genérica (Button).
features/orders/model/store.ts monolítico - Torna-se um módulo "deus". Correção: Dividir por segmento; um hook por orquestração de tela.
Não. A maioria dos aplicativos Expo usa app (provedores), features, entities e shared. Pule pages (Expo Router substitui) e widgets até que um bloco composto se repita em várias rotas.
Onde a pasta app/ do Expo Router se encaixa?
O app/ do Expo é o shell de roteamento - rotas e layouts baseados em arquivos. O src/app/ do FSD contém provedores globais e bootstrap. Mantenha os arquivos de rota finos; o código do produto vive em src/features/.
As features podem importar outras features?
Não - FSD proíbe importações de slice para slice na mesma camada. Compartilhe através de entities, shared, ou orquestre na camada de rota / src/app.
O que é um segmento?
Uma subpasta dentro de um slice: ui, model, api, lib. Segmentos agrupam arquivos por função técnica sem criar novas camadas de nível superior.
Devo usar a notação de API pública @x?
Opcional. O padrão de exportação cruzada @x do FSD web é menos comum em RN. Um simples barrel index.ts por slice é suficiente.
Onde ficam as stores do Zustand?
Em features/<nome>/model/ para estado local da feature. O estado de sessão global pode viver em src/app/providers/ ou features/session/model/ dependendo do escopo.
Como FSD funciona com TanStack Query?
Os hooks de query pertencem a features/<nome>/model/ ou entities/<nome>/api/. Queries de nível de entidade (useUser) servem a várias features; queries de nível de feature (useCheckout) ficam na feature.
O que vai em shared/ui vs entities/user/ui?
shared/ui/Button é genérico. entities/user/ui/UserAvatar conhece User - exibe dados de domínio e pode ser reutilizado por muitas features.
Posso misturar FSD com um monorepo?
Sim. Pacotes geralmente contêm shared e entities; o app Expo contém features e rotas. Veja o guia do Metro para pacotes compartilhados para resolução de workspaces.
Como migrar de pastas planas para FSD?
Uma feature por PR: mova screens/OrdersScreen.tsx → features/orders/ui/, adicione index.ts, atualize as importações. Habilite as regras do ESLint após a segunda feature migrada.
app/_layout.tsx faz parte da camada app FSD?
Sim - o layout raiz envolve provedores e o chrome de navegação. Registre AppProviders de src/app/providers/ em app/_layout.tsx, não lógica de negócios.
Quando um widget não é uma feature?
Quando ele não tem uma história de usuário independente - por exemplo, um StatsCard reutilizado na home e no dashboard. Features entregam valor ao usuário ("fazer pedido"); widgets compõem entidades para layout.
FSD substitui a Arquitetura Limpa?
Eles se complementam. FSD organiza a estrutura de arquivos; Arquitetura Limpa organiza a direção de dependência dentro de uma feature (casos de uso, adaptadores). Use ambos quando a complexidade justificar.
Quantas features são demais?
Não há um limite rígido - slices devem corresponder aos domínios do produto. Se features/misc aparecer, divida por jornada do usuário ou mescle em um slice existente.