1. Используйте
const
вместо
let
для определения переменных которые не переопределяются в коде. Это помогает снизить когнитивную нагрузку с человека читающего код и негласный стандарт в React разработке.
2. Такие вещи как globalStyles и конфигурацию store лучше вынести в отдельные файлы. Они могут со временем хорошо разрастись.
По поводу globalStyles, вы вообще можете вынести их в отдельный css файл.
3. Вместо:
{
isModal
? <Route path="/auth" component={AuthPopup} />
: null
}
лучше:
{isModal && <Route path="/auth" component={AuthPopup} />}
4. Вместо:
function mapDispatchToProps(dispatch) {
return {
autoLogin: () => dispatch(autoLogin()),
getBrowser: () => dispatch(getBrowser()),
getMedia: () => dispatch(getMedia())
}
}
лучше:
const mapDispatchToProps = {
autoLogin,
getBrowser,
getMedia,
};
5. Точки с запятыми в конце то есть, то нет. Определитесь и приведите код к одному виду.
6.
& label {}
& input {}
& span {}
Это не очень хороший подход. Во-первых ваши стили не изолированные, что может приводить к
неожиданным результатам. Во-вторых у вас очень много дублирования стилей. Определите Input и Label как базовые компоненты и используйте в разных местах, то же с остальным если есть.
7. Почему папка со страницами называется Containers? Дань бойлерплейтам?
8. Использование trailing comma является хорошей практикой.
9.
import {combineReducers} from 'redux';
import photoReducer from './photoReducer';
import authReducer from './authReducer';
import globalReducer from './globalReducer';
export default combineReducers({
photoReducer, authReducer, globalReducer
})
Все таки приятней работать с хранилищем в котором ключи не имеют в названии слова reducer:
import {combineReducers} from 'redux';
import photo from './photoReducer';
import auth from './authReducer';
import global from './globalReducer';
export default combineReducers({
photo,
auth,
global,
});
10. Забудьте вообще, что в языке есть возможность использовать вложенный тернарный оператор:
return e === 'invalid-email' ? 'Неверно указан e-mail'
: e === 'user-not-found' ? 'Указанный e-mail на найден'
: e === 'wrong-password' ? 'Неверный пароль'
: e === 'email-already-in-use' ? 'Указанный e-mail уже используется'
: e === 'network-request-failed' ? 'Нет подключения к интернету'
: e === 'operation-not-allowed' ? 'Произошла ошибка, попробуйте снова'
: e === 'popup-closed-by-user' ? 'Окно авторизации закрыто пользователем'
: e === 'account-exists-with-different-credential' ? 'Аккаунт уже существует с другими данными, используйте другой способ авторизации'
: e
Это одна из самых худших практик в JavaScript разработке. Тут лучше подойдет конструкция
switch case
11. Константы actionTypes лучше вынести в папку constants и разложить по разным файлам, иначе со временем у вас там будет свалка.
12. Вместо:
import {SET_ACTIVE, CHANGE_VALUE, SET_DEFAULT, UPLOAD, UPDATE_IMAGE, SET_IMAGE_ERROR, SET_LIKE, SET_COMMENT, ADD_ARTICLE_SUCCESS, FETCH_ARTICLES_START, FETCH_ARTICLES_SUCCESS, FETCH_ARTICLES_ERROR} from '../actions/actionTypes';
Лучше:
import {
SET_ACTIVE,
CHANGE_VALUE,
SET_DEFAULT, UPLOAD,
UPDATE_IMAGE,
SET_IMAGE_ERROR,
SET_LIKE,
SET_COMMENT,
ADD_ARTICLE_SUCCESS,
FETCH_ARTICLES_START,
FETCH_ARTICLES_SUCCESS,
FETCH_ARTICLES_ERROR,
} from '../actions/actionTypes';
13. Попробуйте внедрить библиотеку
reselect. И для получения значения из store вместо записи вида:
function mapStateToProps(state) {
return {
browser: state.globalReducer.browser
}
}
использовать селектор:
const mapStateToProps = state => ({
browser: browserSelector(state),
});