Общее описание проекта и процесса разработки
Приводится детальное описание проекта и его ключевых (технологических) особенностей, а также особенностей процесса разработки.
RUBAS WEB3 APPLICATION представляет собой приложение, обеспечивающее дружественный пользовательский интерфейс для взаимодействия со смарт-контрактами экосистемы RUBAS (см. myrubas), а также для отслеживания некоторых статистических показателей в виде таблиц и диаграмм. Подписание транзакций осуществляется через MetaMask.
Приложение имеет две языковые версии: русскоязычную и англоязычную.
В проекте используется стек - Ant Design (UI) + Icons, wagmi + viem (Web3), zustand (стейт), i18next + react-i18next (i18n), loglevel (логирование), а также дополнительные утилиты для удобства разработки:
UI: реализован на основе Ant Design + Icons с использованием Emotion для CSS-in-JS стилизации, что позволяет обеспечить единый стиль, поддержку тем и гибкую кастомизацию компонентов.
Web3: реализуется через связку wagmi + viem, предоставляющую удобные React-хуки для работы с кошельками, контрактами, сетями и подписанием транзакций.
Управление состоянием: zustand - минималистичный state-менеджер для хранения пользовательских данных, состояния кошелька и UI-состояния, дополненный хуком use-sync-external-store для стабильных подписок.
Интернационализация: i18next + react-i18next с использованием i18next-browser-languagedetector для автоматического определения языка пользователя.
Логирование: loglevel - легковесное и настраиваемое решение для логирования, подходящее для приложений любого масштаба.
Дополнительные утилиты: markdown-to-jsx для преобразования markdown в React-компоненты, react-textarea-autosize для автозаполняющихся текстовых полей, react-use - коллекция полезных React хуков.
Конкретные версии представлены в следующей таблице:
Категория | Технологии | Пакеты (версии) |
---|---|---|
UI Framework | Ant Design + Icons, Emotion | antd (5.24.9), @ant-design/icons (6.0.0), @emotion/react (11.14.0), @emotion/styled (11.14.0) |
Web3 | Wagmi + Viem | wagmi (2.15.2), viem (2.28.4) |
State Management | Zustand | zustand (5.0.4), use-sync-external-store (1.5.0) |
i18n | i18next + React Integration | i18next (25.0.2), react-i18next (15.5.1), i18next-browser-languagedetector (8.1.0) |
Utilities | React Hooks, Markdown, UI Helpers | react-use (17.6.0), markdown-to-jsx (7.7.6), react-textarea-autosize (8.5.9) |
Логирование | loglevel | loglevel (1.9.2) |
React Core | React 19 | react (19.1.0), react-dom (19.1.0) |
Категория | Инструменты / Конфигурации |
---|---|
Bundler | Vite (6.3.5) с плагином @vitejs/plugin-react (4.4.1) |
Linting | ESLint (9.26.0) с плагинами: |
- @typescript-eslint/eslint-plugin (8.32.0), @typescript-eslint/parser (8.32.0) |
|
- eslint-plugin-import (2.31.0) |
|
- eslint-plugin-prettier (5.4.0), eslint-config-prettier (10.1.3) |
|
- eslint-plugin-react-hooks (5.2.0) |
|
- eslint-plugin-react-refresh (0.4.19) |
|
- eslint-plugin-simple-import-sort (12.1.1) |
|
- eslint-plugin-storybook (0.12.0) |
|
Форматирование кода | Prettier (3.5.3) с интеграцией в ESLint |
Type Checking | TypeScript (5.8.3), @types/react (19.1.2), @types/react-dom (19.1.2) |
Тестирование | - Vitest (3.1.3) с дополнениями: @vitest/browser (3.1.3), @vitest/coverage-v8 (3.1.3) |
- Playwright (1.52.0) для E2E-тестирования |
|
- jsdom (26.1.0) для эмуляции DOM в тестах |
|
Component Development | Storybook (8.6.12) с набором аддонов: |
- Документирование: @storybook/addon-docs (8.6.12), react-docgen-typescript (2.2.2) |
|
- Разработка: @storybook/addon-actions (8.6.12), @storybook/addon-console (3.0.0) |
|
- Тестирование: @storybook/experimental-addon-test (8.6.12), @storybook/test-runner (0.22.0) |
|
Стилизация | sass (1.87.0) |
Node.js | v22.13.1 |
Разрабатываемые компоненты могут быть проверены визуально и протестированы через Storybook.
Общие требования заключаются в том, чтобы обеспечивать модульность, слабую связанность и "чистую" архитектуру, а также поддерживаемость, тестируемость и расширяемость кода.
При написании нового кода необходимо следовать этим рекомендациям:
- Применять подход «атомарного дизайна» (Atomic Design): atoms → molecules → organisms.
- Учитывать разбиение на папки:
- assets/ — общие файлы (статика).
- components/ — визуальные компоненты (атомы, молекулы, организмы).
- constants/ — общие константы проекта (глобальные).
- hooks/ — бизнес-логика в виде хуков (useWallet, useTokenBalance).
- locales/ — языковые локализации (en, ru).
- services/ — сервисные, вспомогательные функции.
- stores/ — хранение и распространение глобального состояния.
- Соблюдать следующие правила:
- UI-компоненты должны поддерживать:
- собственные (модульные) стили в форме scss;
- локализацию через i18n;
- логирование;
- каждый UI-компонент должен иметь набор историй с тестами для Storybook.
- При этом бизнес-логика должна быть вынесена из UI-компонентов (ее следует описывать в виде хуков, которые компонент принимает в числе прочих пропсов).
- Код компонентов должен быть документирован в стиле JSDoc. Кроме того, первая строка всегда должна содержать однострочный комментарий, который должен быть использован при суммаризации проекта (в этом комментарии очень кратко должна передаваться основная суть). Опционально: по тексту компонента можно добавлять краткие комментарии, если это будет способствовать лучшему пониманию кода.
- Следует использовать args для передачи пропсов ("пробрасывать" пропсы).
- Все пропсы и/или параметры должны быть описаны в JSDocs ().
- Следует всегда прямо и явно указывать все типы (для пропсов, для компонентов и т.д.).
- Каждый UI-компонент должен быть снабжен историей для Stroybook и минимальным набором тестов (файл *.stories.tsx должен быть в той же папке, что и сам компонент).
- UI-компоненты должны поддерживать:
Код оценивается в виде звезд. Оценка выставляется в однострочном комментарии (в квадратных скобках).
- ☆☆☆☆☆ — первый вариант кода, к которому предъявляется только требование: работоспособность
- ★☆☆☆☆ — работоспособный код + комментарии: однострочный, JSDoc, и опционально - минимальные комментарии по тексту
- ★★☆☆☆ — всё перечисленное + отсутствуют замечания со стороны линтера
- ★★★☆☆ — всё перечисленное + оптимизированы и упорядочены импорты
- ★★★★☆ — всё перечисленное + выполнено ревью кода (внесены исправления и улучшения)
- ★★★★★ — всё перечисленное + имеются истории для Сторибука и тесты
В связи с тем, что разработка ведется силам одного специалиста, ветвление с использованием фича-веток представляется избыточным.
Вместо этого работа должна вестись всего в двух ветках: master (основной более-менее стабильный код) и dev (текущая разработка).
Этап | Действие |
---|---|
Разработка | В ветке dev, с осмысленными коммитами (см. ниже) |
Код-ревью | Через Pull Request из dev в master |
Слияние | После ревью, merge ветки dev → master |
То есть, перед слиянием должны осуществляться код-ревью (с последующим вероятным рефакторингом).
Комментарии к коммитам должны иметь формат:
[ttp-NNNNNN]
, где
ttp
- task type (см. ниже);NNNNNN
- номер задачи (с ведущими нулями)
Типы задач (и соответствующие префиксы):
[ftr]
feature/ - добавление нового функционала (вплоть до уровня ревью);[tst]
testing/ - ручное (визуальное) тестирование;[ref]
refactoring/ - модернизация, направленная на улучшение чистоты кода и применение лучших практик;[bfx]
bugfix/ - исправление обнаруженной ошибки;[dcs]
docs/ - работа над документацией (в коде и в файле README);[chr]
chore/ - прочие (технологические, рутинные и т.д.) изменения, не влияющие на функционал.
- Переключиться на dev:
git checkout dev
- Выполнить изменения, выполнить коммит:
git add auth.js
git commit -m "[ftr-00012] Добавлен модуль для новой фичи"
- Запушить изменения:
git push master dev
- Создать Pull Request в GitHub:
From: dev
To: master
Название: ftr-00012: Модуль для новой фичи
Описание: Добавлен базовый функционал новой фичи. Обновлены файлы локализации
- Выполнить код-ревью, внести правки при необходимости.
- Выполнить слияние dev → master.