npm install - ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
npm run start:dev ΠΈΠ»ΠΈ npm run start:dev:vite - Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° + frontend ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² dev ΡΠ΅ΠΆΠΈΠΌΠ΅
npm run start
- ΠΠ°ΠΏΡΡΠΊ frontend ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° webpack dev indexnpm run start:vite
- ΠΠ°ΠΏΡΡΠΊ frontend ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° vitenpm run start:dev
- ΠΠ°ΠΏΡΡΠΊ frontend ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° webpack dev index + backendnpm run start:dev:vite
- ΠΠ°ΠΏΡΡΠΊ frontend ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° vite + backendnpm run start:dev:index
- ΠΠ°ΠΏΡΡΠΊ backend ΡΠ΅ΡΠ²Π΅ΡΠ°npm run build:prod
- Π‘Π±ΠΎΡΠΊΠ° Π² prod ΡΠ΅ΠΆΠΈΠΌΠ΅npm run build:dev
- Π‘Π±ΠΎΡΠΊΠ° Π² dev ΡΠ΅ΠΆΠΈΠΌΠ΅ (Π½Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½)npm run lint:ts
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ts ΡΠ°ΠΉΠ»ΠΎΠ² Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:ts:fix
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ts ΡΠ°ΠΉΠ»ΠΎΠ² Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:scss
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° scss ΡΠ°ΠΉΠ»ΠΎΠ² style Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:scss:fix
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ scss ΡΠ°ΠΉΠ»ΠΎΠ² style Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run test:unit
- ΠΠ°ΠΏΡΡΠΊ unit ΡΠ΅ΡΡΠΎΠ² Ρ jestnpm run test:ui
- ΠΠ°ΠΏΡΡΠΊ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ² Ρ lokinpm run test:ui:ok
- ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΡΠΊΡΠΈΠ½ΡΠΎΡΠΎΠ²npm run test:ui:ci
- ΠΠ°ΠΏΡΡΠΊ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ² Π² CInpm run test:ui:report
- ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΎΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ²npm run test:ui:json
- ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ json ΠΎΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ²npm run test:ui:html
- ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ HTML ΠΎΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ²npm run storybook
- Π·Π°ΠΏΡΡΠΊ Storybooknpm run storybook:build
- Π‘Π±ΠΎΡΠΊΠ° storybook Π±ΠΈΠ»Π΄Π°npm run prepare
- ΠΏΡΠ΅ΠΊΠΎΠΌΠΌΠΈΡ Ρ ΡΠΊΠΈnpm run generate:slice
- Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ FSD ΡΠ»Π°ΠΉΡΠΎΠ²npm run postinstall
- ΠΡΠΈΡΡΠΊΠ° ΠΊΡΡΠ° node_modulesnpm run remove-feature
- Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡΠΈΡΠ°-ΡΠ»Π°Π³Π°ΠΌ
ΠΡΠΎΠ΅ΠΊΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ "Feature Sliced Design" (ΠΠΈΠ·Π°ΠΉΠ½ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠ°ΡΡΡΠΌ). ΠΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ΅ΠΌΠΈΡΡΡ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, ΡΠ»ΡΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
-
ΠΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΡ: ΠΠΎΠ΄ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ (ΡΠΈΡΠΈ), ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΠΌ. ΠΠ°ΠΆΠ΄Π°Ρ ΡΠΈΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΡΠΈΠ»ΠΈ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΡΠ΅Π΄ΡΡΡΠ΅ΡΡ.
-
ΠΠ΅Π³ΠΊΠΎΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ: Π€ΠΈΡΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ, ΡΠ΄Π°Π»Π΅Π½Ρ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°. ΠΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°.
-
Π£Π»ΡΡΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ: ΠΠ°ΠΆΠ΄Π°Ρ ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Π² Π΄Π°Π½Π½ΡΡ .
-
ΠΠ΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ΅ ΠΠΎΠ΄ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ Π²Π»ΠΈΡΠ½ΠΈΡ (ΡΠ»ΠΎΠΉ), ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (ΡΠ»Π°ΠΉΡ) ΠΈ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΌΡ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ (ΡΠ΅Π³ΠΌΠ΅Π½Ρ). ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π΄Π»Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΡ.
-
ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π±Π°Π»Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° DRY ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π»ΠΈ. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΈΡΠΈ, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΠ°Ρ . ΠΡΠΎ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
-
Π£ΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ ΠΈ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Ρ ΠΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΡΠ»ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π° ΡΠ»ΠΎΡΡ Π²ΡΡΠ΅. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΉ.
-
ΠΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π±ΠΈΠ·Π½Π΅ΡΠ° ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ Π±ΠΈΠ·Π½Π΅Ρ-Π΄ΠΎΠΌΠ΅Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΡΠΈΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ - Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ FSD
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° i18next Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°ΠΌΠΈ. Π€Π°ΠΉΠ»Ρ Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°ΠΌΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² public/locales.
ΠΠ»Ρ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ webstorm/vscode
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ i18next - https://react.i18next.com/
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ 4 Π²ΠΈΠ΄Π° ΡΠ΅ΡΡΠΎΠ²:
- ΠΠ±ΡΡΠ½ΡΠ΅ unit ΡΠ΅ΡΡΡ Π½Π° jest -
npm run test:unit
- Π’Π΅ΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ React testing library -
npm run test:unit
- Π‘ΠΊΡΠΈΠ½ΡΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ loki
npm run test:ui
- e2e ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Cypress
npm run test:e2e
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ ΡΠ΅ΡΡΠ°Ρ - Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ eslint Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ typescript ΠΊΠΎΠ΄Π° ΠΈ stylelint Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΎ ΡΡΠΈΠ»ΡΠΌΠΈ.
Π’Π°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π³Π»Π°Π²Π½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ eslint plugin eslint-plugin-paths-checking-plugin-ys, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 3 ΠΏΡΠ°Π²ΠΈΠ»Π°
- path-checker - Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ
- layers-import-ys - ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»ΠΎΠ΅Π² Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ FSD (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ widgets Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² features ΠΈ entitites)
- public-api-imports-ys - ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΈΠΌΠΏΠΎΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· public api. ΠΠΌΠ΅Π΅Ρ auto fix
npm run lint:ts
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ts ΡΠ°ΠΉΠ»ΠΎΠ² Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:ts:fix
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ts ΡΠ°ΠΉΠ»ΠΎΠ² Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:scss
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° scss ΡΠ°ΠΉΠ»ΠΎΠ² style Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌnpm run lint:scss:fix
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ scss ΡΠ°ΠΉΠ»ΠΎΠ² style Π»ΠΈΠ½ΡΠ΅ΡΠΎΠΌ
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΡΠΎΡΠΈ-ΠΊΠ΅ΠΉΡΡ.
ΠΠ°ΠΏΡΠΎΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΊΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ storybook-addon-mock
.
Π€Π°ΠΉΠ» ΡΠΎ ΡΡΠΎΡΠΈΠΊΠ΅ΠΉΡΠ°ΠΌΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠ΄ΠΎΠΌ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ .stories.tsx
ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΡΠΎΡΠΈΠ±ΡΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
npm run storybook
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ Storybook
ΠΡΠΈΠΌΠ΅Ρ:
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { ThemeDecorator } from '@/shared/config/storybook/ThemeDecorator/ThemeDecorator';
import { Button, ButtonSize, ButtonTheme } from './Button';
import { Theme } from '@/shared/const/theme';
export default {
title: 'shared/Button',
component: Button,
argTypes: {
backgroundColor: { control: 'color' },
},
} as ComponentMeta<typeof Button>;
const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;
export const Primary = Template.bind({});
Primary.args = {
children: 'Text',
};
export const Clear = Template.bind({});
Clear.args = {
children: 'Text',
theme: ButtonTheme.CLEAR,
};
ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 2 ΠΊΠΎΠ½ΡΠΈΠ³Π°:
ΠΠ±Π° ΡΠ±ΠΎΡΡΠΈΠΊΠ° Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠΎΠ΄ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² /config
- /config/babel - babel
- /config/build - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ webpack
- /config/jest - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΡΡΠ΅Π΄Ρ
- /config/storybook - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΡΠΎΡΠΈΠ±ΡΠΊΠ°
Π ΠΏΠ°ΠΏΠΊΠ΅ scripts
Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π°\ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄Π°\Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΎΡΡΠ΅ΡΠΎΠ² ΠΈ ΡΠ΄.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ github actions Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² /.github/workflows. Π ci ΠΏΡΠΎΠ³ΠΎΠ½ΡΡΡΡΡ Π²ΡΠ΅ Π²ΠΈΠ΄Ρ ΡΠ΅ΡΡΠΎΠ², ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΡΠΎΡΠΈΠ±ΡΠΊΠ°, Π»ΠΈΠ½ΡΠΈΠ½Π³.
Π ΠΏΡΠ΅ΠΊΠΎΠΌΠΌΠΈΡ Ρ ΡΠΊΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ Π»ΠΈΠ½ΡΠ΅ΡΠ°ΠΌΠΈ, ΠΊΠΎΠ½ΡΠΈΠ³ Π² /.husky
ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ redux toolkit. ΠΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ [EntityAdapter]
ΠΠ°ΠΏΡΠΎΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ RTK query
ΠΠ»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π΄ΡΡΠ΅ΡΠΎΠ² (ΡΡΠΎΠ±Ρ Π½Π΅ ΡΡΠ½ΡΡΡ ΠΈΡ Π² ΠΎΠ±ΡΠΈΠΉ Π±Π°Π½Π΄Π») ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ DynamicModuleLoader
Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΈΡΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ feature-flags
ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ρ
Π΅Π»ΠΏΠ΅ΡΠ° toggleFeatures
Π² Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ
{
name
: Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΈΡΠ°-ΡΠ»Π°Π³Π°,
on
: ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ° ΡΠ»Π°Π³Π°,
off
: ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ° ΡΠ»Π°Π³Π°
}
ΠΠ»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠΈΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΡΠΈΠΏΡ remove-features.ts ΠΎΠ½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ 2 Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°
- ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΄Π°Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΈΡΠ°-ΡΠ»Π°Π³Π°
- Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ (on/off)
ΠΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄, Π½Π΅ ΠΈΠΌΠ΅ΡΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- api
- assets
- config
- const
- localstorage.ts: ΡΠ°Π·Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ localstorage
- router.ts: Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ
- theme.ts: ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- layouts
- lib
- classNames: Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π° ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
- components: Π€ΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
- context
- features: ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΊΠ°ΡΠ°ΡΡΠΈΠΉΡΡ ΡΠΈΡΠ°-ΡΠ»Π°Π³ΠΎΠ²
- hooks: ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Ρ ΡΠΊΠΈ
- render: ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅Π½Π΄Π΅ΡΠΎΠΌ
- router: ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠΎΡΡΠΈΠ½Π³ΠΎΠΌ
- store: ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΡΠΎΡΠΎΠΌ
- tests: Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ²
- url: ΡΠ°Π±ΠΎΡΠ° Ρ url-Π°ΠΌΠΈ
- types: ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ²
- ui: UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ
- addCommentForm
- articleEditForm
- articlePageGreeting
- articleRating
- articleRecommendationsList
- articleSortSelector
- articleViewSelector
- articleTypeTabs
- authByUsername
- avatarDropdown
- editableProfileCard
- LangSwitcher
- notificationButton
- scrollSave
- scrollToTopButton
- profileRating
- ThemeSwitcher
- uiDesignSwitcher
ArticleAdditionalInfo ArticlesFilters Navbar Page PageError PageLoader ScrollToolbar Sidebar