npm install - устанавливаем зависимости
npm run start:dev или npm run start:dev:vite - запуск сервера + frontend проекта в dev режиме
npm run start- Запуск frontend проекта на webpack dev servernpm run start:vite- Запуск frontend проекта на vitenpm run start:dev- Запуск frontend проекта на webpack dev server + backendnpm run start:dev:vite- Запуск frontend проекта на vite + backendnpm run start:dev:server- Запуск 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:apply- Подтверждение новых скриншотов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 слайсов
Проект написан в соответствии с методологией Feature sliced design
Ссылка на документацию - feature sliced design
В проекте используется библиотека i18next для работы с переводами.
Файлы с переводами хранятся в директории public/locales.
Для комфортной работы рекомендую установить плагин для webstorm/vscode
Документация i18next - https://react.i18next.com/
В проекте используются 4 вида тестов:
- Обычные unit тесты на
jest-npm run test:unit - Тесты на компоненты с
React testing library-npm run test:unit - Скриншотное тестирование с
lokinpm run test:ui - e2e тестирование с
Cypressnpm run test:e2e
Подробнее о тестах - документация тестирование
В проекте используется eslint для проверки typescript кода и stylelint для проверки файлов со стилями.
Также для строгого контроля главных архитектурных принципов
используется собственный eslint plugin eslint-plugin-feature-sliced-design-validator,
который содержит 3 правила:
path-checker- запрещает использовать абсолютные импорты в рамках одного модуляlayer-imports- проверяет корректность использования слоев с точки зрения FSD (например слой widgets нельзя использовать в слои features и entities)public-api-imports- разрешает импорт из других модулей только из 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
Собрать билд сторибука:
npm run storybook:build
Подробнее о Storybook
Для разработки проект содержит 2 конфига:
webpack- ./config/buildvite- vite.config.ts
Оба сборщика адаптированы под основные фичи приложения. Использовать два и более сборщика на проекте не рекомендуется, это было сделано только в учебных целях, целях расширения кругозора
Вся конфигурация хранится в /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-feature, который принимает 2 аргумента:
- Название удаляемого фича-флага
- Состояние (on/off)
- addComment
- articleRating
- articleRecommendationsList
- AuthByUsername
- avatarDropdown
- EditableProfileCard
- LangSwitcher
- ThemeSwitcher
- notificationButton
- profileRating
- scrollRestoration
- selectArticleView
P.S. Проект и документация находится в разработке