React
Doar componente funcționale
Folosește întotdeauna componente funcționale TSX cu exporturi denumite.Proprietăți
Creează un tip numit{ComponentName}Props. Folosește destructurarea. Nu folosi React.FC.
Fără spread al unei singure variabile de props
Managementul stării
Atomi Jotai pentru starea globală
- Preferă atomii în locul prop drilling-ului
- Nu folosi
useRefpentru stare — foloseșteuseStatesau atomi - Folosește familii de atomi și selectori pentru liste
Evită re-randări inutile
- Extrage
useEffectși preluarea datelor în componente surori de tip sidecar - Preferă handleri de evenimente (
handleClick,handleChange) în locul luiuseEffect - Nu folosi
React.memo()— în schimb, rezolvă cauza principală - Limitează utilizarea
useCallback/useMemo
TypeScript
typeîn loc deinterface— mai flexibil, mai ușor de compus- Șiruri literale în loc de enum-uri — cu excepția enum-urilor generate de GraphQL codegen și a API-urilor interne ale bibliotecii
- Fără
any— TypeScript strict este impus - Fără importuri de tip — folosește importuri obișnuite (impus de Oxlint
typescript/consistent-type-imports) - Folosește Zod pentru validarea în timp de execuție a obiectelor netipizate
JavaScript
Denumiri
- Variabile: camelCase, descriptive (
emailnuvalue,fieldMetadatanufm) - Constante: SCREAMING_SNAKE_CASE
- Tipuri/Clase: PascalCase
- Fișiere/directoare: kebab-case (
.component.tsx,.service.ts,.entity.ts) - Handleri de evenimente:
handleClick(nuonClickpentru funcția handler) - Props de componentă: prefixează cu numele componentei (
ButtonProps) - Componente stilizate: prefixează cu
Styled(StyledTitle)
Stilizare
Folosește componente stilizate Linaria. Folosește valorile din temă — evităpx, rem sau culori hardcodate.
Importuri
Folosește aliasuri în locul căilor relative:Structura folderelor
- Modulele pot importa din alte module, dar
ui/ar trebui să rămână fără dependențe - Folosește subfoldere
internal/pentru cod privat modulului - Componente sub 300 de linii, servicii sub 500 de linii