Core Concepts
Feature Sliced Design
Feature-Sliced Design (FSD) organizuje kod według domeny biznesowej, a nie według warstw technicznych. W Nucleify każdy pakiet shared_modules/nuc_* to jeden slice — narzędzia frontendowe, handlery API, migracje bazy, typy i testy w jednym katalogu.
Dlaczego feature slices?
Projekty warstwowe rozpraszają jedną funkcję po wielu folderach:
# ❌ Warstwy first # ✅ Feature-sliced (Nucleify)
src/ shared_modules/
├── api/ ├── nuc_api/
│ ├── colors.ts │ ├── supabase/api/gateway_dispatch.ts
│ └── languages.ts │ ├── utils/api_request.ts
├── types/ │ └── vitests/
│ ├── colors.ts ├── nuc_colors/
│ └── languages.ts │ ├── supabase/api/handle.ts
├── styles/ │ ├── styles/
│ └── colors.scss │ └── vitests/
└── tests/ └── nuc_languages/
└── colors.test.ts └── …Problemy warstw w skali monorepo:
- Dodanie funkcji dotyka 5+ katalogów
- Usunięcie funkcji to polowanie na pliki w całym drzewie
- Równoległa praca na różnych funkcjach powoduje konflikty merge
- Własność kodu jest niejasna
FSD naprawia to, czyniąc moduł jednostką zmiany.
Jak Nucleify stosuje FSD
Moduły współdzielone = slice domeny
Sześć eksportowanych modułów mapuje się na cross-cutting domeny produktu:
| Moduł | Slice |
|---|---|
nuc_api |
Klient HTTP, gateway, formularze auth, stan encji |
nuc_colors |
Theming, tokeny SCSS, API kolorów |
nuc_dark_mode |
Preferencja wyglądu |
nuc_globals |
Breakpointy, wspólne typy, globalny SCSS |
nuc_languages |
Locale, fetch tłumaczeń, plugin i18n |
nuc_stores |
Abstrakcje persystencji klienta |
Każdy slice jest importowany przez web/ i admin/ bez duplikacji.
Aplikacje = warstwy kompozycji
Aplikacje produktowe to cienkie powłoki kompozycyjne:
web/src/
├── pages/[lang]/ # routing + wrappery i18n
├── pages/home/ # kompozycja landing (sekcje)
├── composables/ # tylko specyficzne dla app
├── plugins/ # podpięcie modułów do Nuxt
└── server/api/ # jedno wejście gatewayZasada: jeśli logika należy do domeny, żyje w shared_modules/nuc_*. Jeśli należy do jednej powłoki app (routing, layout, struktura copy marketingowego), zostaje w web/ lub admin/.
Warstwy wewnętrzne modułu
W module foldery mają lekki układ inspirowany FSD:
| Folder | Analog FSD | Zawartość |
|---|---|---|
supabase/api/ |
Backend / API | Handlery gateway, tabele tras |
utils/ |
Shared lib | Composables, hooki, funkcje czyste |
types/ |
Shared types | Interfejsy, literały typów |
constants/ |
Shared config | Wartości statyczne, definicje pól |
components/ |
UI (opcjonalnie) | Widgety wielokrotnego użytku dla domeny |
styles/ |
UI tokens | Partiale SCSS |
vitests/ |
Testy | Testy jednostkowe obok domeny |
Nie ma sztywnego nazewnictwa entities/features/widgets — Nucleify preferuje płaskie moduły domenowe zamiast głębokiej ceremonii FSD. Liczy się zasada (co-lokacja po funkcji), nie etykiety folderów.
Komunikacja między slice'ami
Moduły komunikują się przez zdefiniowane publiczne eksporty, nie przez głębokie importy wewnętrzności innego modułu:
// ✅ Publiczny barrel
import { apiRequest } from 'modules/nuc_api/utils/api_request'
// ❌ Sięgnij w prywatny helper innego modułu
import { internalHelper } from 'modules/nuc_colors/supabase/api/colors_helpers'Dispatch gateway w nuc_api to punkt orkiestracji HTTP — moduły rejestrują handlery, ale routing między domenami dzieje się w gateway, nie przez cross-importy w utils/.
Portable UI vs logika domeny
Kompilator dodaje drugą oś:
| Warstwa | Lokalizacja | Powiązanie z frameworkiem |
|---|---|---|
| Portable UI | *.nuc.tsx |
Brak — emit Vue + React |
| Logika domeny | shared_modules/nuc_*/utils/ |
Composables Vue + hooki .react.ts |
| Powłoka app | web/src/pages/ |
Nuxt (Tryb A) lub Next (Tryb B, generowany) |
Trzymaj store, routery, kontenery i18n i wywołania API poza *.nuc.tsx. Komponenty portable dostają dane przez props i emitują eventy — slice domeny robi wiring w utils app lub modułu.
Porównanie z Atomic Design
Nucleify używa Atomic Design w SCSS (atoms/, molecules/, organisms/ pod nuc_colors/styles/components/) dla hierarchii wizualnej. FSD i Atomic Design rozwiązują różne problemy:
- FSD — gdzie w repo żyje kod funkcji
- Atomic Design — jak komponenty UI się zagnieżdżają wizualnie
Współistnieją: partial organismu nuc_colors nadal jest częścią slice nuc_colors.
Dodawanie funkcji po FSD
- Zidentyfikuj domenę — nowy slice czy rozszerzenie istniejącego
nuc_*? - Co-lokuj — handler API, typy, utils, migracje, testy w jednym folderze modułu
- Eksportuj publicznie —
index.ts/index.react.ts - Podłącz app — rejestracja pluginu, handler gateway, kompozycja strony
- Unikaj kopii w app — jeśli dwie app tego potrzebują, należy do
shared_modules/
Powiązane docs
- Moduły — referencja modułów
- Układ monorepo — granice app vs shared
- Kompilator — warstwa portable UI