---
# System prepended metadata

title: best practics

---

# best practics

## Сodestyle
Предпочитаемые настройки prettier для форматирования кода:
![](https://i.imgur.com/dwRRxHo.png)
![](https://i.imgur.com/8EdzsFS.png)
![](https://i.imgur.com/eLra2Ix.png)
![](https://i.imgur.com/j2MUuhG.png)
    
---
Последовательность импортов

Чтобы хорошо ориентироваться в своих же дебрях, нужно знать где что находиться на уровне миникарты

Последовательность: 

1. Установленные библиотеки
2. Кастомные компоненты
3. Утилиты
4. Ассеты
5. Графика
6. Стили

Хорошо:

![](https://i.imgur.com/cj7EIwV.png)


Плохо:

![](https://i.imgur.com/MNYnsG8.png)

Внутри функционального компонента тоже должен быть порядок, иначе в какой то момент будешь путаться и не понимать где state, который почему-то объявляется прямо перед return

Структура компонента: 
1. State, ref, navigator, selector и т.д.
1. Функции для работы (если нужны в рамках данного компонента)
1. useEffect
1. return jsx

![](https://i.imgur.com/fABWzlr.png)

Префиксы scss-переменных должны совпадать с используемым свойством

![](https://i.imgur.com/KxQ9DWm.png)


Деструктуризация компонентов
Не растягивать компонент в 500 строк кода, обязательно разделять компонент на логические составляющие, не превышающие 150 строк.

В рамках одного компонента/модуля/класса описывать только схожий функционал, который объединен смыслом

Стараться отделять логический функционал от компонента, т.е. не выстраивать десятки функций внутри компонента, тем самым усложняя читаемость и логику. К тому же, вполне вероятно что этот функционал можно будет переиспользовать в других схожих компонентах.

По возможности, а желательно не следует лезть напрямую в dom, реакт этого не любит и сами разрабы об этом пишут и не важно, меняешь ли ты св-ва или стили в элементе, если уж надо, то для этого есть хук useRef, хотя у него есть ещё и другие применения.

Если что то можно сделать через css - делай. Не стоить уповать на функциональность реакта, ведь в самый неподходящий момент всё может зафейлить ререндер

Использовать кастомные хуки. Их не зря придумали и часть функционала компонентов можно здорово уместить в хук, который к тому же будет более реиспользуемым, чем статическая функция в классе

Если есть не меняющиеся объекты/массивы, лучше вынести это в ассеты, либо же использовать мемоизацию.

Если мы в компоненте используем фильтрации, сортировки или же расчёты которые могут опять повториться, то лучше всего мемоизировать это.

На небольшое действие (типо открытие модалки или передача пары пропсов наверх) отдавать предпочтение useContext, а не редаксу, из за того, что редакс влияет на глобальное состояние приложения, он тупо увеличит кол-во рендеров

Но и useContext нужно использовать с умом, ибо при изменении состояния, он сделает ререндер всем компонентам, которые в него обёрнуты

Использовать layout. Если на сайте должны быть постояные блоки (header, footer, navbar), то стоит это вынести в отдельный слой, а все внутренние компоненты передавать через children, тем самым реиспользуя код.

Если в компоненте больше 4 пропсов, то лучше соединить в один объект

Так не надо:

![](https://i.imgur.com/Bvx0pDG.png)

Надо так:

![](https://i.imgur.com/uLdkchs.png)

Не мутировать переменные напрямую, а делать копии, иначе потом будешь удивляться: “а почему в моём моем исходном массиве всё удалилось?”

Типизация: использовать приведение типов js, чтобы потом не ломать голову, мол: “Какого хрена тут строка, а не число?”

Всегда следует незамедлительно фиксить ошибки типизации, чтобы не было как на скрине ниже. Если понадобиться экстренно закинуть проект в докер, то он нормально не заработает.
Проблем с исправлением обычно не возникает, т.к. ts нормально подсказывает в чём именно проблема.
![](https://hackmd.io/_uploads/rkwZsQKH2.png)

Работа с интерфейсами.
Если интерсфейс можно переиспользовать или у него большое кол-во параметров, рекомендуется вынести его в файл interface.tsx.
Иначе можно оставить его чуть выше компонента.
Именовать интерфейс (если он относиться к конкретному компоненту), стоит через название компонента с постфиксом Int.
![](https://hackmd.io/_uploads/rk6Ny4Kr3.png)


Проверка на существование ключа в объекте делать через hasOwnProperty, а не прямое условие, ибо в ключе может прийти false, null, 0 и т.д.

![](https://i.imgur.com/7zbGn1u.png)

После успешно завершённой отладки кода следует удалять за собой console.log функции


