crutch12

sut-report

Aug 21st, 2023 (edited)
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ## Major Points
  2. 1. ### 1. Onboarding
  3.    - **Проблема**: во многих компонентах - например, `EditLeavePeriodDrawer`,
  4.    дровер, отвечающий за создание и редактирование отсутствий (отпусков) -
  5.    явно присутствует код, заполняющий форму данными, переданными через специальный проп.
  6.    Таким образом компонент был изменён для решения посторонней задачи, а не, например,
  7.    декорирован.
  8.    - **Замечено**, что функционал этого онбординга (обучения) в текущем релизе (2023.3.1)
  9.    по большей части не является рабочим или даже полностью реализованным.
  10.    - **Решение**: полностью убрать текущую реализацию и/или переписать её как
  11.    отдельную фичу, что позволит отключить её при ненадобности и гарантирует полное
  12.    разделение кода.
  13. UPD: Завели SPIKE - https://jira.moskit.pro/browse/SUT-4598
  14.  
  15. 2. ### Routes and CRUD
  16.    - **Проблема 1**: источником истины для кода фронта `SystemTagsEnum`
  17.    являются данные в БД, которые записываются в исходники фронта
  18.    вручную вызываемым скриптом в приложении бэкэнда через эндпоинт
  19.    запущенного локально/по `env.API_BASE_URL` бэкэнда - в такой сложности нет
  20.    никакой необходимости.
  21. UPD: договорились на `"migration:run:dev": "npm run migration:run && npm run create-system-tags"`
  22.    - **Проблема 2**: для добавления роута необходимо произвести миграцию, выполнить
  23.    вышеупомянутый скрипт, и добавить записи ещё в двух файлах констант на фронте -
  24.    тоже, получается, излишне сложный процесс с частичным дублированием кода.
  25.    - **Проблема 3**: работа с параметрами, значения которых являются массивами, неудобна -
  26.    компоненту-пользователю приходится самостоятельно производить `join`/`split` значения.
  27.    - **Замечено**, что доступ к некоторым роутам определяется тэгами нескольких дочерних
  28.    элементов, например, `/charts/[type]` - т.е. роуты образуют как минимум древовидную
  29.    структуру (возможно, существуют и связи между различными ветками дерева, например,
  30.    если какой-то виджет используется на нескольких разных страницах).
  31. UPD:
  32. 1) Договорились на дерево роутов (нужны для тегов + title) (круто, если с i18n)
  33. 2) Подумать как убить дубликаты; или как кидать ts ошибку
  34. Задача - https://jira.moskit.pro/browse/SUT-4599
  35. 3) Потрогать next 13.2 - type fase links
  36. Задача (SPIKE) - https://jira.moskit.pro/browse/SUT-4599
  37.  
  38.    - **Решение**: сделать единым источником истины один `json` файл,
  39.    используемый и бэком, и фронтом, описывающий карту сайта.
  40.    Миграции базы данных будут производиться в соответствии
  41.    с содержанием этого файла. Из-за зависимости объекта от самого себя -
  42.    ключи родительских/дочерних роутов должны присутствовать в этом же объекте -
  43.    и невозможности реализации такой проверки в Typescript без дублирования
  44.    определения ключей, валидность этого файла должна будет проверяться отдельным
  45.    pre-build скриптом. Кроме того, дублирующие роуты `withQuery` не имеют смысла,
  46.    их нужно убрать, а работу с параметрами-массивами внести в `useRouter`.
  47.  
  48. 3. ### User profile (kk-ui/UserForm)
  49.    - **Проблема 1**: некоторые компоненты очень большие из-за отсутствия разделения на
  50.    меньшие компоненты (например, разделы "Общине данные" и "Дополнительная информация").
  51.    - **Проблема 2**: JSX некоторых компонентов перегружен, например логикой условного рендера
  52.    режимов чтения и редактирования (флаг `readonly`), или логикой создания клибальной ссылки внутри компонентов
  53.    типа TextField или Autocomplete.
  54.    - **Проблема 3**: текущие типы, сгенерированные их схем бэк требуют, не образуют
  55.    discriminated union, из-за чего в коде большое количество `@ts-expect-error`
  56.    - **Проблема 4**: состояния `jotai` находятся в глобальном скоупе, что создаёт сложности в
  57.    управлении и сбрасывании состояния - кроме того в проекте уже есть стейт менеджер `mobx`.
  58.    - **Решение**:
  59.      - Раздробить компоненты и распределить их по иерархии в файловой структуре.
  60.      - Обобщить реализацию переключения `readonly` и ссылок, возможно отказаться или
  61.      изменить реализацию `<HideableTextField />` (изначально был создан как раз
  62.      для такого переключения ввиду странной вёрстки, при которой "просто" убирается рамка
  63.      поля ввода).
  64.      - Исправить схемы на бэке, чтобы из них генерировались удобные типы - discriminated union,
  65.      либо раздельные типы; вероятно из-за текущей реализации taxios или спецификации
  66.      openApi это невозможно.
  67.      - Заменить использование `jotai` на контексты, `react-hook-form` или `mobx`.
  68.  
  69. 4. ### exhaustive-deps
  70.    - **Проблема**: очень много использований `eslint-disable-next-line react-hooks/exhaustive-deps`,
  71.    что есть плохая практика в целом, и подаёт плохой пример стажёрам в частности.
  72.    - **Решение**: зарезолвить все случаи недостающих зависимостей хуков, по необходимости
  73.    используя `useRef` или `useAutoRef` (сразу создаёт `ref` объект из аргумента).
  74. UPD: Завели задачу - https://jira.moskit.pro/browse/SUT-4601
  75.  
  76. 5. ### Толстые компоненты
  77.     - **Проблема**: есть ряд компонентов, размер которых превышает 200 строк (даже без jsx),
  78.    что сильно ухудшает читаемость, например, `ProjectHierarchyTab`;
  79.    часто в таких компонентах имеется повторение кода.
  80.     - **Решение**: найти такие компоненты и упростить логику на месте или выносом в
  81.    уже имеющиеся или новые компоненты/хуки иил вспомогательные файлы.
  82.  
  83. ## Minor points
  84.  
  85. - Директория `const` - свалка; `components` - тоже похожа на свалку.
  86. В каждой фиче - мини-свалка. Возможно стоит хотя бы начать внедрять feature-sliced или
  87. какую-то другую более строгую иерархию.
  88.  
  89. - В палитре темы есть невнятная категория `dop`, куча различных бэкграундов,
  90. разные форматы значений цветов.
  91.  
  92. - На страницах с фильтрациями/режимами передаются флаги `true/false`,
  93. вместо использования `false` как значения по умолчанию
  94. и передачи только ключа при включении флага,
  95. i.e. `?bar` вместо `?foo=false&bar=true`.
  96.  
  97. - Тултипы у многих ячеек таблиц лишние, неплохо бы найти способ отображать
  98. их только при `text-overflow`.
  99.  
  100. - Подсветка столбца в AgGrid мерцает при частом срабатывании ховера,
  101. съедает много памяти и процессорного времени.
  102.  
  103. - `calc` в стилях - расстрел, кроме редких сложных случаев без
  104. возможных альтернатив (наример `ReactTree` - дерево оргструктуры), а не `calc(50% - 16px)`.
  105.  
  106. - Во многих местах отступы имеют страшные значения типа 1.875 - 15px т.к. 1 юнит - 8px;
  107. возможно лучше сделать 1 юнит - 4px и/или обсудить размеры и сетку с дизайнером.
  108.  
  109. - `npm audit` -> 44 vulnerabilities (17 moderate, 23 high, 4 critical).
  110.  
  111. - Во многих местах встречаются лишние оборачивающие `<Box />` (`<BaseWrapper />`),
  112. часто с `width="100%"` и/или `height="100%"`, e.g. заголовок таблицы трудозатрат
  113. и другие подобные таблицы.
  114.  
  115. - Бывают случаи, когда после нового релиза старые данные в `localStorage` ломают
  116. какой-то функционал, e.g. последний релиз вызывал падение с 100 ошибками в секунду
  117. на вкладке проектной иерархии любого проекта (так же почему-то там показывался
  118. проект АИС) - необходимо валидировать хранимые там данные, и полностью
  119. инвалидировать при их... невалидности.
  120.  
  121. - Часто используется хук `useTheme`, когда можно без него обойтись. Так же часто используется
  122. длинная форма интерполяции функции `${({ theme }) => theme...}` вместо хелпера `${muiTheme...}`.
  123.  
  124. - В некоторых компонентах не используются хуки для локальных функций.
  125.  
  126. - Для табов можно сделать компонент на основе контекста.
  127.  
  128. - Многие Base-компоненты можно заменить на простой ре-экспорт и стилизовать с помощью `createTheme`.
  129.  
  130. - Есть ряд маркеров `@TODO` не касающихся того, что описано выше - тоже стоит исправить.
  131.  
  132. - При ошибке тайтл сайта превращается в `0: An unexpected error has occured` - ноль лишний.
  133.  
  134. - При сборке уведомления о деоптимизации подключенных из `assets/` svg файлов.
  135. 4 файла по 2-3 мегабайта занимают огромную часть бандла - потому что это на самом деле base64.
  136.  
  137. - `bundle-analyzer` - agGrid тянем дважды, `community` и `enterprise`.
  138. В остальном всё достаточно осмысленно по размерам.
  139.  
  140. - `immutable` - используется в одном месте для резюме, возможно не нужен.
Add Comment
Please, Sign In to add comment