14 KiB
Аудит архитектуры backend/static/scss
Дата: 15 января 2026
Аудитор: GitHub Copilot
Статус: ⚠️ Требуется улучшение
📊 Общая оценка: 7/10
✅ Сильные стороны (7 баллов)
-
Хорошая структура папок (9/10)
- ✅ Логичное разделение: abstracts, layout, components, utilities
- ✅ Подпапка chat для chat компонентов
- ✅ Понятная организация
-
Именование файлов (8/10)
- ✅ Префикс
_для partials - ✅ Kebab-case naming
- ✅ Понятные имена
- ✅ Префикс
-
Документация (7/10)
- ✅ Есть BUTTONS_README.md
- ✅ Комментарии в main.scss
- ⚠️ Нет общего README в scss/
-
Модульность (9/10)
- ✅ 30 компонентов в components/
- ✅ 10 chat модулей в components/chat/
- ✅ Разделение abstracts
⚠️ Проблемы и недостатки (3 балла снижения)
🔴 Критические проблемы
1. Дублирование импортов компонентов (CRITICAL)
Проблема: Многие компоненты импортируются дважды:
- Один раз в
main.scss→ компилируется вapp.css - Второй раз в
custom-bootstrap.scss→ компилируется вbootstrap-custom.css
Дублированные импорты:
// В main.scss:
@import 'components/common';
@import 'components/navbar';
@import 'components/sidebar';
@import 'components/page-header';
@import 'components/cards';
@import 'components/modals';
@import 'components/comments';
// И ЕЩЕ РАЗ в custom-bootstrap.scss:
@import "components/common";
@import "components/navbar";
@import "components/sidebar";
@import "components/page-header";
@import "components/cards";
@import "components/modals";
@import "components/comments";
Последствия:
- ❌ Эти стили дублируются в
app.cssИbootstrap-custom.css - ❌ Увеличенный размер файлов
- ❌ Повторяющиеся селекторы
- ❌ Потенциальные конфликты специфичности
Затронутые компоненты:
- common
- navbar
- sidebar
- page-header
- cards
- badges-bem
- modals
- comments
Размер дублирования: ~1,500-2,000 строк SCSS дублируются!
2. Chat компоненты ТОЛЬКО в bootstrap-custom.css
Проблема: Все 10 chat компонентов импортируются ТОЛЬКО в custom-bootstrap.scss:
// Чат компоненты (в подпапке chat/)
@import "components/chat/message-inputs";
@import "components/chat/chat-detail";
@import "components/chat/chat-date-groups";
@import "components/chat/chat-list-enhanced";
@import "components/chat/chat-enhanced";
@import "components/chat/chat-polls";
@import "components/chat/chat-new-messages-indicator";
@import "components/chat/message-selection";
@import "components/chat/message-context-menu";
@import "components/chat/message-reactions";
Последствия:
- ❌ Chat стили попадают в
bootstrap-custom.css(301 KB) - ❌ Нелогично - chat не относится к Bootstrap
- ❌ Сложнее поддерживать - непонятно где искать
3. Устаревший TODO комментарий
В custom-bootstrap.scss строки 197-199:
// Остальные компоненты (загружаются напрямую из CSS - не мигрировано)
// TODO: Мигрировать buttons, card-list, document-list, request-list,
// ios-search, feed-specific, base-app, request-detail
Проблема: Эти компоненты УЖЕ мигрированы и импортируются в main.scss!
🟡 Средние проблемы
4. Пустая папка utilities/
scss/utilities/ - ПУСТО
В main.scss закомментированы импорты:
// @import 'utilities/spacing-utils';
// @import 'utilities/index';
Проблема:
- Папка существует но не используется
- spacing-utils лежит в components/, а не utilities/
- Запутанная структура
5. Нет главного README.md в scss/
Отсутствует: backend/static/scss/README.md
Есть только:
components/BUTTONS_README.md- документация одного компонента- Нет общего описания архитектуры
6. Layout компоненты в custom-bootstrap.scss
// Layout
@import "layout/chat-layout";
И в main.scss:
@import 'layout/base-app';
@import 'layout/chat-layout'; // ДУБЛЬ!
chat-layout импортируется дважды!
🟢 Мелкие замечания
7. Несогласованность комментариев
В main.scss:
// 4. UTILITIES - Вспомогательные классы
// @import 'utilities/spacing-utils';
// @import 'utilities/index';
Но _spacing-utils.scss находится в components/, не в utilities/!
8. Размер custom-bootstrap.scss
202 строки, из них:
- ~70 строк - переопределения переменных Bootstrap
- ~30 строк - импорты компонентов (многие дублируются)
- ~100 строк - комментарии
Файл становится перегруженным.
📈 Статистика
Размеры
- Всего SCSS файлов: 51
- Всего строк SCSS: 11,394
- Компонентов в components/: 30
- Компонентов в components/chat/: 10
- Layout файлов: 2
- Abstracts файлов: 4
Импорты
- Импортов в main.scss: 30
- Импортов в custom-bootstrap.scss: 25
- Дублированных импортов: 8 компонентов
Compiled размеры
- app.css: 95 KB
- bootstrap-custom.css: 301 KB
- Дубликаты в обоих: ~15-20 KB
🎯 Рекомендации по улучшению
Приоритет 1: Устранить дублирование (CRITICAL)
Решение A: Разделить компоненты по назначению
app.css (main.scss):
- Все application-specific компоненты
- Layout (base-app, chat-layout)
- Components (buttons, cards, modals, etc.)
- Chat components
- Spacing utilities
bootstrap-custom.css (custom-bootstrap.scss):
- ТОЛЬКО переопределения Bootstrap переменных
- ТОЛЬКО импорт Bootstrap
- CSS variables (abstracts/css-variables)
- Убрать ВСЕ импорты компонентов
Решение B: Создать отдельный chat.css
chat.css (новый entry point):
- Все chat компоненты
- Chat layout
- Подключать только на страницах чата
Приоритет 2: Очистить custom-bootstrap.scss
Удалить из custom-bootstrap.scss:
// ❌ УДАЛИТЬ ВСЕ ЭТО:
@import "layout/chat-layout";
@import "components/common";
@import "components/navbar";
@import "components/sidebar";
@import "components/page-header";
@import "components/cards";
@import "components/badges-bem";
@import "components/chat/..."; // все 10 импортов
@import "components/comments";
@import "components/modals";
Оставить только:
// 1. Переопределение Bootstrap переменных
$spacer: 1rem;
$spacers: (...);
// и т.д.
// 2. Импорт наших abstracts
@import "abstracts/variables";
@import "abstracts/mixins";
// 3. Импорт Bootstrap
@import "../node_modules/bootstrap/scss/bootstrap";
// 4. CSS переменные
@import "abstracts/css-variables";
// ВСЕ! Никаких компонентов!
Приоритет 3: Переместить spacing-utils
# Переместить из components/ в utilities/
mv scss/components/_spacing-utils.scss scss/utilities/
mv scss/components/_layout-spacing.scss scss/utilities/
Раскомментировать в main.scss:
// 4. UTILITIES - Вспомогательные классы
@import 'utilities/layout-spacing';
@import 'utilities/spacing-utils';
Приоритет 4: Документация
Создать scss/README.md:
# SCSS Architecture
## Structure
- abstracts/ - Variables, mixins, functions
- layout/ - Page layouts
- components/ - Reusable components
- utilities/ - Utility classes
## Build
- main.scss → app.css (application styles)
- bootstrap-custom.scss → bootstrap-custom.css (Bootstrap only)
## Components
[список всех компонентов]
Приоритет 5: Удалить устаревшие TODO
Удалить из custom-bootstrap.scss:
// Остальные компоненты (загружаются напрямую из CSS - не мигрировано)
// TODO: Мигрировать buttons, card-list, document-list, request-list,
// ios-search, feed-specific, base-app, request-detail
Все эти компоненты УЖЕ в main.scss!
📋 План действий (по шагам)
Шаг 1: Backup текущего состояния
cp scss/custom-bootstrap.scss scss/custom-bootstrap.scss.backup
cp scss/main.scss scss/main.scss.backup
Шаг 2: Очистить custom-bootstrap.scss
Удалить все импорты компонентов, оставить только:
- Переопределения переменных Bootstrap
- Импорт abstracts
- Импорт Bootstrap
- Импорт css-variables
Шаг 3: Переместить chat в main.scss
Добавить в main.scss все chat компоненты:
// Chat компоненты
@import 'components/chat/message-inputs';
@import 'components/chat/chat-detail';
// ... все 10 компонентов
Шаг 4: Переместить spacing в utilities
mv scss/components/_spacing-utils.scss scss/utilities/
mv scss/components/_layout-spacing.scss scss/utilities/
Шаг 5: Обновить импорты в main.scss
// Utilities
@import 'utilities/layout-spacing';
@import 'utilities/spacing-utils';
Шаг 6: Пересобрать CSS
npm run build:app
npm run build:bootstrap
Шаг 7: Проверить размеры
ls -lh css/app.css css/bootstrap-custom.css
Ожидаемый результат:
- app.css: увеличится на ~15-20 KB (добавятся chat компоненты)
- bootstrap-custom.css: уменьшится на ~15-20 KB (удалятся дубли)
Шаг 8: Создать документацию
Создать scss/README.md с описанием архитектуры
Шаг 9: Тестирование
- Проверить главную страницу
- Проверить страницы с чатом
- Проверить все компоненты
📊 Ожидаемые улучшения
После рефакторинга:
До:
app.css: 95 KB (без chat, с дублями)
bootstrap-custom.css: 301 KB (с chat, с дублями)
Дублирование: ~15-20 KB
После:
app.css: ~110 KB (с chat, без дублей)
bootstrap-custom.css: ~280 KB (только Bootstrap, без дублей)
Дублирование: 0 KB
Экономия: ~6-7% от общего размера
Преимущества:
- ✅ Нет дубликатов кода
- ✅ Чистое разделение ответственности
- ✅ Логичная структура
- ✅ Легче поддерживать
- ✅ Меньший итоговый размер
🎓 Best Practices нарушения
❌ Текущие нарушения:
- DRY (Don't Repeat Yourself) - дублирование 8 компонентов
- Separation of Concerns - chat компоненты в bootstrap файле
- Single Responsibility - custom-bootstrap делает слишком много
- Clear Architecture - utilities/ пуста, spacing в components/
✅ После рефакторинга:
- DRY - каждый компонент импортируется один раз
- Separation of Concerns - четкое разделение: Bootstrap отдельно, app отдельно
- Single Responsibility - каждый файл имеет одну четкую цель
- Clear Architecture - логичная структура папок
💡 Дополнительные рекомендации
1. Рассмотреть переход на @use/@forward
SCSS @import deprecated, современный подход:
@use 'abstracts/variables' as vars;
@use 'components/buttons';
2. Создать index.scss в папках
// components/chat/_index.scss
@forward 'message-inputs';
@forward 'chat-detail';
// ...
// Использование:
@import 'components/chat'; // импортирует все
3. Добавить linter
npm install -D stylelint stylelint-config-sass-guidelines
4. Создать style guide
Документировать:
- Naming conventions
- File organization
- Import order
- Variables usage
🏁 Заключение
Текущая архитектура: 7/10 - Хорошая база, но есть критические проблемы
Основные проблемы:
- Дублирование импортов (CRITICAL)
- Chat компоненты в bootstrap-custom (HIGH)
- Неиспользуемая utilities/ папка (MEDIUM)
Действия:
- Срочно устранить дублирование
- Переорганизовать структуру
- Создать документацию
После рефакторинга ожидается: 9/10 - Чистая, поддерживаемая архитектура
Дата: 15 января 2026
Статус: Требуется рефакторинг
Приоритет: HIGH