Code review react spa
Доброго вечора!
Я вже 3 рік вивчаю Front-end і хов би дізнатись вашу думку.
На даний час почав розробку інтернет магазину.
Пишу на react і хотів би дізнатись на скільки якісно пишу код чи такий код взагалі можна писати. Хто може подивитись хоча б на хвилину і сказати ваші враження буду дуже вдячний.
19 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівПривет, классный проект, странно что еще не работаешь
Советы
Фронт
Просмотрел пару файлов, везде одни и те же штуки, сделаб на примере Account.js
1) Есть хорошая практика, если уже используешь что-то типа радакса — в него переносить всю бизнес логику из контейнеров и оставлять состояние компонента только в реюзабельных компонентах, то есть я смотрю github.com/...tainer/Account/Account.js
Там используется useState, useEffect во многих местах, это все хорошо бы перенести в отдельный стор, для того что бы в компонентах было меньше логики и тебе не приходилось прыгать между глабольным стором (редакс) и стейтом компонентов
2) линтер + претиер само собой, хорошо подключить что-то типа хаски на пуш или коммит, что бы оно все делало автоматом
3) Могу ошибаться, но в одних местах напрямую вызывается axios и где-то твой собественный модуль API, хорошо это бы все привести к одному виду
4)
API.put('/user/changeInf...— хорошо убрать это все в редакс экшены5)
history.push('/')— давно не писал на редаксе, хз как там сейчас, было что-то типа react router redux — что была возможность это юзать в экшенах6)
{showInfo?<AccountInfoemail={email}name={name}surname={surname}gender={gender}age={age}phone={phone}/>:<></>}можно просто писать {showInfo ? AccountInfo : null}
7) React.memo — тут просто советы — юзать это все только когда появляются проблемы с частым ненужным перерендером, то есть не делать преждевременную оптимизацию, и не ставить их везде и сразу, ибо любая оптимизация несет в себе свой вес. я могу забиться, что если убрать все эти мемо — проект будет быстрее работать, а если поставить их только там где надо — еще лучше ))))
8)
setNewName={(e)=>setNewName(e.target.value)}— хорошо бы убрать колбеки из рендера и в AccountSettings комоненте передвать уже value, а не
e9) github.com/...ainer/Account/Account.css — если уже используешь бем — используй везде. Так же хорошо подкючить css модули, я так понимаю у тебя используетя react create app — там вроде надо просто добавить Account.module.css — они заработают. Если хочешь все же использовать Бем — хорошо было бы подключить sass или postcss для вложенности стилей — так удобнее
10) хорошо было бы сделать цсс или сасс перменные для всех одинаковых значений в цсс. Это облегчит изменение стилей в будущем
Например
padding-bottom: 10px;color: red11)
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;Такие вещи хорошо бы выносить из компонентов и оставлять в том же файле как константы или выности в хелперы
бекенд
1) res.json({ user: false, status: 404, comment: «User not found» }); — ты в куче мест используешь одно и тоже, круто было бы сделать хелпер по ошибкам
2)
const getProductListSearch = async (str) => {return new Promise((res,rej)=>{const List = productListSchemaList.find({name:{$regex:'.*'+str+'.*'}}, (err, list)=>{if(err) return console.log(err);res(list);});})}Это все очень странно) async — и так возвращает промис, я может что-то не понимаю, но по идеи оно должно выглядеть где-то так
const getProductListSearch = async (str) => {try {const list = await productListSchema.find({name:{$regex:'.*'+str+'.*'}})return {err: null, data: list }} catch (err) {console.log(err);return {err: err}}}Вообще, круто — молодец)) удачи тебе))
find — 100% асинхронный
о свидетель редакса появился
Велике спасибі вам за приділений час і пояснення.
Буду виправляти недоліки і робити покращення.
Щодо редакс, читав деякі статті, дивився код і там є різноманіття.Хтось все закидає в редакс, хтось роділяє дані на локальні в компонентах і гробальні в редакс і ще деякі використовують контекст.
Для себе я вибрав вибрав варіант де ті дані які мені знадобляться в різних частинах сайту виносити в редакс щоб різні компоненти мали доступ до даних але є дані які пов’язані тільки з одним компонетом. Для цих компонентів я зберігаю дані локально.
Щодо запитів на сервер погоджуюсь потрібно перенести в екшини так буде зручніше.
І ще раз дякую Вам за приділений час.
Шукаючи в гуглі інфу зустрів багато статей ось наприклад Стаття1 і Стаття260-80 рендерів. Щоб цього не відбувалось я пробую використовувати
Якщо коротко використання стрілкової функції створює нову функцію при кожному рендері компонента, що може порушувати оптимізації, які використовують суворе порівняння для визначення ідентичності.
Наприклад в моєму випадку щоб змінити інфу про користувача він вводить нову і коли натискає на клавішу то виконується новий рендер і в мене це викликає близько
useCallback.Приклад useCallback
github.com/.../routes/userRoutes.js#L45
Коли перевіряв код виявив що даний роут ніде не застосовується тому вирішив закоментувати але на даний момент вже все дізнався але не встиг видалити зайвий код. Після свят знов візьмусь до апгрейду.
Посмотрите мой проект: github.com/...ora/sport-area-shop-front, может что-то полезное почерпнете.
Ищите проекты на github разбирайтесь с кодом, это лучший помощник, учитесь сами оценивать свой код.
Дякую за пораду обов’язково гляну.
может линтер/преттиер?
Дякую за пораду.
Так це ще не закінчений проект є ще прогавини в коді але система працює якраз на диплом:). Наразі пишу сам і досвіду в роботі в команді нажаль немає але сподіваюсь все зміниться.
Ні далекувато до Києва. Наразі вчусь в НУ «ЛП».