• Какой необходимый уровень знаний для junior React.js Разработчика?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    UPDATE: реальные тестовые задания и разборы здесь, ответы на все вопросы из поста в моем блоге об обучении react.

    не включая основы js

    Извините, но стандартная задача, про "напишите функуцию add, которая при вызове add(1)(2) вернет 3" - многих положила на лопатки =) Поэтому будьте готовы..

    React
    0) Какую проблему решает react ?
    1) Мгновенно ли срабатывает setState? Если нет, то как выполнить код, который 100% выполнится после того, как новый state будет установлен?
    2) Зачем многие постоянно пишут в constructor: this.FUNCTION_NAME = this.FUNCTION_NAME.bind(this) и отсюда вопрос вытекает чему равно this в разных местах вашего компонента...
    3) в каких методах жизненого цикла стоит выполнять xhr запросы? В каких стоит "обновлять state на основе props"?
    4) Что будет если вызвать this.setState в render методе компонента?
    5) зачем нужен componenWIllUnmount, приведите пример..
    6) Контролируемые, не контролируемые компоненты
    7) Как организовать роутинг в реакт приложении? (ответ: взять react-router - подходит, но было бы круто, если бы вы рассказали, как он примерно работает)*
    8) Зачем нужны propTypes? Что происходит с ними в production сборке?
    9) Как можно удобно "отлаживать" чужой код приложения, написанного на react (намек в сторону React devtools)
    ...

    Redux
    0) Какую проблему решает redux?
    1) Зачем многие создают типы действий NAME_REQUEST / NAME_SUCCESS ? А заодно, что такое "действие", а что такое "создатель действия"...
    2) Что такое редьюсер? Можете написать простой редьюсер без react/redux?*
    3) Для чего нужен redux-thunk? Как он работает? Напишите (можно псевдокод) асинхронный создатель действия (либо, если надоело говорить "терминами" - асинхронный aciton)
    4) Как компоненты приложения получают "пропсы" из "стора"?*
    5) Можно ли (и считается ли это нормальным) использовать state, если используется Redux?
    6) Почему в reducer'ax мы возвращаем новые объекты? Приведите пример, когда вы возвращаете новый объект, а когда тот же самый.
    6.5) А так же, "как в js вообще это работает?". Например:
    let obj1 { name: 'Test', age: 100 }
    let obj2 = obj1
    obj2.name = 'Test_new'

    Что будет в obj1, почему? В каких случаях объекты могут быть равны?
    7) Что возвращает функция connect (из react-redux)?
    ...

    Общее:
    0) package.json
    1) Webpack, gulp, etc...
    2) node.js
    3) promise

    Что-нибудь практическое:
    1) Как бы вы валидировали форму, если ошибки валидации приходят после submit'a ее на сервер..
    2) Почему не работает следующий код, сделайте чтобы работало
    ...
    На истину не претендую, но такие вопросы имели место быть на собеседованиях. В беседе можно многое разузнать дополнительными вопросами и так далее. Так же, если часть вопросов вам неизвестна - не беда, многие и на половину ответить не могут.

    p.s. возможно дополню...
    p.p.s. звездочкой отметил, на мой взгляд не самые необходимые для junior-собеседования вопросы.
    Ответ написан
    31 комментарий
  • Как получить данные до рендера страницы?

    tsepen
    @tsepen
    Frontend developer
    Так не делается, сначала отрисовывается компонент, потом запрашиваются данные. Если данных нет можно отобразить прелоадер до того как они подгрузятся. Пример по ссылке

    Это нужно для того чтобы пользователь увидел страницу сразу, также могут быть проблемы если сервер вернет ошибку - пользователь вообще ничего не увидит.
    Ответ написан
  • Полноценный пример SSR для react/redux?

    Да состояние собирается на сервере для каждого клиента (request'a), скажем на уровне мидлвара мы собираем состояние (текущего авторизованного пользователя, какие-то другие глобальные данные), далее отрабатывает обработчик маршрута, мы получили данные какой-то страницы из бд и передали их как контекст, примерно так:
    import React from 'react';
    import { StaticRouter } from 'react-router'
    import { Provider } from 'react-redux'
    import ReactDOMServer from 'react-dom/server';
    
    import App from './client/components/App.jsx'
    
    ReactDOMServer.renderToString(
    	<Provider store={ReduxStore}>
    		<StaticRouter
    			location={Url}
    			context={Context}>
    			<App/>
    		</StaticRouter>
    	</Provider>
    );

    Где, ReduxStore сгенерированное нами глобальное состояние (redux) запроса, Url запрошенный урл, Context контекст (будет передано как this.props.staticContext в компонент). Реакт вытянет нужный контейнер роута (по вашим маршрутам в App) и передаст ему контекст, компонент рендерится исходя из полученных данных. Результатом работы метода renderToString будет html строка (размеченная реактом), которую мы шаблонизатором или как угодно впиливаем в блок моунта компонента (в верстке), дополнительно в шаблонизатор передаем сгенерированное состояние, в документации выглядит вот так:
    window.__PRELOADED_STATE__ = JSON.stringify(preloadedState || {}).replace(/</g, '\\u003c')

    Теперь что происходит после того как страница загрузилась и подхватились клиент-скрипты? Все просто мы подхватываем состояние из window.__PRELOADED_STATE__ и вообщем-то все, глобальное состояние передано, компонент уже отрендерен, стоит учитывать что результаты при клиент-рендере и при сервер-рендере должны быть всегда одинаковыми, так же не использовать методы доступные браузеру, но не доступные серверу (на уровне моунта и первого рендера) и хорошенько следить за своим кодом в плане памяти, иначе при какой-либо утечке, память на сервере не будет вычищаться после каждого рендера.
    ---
    Как-то так, надеюсь помог, хотя там еще довольно много заковык
    Ответ написан
    20 комментариев
  • Оценка своего уровня. Как улучшить код?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    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),
    });
    Ответ написан
    12 комментариев
  • Можно ли автоматически расставлять иконки на MacOS 10.8.5?

    DevMan
    @DevMan
    открыть finder, нажать cmd + j, поставить нужные параметры.
    Ответ написан
    3 комментария
  • Как в Sublime Text 3 запускать код Python-a?

    @Vladisus
    Есть много вариантов, первый это ctrl + b, но он не поддерживает ввод. Поетому советую использовать SublimeRELP, установить его не так сложно, просто воспользуйтесь Package Control -> Install Package -> SublimeRELP. Теперь ви можете Tools -> SublimeRELP -> Python -> Run Current file. Но это поддерживает только Python2.7 и пользоваться не удобно. Для того что бы исправить это все открываем Preferences -> Key Bindings -> User и добавляем такое:

    { "keys": ["ctrl+b"], "command": "repl_open",
                     "caption": "Python - RUN current file",
                     "id": "repl_python_run",
                     "mnemonic": "d",
                     "args": {
                        "type": "subprocess",
                        "encoding": "utf8",
                        "cmd": ["python3", "-u", "$file_basename"],
                        "cwd": "$file_path",
                        "syntax": "Packages/Python/Python.tmLanguage",
                        "external_id": "python",
                        "extend_env": {"PYTHONIOENCODING": "utf-8"}
                        }
    	}


    (в квадратние скобки).
    Теперь при Ctrl + b все должно работать.
    Ответ написан
    5 комментариев
  • Заражение вирусами в ОЧЕНЬ большой сети?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    1. Админов расстрелять, по теме
    после модернизации количество работ было таким большим, что одноранговую сеть так и оставили.

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


    2.
    Операционную систему менять нельзя ни в коем случае, так как большинство лабораторных/диагностических программ очень старые, драйвера старые, под новыми системами не хотят дружить.

    Если простоя стоит миллионы долларов, то что мешает заплатить пару миллионов на решение это проблемы?
    Тут расстреливаем менеджеров, ну тех которых не расстреляли в п.1.

    3.
    На большинстве компьютеров антивирусная защита отсутствует как таковая, так как на большинстве рабочих станций стоит Windows 98 & XP

    Древняя ось, без обновлений (на большинстве уверен вообще обновы не ставились со времени установки), без банального антивируса.
    Чего вы ещё хотели то?

    Вирусные эпидемии как в вашей ситуации не лечатся путём "а прогоним отот комп антивирусом", их лечат путём "отрубить нахрень всё и переустанавливаем системы ибо хрен пойми какая сигнатура у этой дряни".

    Вы влетели по полной программе и решение тут только одно - модернизация железа/ПО, грамотный подход к сети.
    Ответ написан
    Комментировать
  • Дизайн приложения iOS?

    leshqow
    @leshqow
    -l-
    Для начала используйте mac
    Ответ написан
    Комментировать
  • Безопасно ли хранить файлы в архиве WinRar?

    x67
    @x67
    Обойдусь без демагогий. Winrar использует алгоритм шифрования AES с ключом 128 или 256 бит в зависимости от версии. И это на сегодняшний день очень надежный алгоритм, которые используется повсеместно. Если ваш 25 значный пароль смогут взломать за разумное время, можете не беспокоиться, так как у всего мира проблемы будут побольше. Поэтому используйте винрар 5 версии (ключ 256 бит) и не забывайте о криптопаяльнике, скорость взлома которым никогда не зависела от алгоритма шифрования)
    Ответ написан
    2 комментария
  • Безопасно ли хранить файлы в архиве WinRar?

    @XXX-prog
    20 символов включая спец символы + регистр символов, годы уйдут на подбор ключа для расшифровки. В общем спать можно будет спокойно.
    Ответ написан
    2 комментария
  • Как сделать адаптивным блок с картинками, чтобы высота и ширина менялись пропорционально?

    PavelMonro
    @PavelMonro
    Так правильно, Вы же задаете минимальную высоту и ширину.
    Вам нужно: width: 100%; height:auto; и если что ограничить max-with и max-height
    Ответ написан
    Комментировать
  • Универсальный алгоритм заработка с рекламы на сайтах, правильно ли я рассуждаю?

    @kuftachev
    Я редко употребляю слово WordPress без слово "говно", но это тот редкий случай. По факту, в этой теме Вы перекрываете собой долларов 100-200, так как WordPress - это все со нужно в данном варианте.
    Вы при этом собираетесь платить за сео, но забываете о стоимости контента, а в данном случае - это в разы больше, чем сео...
    Так могут делать или сеошники, или копирайтеры, закрывая часть трат собой.
    В общем, я думаю, если Вы хорошо посчитаете, то сильно передумаете.
    Ответ написан
    4 комментария
  • Как эффективно и не теряя времени дорасти до трудоустройства web-разработчиком?

    @Beltoev
    Живу в своё удовольствие
    Ты готов, дуй на собеседования
    Ответ написан
    Комментировать
  • Где найти пример идеального UX/UI?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Может кто наталкивался на хорошие статьи на тему, что бы ссылку дизайнеру кинуть или тыкнуть заказчика мордой в теорию.

    В последнее время сам себя тыкаю в замечательную статью - UX/UI Best Practices: 125 Easy Tweaks to Optimize .... Там обо всем простыми словами и с примерами.
    Ответ написан
    2 комментария
  • Хорошая книга по Теории вероятностей?

    sgjurano
    @sgjurano
    Разработчик
    Предлагаю классные курсы от товарища Райгородского:
    https://www.coursera.org/learn/probability-theory-... - тервер
    https://www.coursera.org/learn/kombinatorika-dlya-... - комбинаторика, если с ней у вас тоже не всё в порядке, в тервере она нужна
    Ответ написан
    3 комментария
  • Хорошая книга по Теории вероятностей?

    MarkNikitin
    @MarkNikitin
    Интересуют инновации, инвестицияии и стартапы
    Тут есть архив с методичкой и книгой по Теории вероятности
    Ответ написан
    3 комментария
  • Хорошая книга по Теории вероятностей?

    @raspier
    Java Developer
    Одна из лучших книг, сборник задач с решениями
    PS: Мне очень повезло у него учиться)
    Ответ написан
    Комментировать
  • Как выставить приоритет стиля?

    @Billy_Milligan
    Уже сказали
    1) подключить ваш style после бутсрапа
    2) на сайте можно выбрать элементы которые вам нужны и в css будут только они
    Если вам все же нужно их именно переопределить(это займет больше времени), а не переписать некоторые, то Каскадирование

    То есть, если у вас:
    .card {...}
    То:
    div.card{...}
    Имеет > силу

    Так что смотрите исходники и переопределяйте, потому что большинство стилей в bootstrap выглядят так

    ul.pagination li a {
        color: black;
        float: left;
        padding: 8px 16px;
        text-decoration: none;
    }
    Ответ написан
    1 комментарий
  • Как выставить приоритет стиля?

    iiiBird
    @iiiBird Куратор тега CSS
    Пока ты спишь - твой конкурент совершенствуется
    1) подключить ваш style после бутсрапа
    2) getbootstrap.com/customize здесь убрать галочки с Typography. ну и еще остальные можете поубирать и оставить только то для чего вам нужен бутсрап.
    Ответ написан
    2 комментария