• Как использовать Redux в Meteorjs, если там много коллекций?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Я так понимаю, нужно коллекцию подписывать на изменение в store. Дробить store на кусочки (кусочек для каждой коллекции) + использовать combineReducers. Бегло посмотрел вот этот материал (на англ.)
    Ответ написан
    Комментировать
  • Redux и MobX - плюсы и минусы, когда лучше что использовать?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Сразу скажу - не использовал MobX, но если вы читаете дальше - значит интересуетесь.
    Ответ про плюсы redux для меня лично - в самом конце.
    ---
    До React, писал на angular, и еще раньше на backbone. В ангуляр разработке у меня были места, которые я для себя объяснял: ок, так работает ангуляр (дайджест там, скоуп такой хитрый и т.д.) - факт был в том, что не все было прозрачно для меня лично.

    Начал разбираться с React и переписал часть рабочего проекта на React + Flux. В целом понравилось, но немного напрягало копирование однотипного кода. Появился redux, который (это важно) решил мою проблему. Все, тут я сделал остановку. Написал еще пару внутренних проектов - понравилось. Меня не напрягает ничего. Все уместно, код читается хорошо. Если я возвращаюсь к старому проекту - я очень быстро вникаю в "как это работает" и могу приступить к решению задачи.

    В процессе работы с Redux - появился Graph QL. Клево! Опять что-то новенькое - начал разбираться, и закрыл - так как быстро въехать не получилось, и попутно мне пришла простая мысль: зачем? Меня устраивает то, как работает связка React + Redux. Поэтому, я не стал вникать в saga, и пока что не хочется вникать в MobX. Возможно, это не правильно, ведь я их даже не смотрел, но свободное время от "вникания в новую технологию" я потратил на "дебри" технологий, которые активно использую.

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

    Главные плюсы redux для меня:
    + Если не трогал проект больше месяца - очень легко вспомнить что к чему.
    + Я пишу код. Я не вникаю в новое, я наращиваю знания по "старому" => я пишу быстро
    + Удобно тестировать

    Когда использовать:
    - когда хотите сделать одностраничное (SPA) приложение с нуля
    - когда хотите постепенно перевести старый проект на схему: вьюха (вся страница, или какой-то блок) + API запросы
    Ответ написан
    2 комментария
  • Как организовать React шаблоны в отдельных файлах?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    И вообще нормальна ли такая практика относительно react-а?

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

    Другое дело, что иногда в render функции компонента, удобно определить какой-то кусочек JSX в переменную. Например:

    let articlesHeaders
    if (this.props.articles.length > 0) {
      articlesHeaders = this.props.articles.map(item => <h4 key={item.id}>item.title</h4>
    } else {
      articlesHeaders = <button onClick={this.onTryAgainClick}> Try Again </button>
    ...
    return (
      <div> bla bla .... </div>
      {articlesHeaders}
      <div> bla bla ... </div>
    )

    Обычно используется, когда есть какое то условие в if / else, где относительно нашего примера в articlesHeaders могла бы быть разная разметка (шаблон).
    Ответ написан
    Комментировать
  • Что делает этот React.js код?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как ответил copal , вам, действительно, нужно закрыть пробелы в знаниях самого js. А потом уже читать туториал по реакту.
    Попробуйте в render компонента, сделать console.log(this.props) -> будет объект, с ключом data. Поэтому мы и пишем this.props.data.

    По поводу map. (как там написано - Функция, создающая элемент в новом массиве, принимает три аргумента, вот как раз первые два и есть "текущий элемент" и "индекс"

    p.s. учебник выбрали годный :) , но требуется повысить уровень основ JS, так будет лучше для обучения.
    Ответ написан
    3 комментария
  • Как оптимизировать mapDispatchToProps?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Есть хороший вариант: подключить actions через *

    import * as UserActions from '../actions/UserActions'
    ...
    const mapDispatchToProps = (dispatch) => {
      return {
        userActions: bindActionCreators(UserActions, dispatch)
      }
    }


    В таком случае, все действия юзера (а именно, все экспортируемые функции из файла UserActions) будут доступны из this.props.userActions (например, this.props.userActions.saveUser)

    Так же, можно не писать return, если вы возвращаете объект (как раз наш случай)
    const mapDispatchToProps = (dispatch) => ({
      userActions: bindActionCreators(UserActions, dispatch)
    })


    Обратите внимание на круглые скобки.
    Ответ написан
  • Локальная установка webpack?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    1. Да, вам нужен файл package.json, сгенерировать его можно с помощью npm init (по ходу отвечая на вопросы)
    2. Во втором видео на 52й секунде Илья устанавливает webpack "глобально":
    npm i -g webpack
    Поэтому у него хоть и нет в проекте папки node_modules - все корректно работает.

    Дополнительно:
    Если вы устанавливаете модули локально, создается папка node_modules, куда они собственно говоря и устанавливаются.

    P.S. советую посмотреть его скринкаст по node.js, чтобы стало понятно, как node.js ищет пакет, в упрощенном случае: сначала локально, потом глобально (почему упрощенно? потому что, так же еще ищет сначала у вас по относительному пути с расширением .js, потом .json, потом локально тоже самое в node_modules, потом глобально... Может быть что-то еще упустил, в скринкасте по node.js это точно было)
    Ответ написан
    4 комментария
  • Как установить nodejs определенной версии?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Update к ответу: если ставить NVM после того как стоит node.js - у вас, возможно, не будет желаемого результата.
    Поэтому: удалите полностью node.js со всеми модулями (включая глобальные) - https://www.google.ru/webhp?sourceid=chrome-instan..., затем установите NVM и установите node.js нужной версии через него.
    Ответ написан
    Комментировать
  • Как правильно обновить зависимости в MEAN stack приложении?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Когда facebook выкатывает новую версию react, они пишут:
    "Мы убрали такую-то штуку... 99% наших тестов прошло успешно, в остальном мы немного подпилили код и вуаля".
    То есть, однозначно, с тестами обновиться вам будет проще. Но писать тесты для всего приложения (не своего, да еще и с небольшим опытом) - это объемная и долгая задача.

    По сути, если вы оцените время на написание тестов - это будет в худшем случае половина, в лучшем 9/10 общего времени на задачу.

    На мой взгялд, если не стоит задачи заработать денег / закрыть критический баг - не стоит вовсе обновляться.

    Есть Вредный совет для успокоения души:
    Взять проект, создать отдельную ветку, удалить папку node_modules, установить утилиту npm-check-updates и посмотреть для скольких пакетов у вас есть обновления. NCU так же укажет, что "для некоторых пакетов есть новые версии, которые превышают правило в package.json". Если готовы обновить вообще все, используйте ncu -a, а потом npm install. Запускайте приложение и смотрите сколько будет errors/warnings.
    Ответ написан
    Комментировать
  • Как в webpack убрать неиспользуемые модули?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Webpack собирает то, что вы подключаете. Есть пара советов:
    1. Подключать аккуратно (например, вместоimport _ from lodash, использовать import func_name from lodash/func_name)

    Разработчики стараются оптимизировать импорт, поэтому смотрите на подобные возможности у других библиотек (например).

    2. Как вы и написали в вопросе - удалить из бандла (конечного файла скриптов) неиспользуемый код. В этом может помочь, например, uglifyJS. Он должен вырезать все неиспользуемое. Точных настроек не приведу (список), но можете взглянуть на этот вопрос

    3. Использовать линтер, например eslint.org/. Запустить lint по кодовой базе и удалить все неиспользуемые (но подключенные) модули.

    p.s. пока писал ответ на ваш вопрос, наткнулся еще на webpack-bundle-size-analyzer. Сам не использовал, но возможно поможет.
    Ответ написан
    Комментировать
  • Как использовать модуль FS внутри приложения Electron.Atom\WebPack?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Попробуйте посмотреть этот вопрос. (к сожалению, на англ.)
    p.s. в комментариях решили проблему, поэтому читайте последний.
    Ответ написан
    5 комментариев
  • Как передать и обновлять значение параметра в react?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    "Нужно больше кода".

    Тем не менее, предположу:
    а) при изменении topbarVisible "где-то там" - значение не изменяется (передается undefined/другое свойство, и topbarVisible остается не тронутым)
    б) параметр изменяется, но в цепочке родителей-потомков есть shouldComponentUpdate, который блокирует изменение.

    Нужно проверить всю цепочку. Где изменяется topbarVisible? В этом компоненте с помощью console.log / debugger посмотреть изменяется ли. Если все ок - идти дальше по цепочке, и смотреть в какой из компонентов новое значение props не пришло (либо console.log в componentWIllReceiveProps, либо debugger по шагам (кнопочка play), либо просто react панель-разработчика в консоли).

    update: поздно заметил, почему у вас this.topbarVisible? Это разве не свойство, которое пришло в props? Если вы используете state, все равно не ясно зачем свойство подключать через this.
    Ответ написан
  • Какой фреймфорк для Node.js(плюс React.js на клиенте) выбрать?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Подскажите, какой фреймворк выбрать для node.js, при условии, что на фронтенде будет React.js ?

    Не вижу связи.

    А по фреймворкам для сервера на node, я не слышал ничего популярнее express / koa.

    Возможно, вам вовсе не нужен фреймворк для реализации чата.
    Ответ написан
    3 комментария
  • Какие основные понятия в архитектурах Flux, Reflux, Redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    в redux у вас есть:
    store - состояние всего приложения в одном(!) объекте. Для удобства, вы конечно бьете "store" на кусочки и изменяете/обновляете его не целиком, но в конечном счете объект store все равно один.
    actions - действия. Все изменения в redux приложении делаются действиями. Например: Действие(тип: ДОБАВИТЬ_ОДИН)
    actions creators* - создатели действий. Функции, которые вы можете вызывать, вместо того, чтобы вызвать действие, напрямую. Например:
    function add() {
      return { тип: ДОБАВИТЬ_ОДИН }
    }

    reducer - редьюсер. Функция которая принимает текущий объект store, и возвращает новый (с новыми данными).

    Итого: в redux фундаментальных понятий всего три: действие (action), редьюсер (reducer) и состояние (store)

    В реакте и того меньше: есть одно понятие - компонент. А уж там, если хочется: умный/тупой компонент, stateless компонент и может быть что-то еще.

    p.s. в коде функций присутствует русский язык для наглядности.

    p.p.s. туториалы: react для начинающих, создание приложения с использованием redux
    Ответ написан
    2 комментария
  • Как заставить триггер срабатывать при каждом событии?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    $( "input[name='payment_method']" ).on('keyup', function() {
      $(document.body).trigger('update_checkout');
    });


    p.s. посмотрите разницу между событиями: keyup, keypres и keydown (выберите подходящее)
    Ответ написан
  • Автоматизация тестирования ractjs/redux enzym + mocha, с чего начать?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Начать с unit-тестов для редьюсера и создателей действий. Хорошо описано на 1й странице документации - redux.js.org/docs/recipes/WritingTests.html

    По тестированию интерфейса - не силен в этом, но enzym выглядит очень круто, даже лучше чем стандартные реактовские утилиты для тестирования.

    Еще недавно вышла Hypernova

    P.S. вы бы вопросику еще тэг "react" поставили, было бы больше просмотров. Я и не знал, что есть на тостере тэг redux.
    Ответ написан
    Комментировать
  • Как узнать из какого модуля ошибка?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как узнать?
    Поиском по проекту "React.findDOMNode", но я подозреваю, что это где-то в самом верхнем компоненте у вас. Либо просто поиском по "findDOMNode", так как где-то может быть подключено так: import React, {findDOMNode} from 'react'

    Как исправить?
    а) npm install react-dom
    б) везде где используете React.findDOMNode заменить на findDOMNode, предварительно в каждом файле проимпортировав: import { findDOMNode } from 'react-dom'

    Суть ошибки в том, что функция findDOMNode переехала в отдельный пакет, а у вас она используется из пакета 'react'.
    Ответ написан
    1 комментарий
  • Простой пример Drag and Drop на ReactJs?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    https://gaearon.github.io/react-dnd/ (от создателя Redux)
    p.s. не знаю "небольшой" ли. Кода на github'e там порядком (но если присмотреться повнимательнее, окажется, что все не так плохо)
    Ответ написан
    Комментировать
  • Возможно ли создать полноценное SPA приложение на React.js?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Конечно можно. React + Redux и дело в шляпе.
    Для роутинга - react-router.
    Для сборки/минификации/использования es6 и т.д. - webpack+babel
    Для тестов - ммм, пожалуй, "мир реакта" просто сказка в вопросах тестирования. Есть много отличных инструментов.

    ---
    В дополнение к предыдущему ответу: выбирать новую технологию для проекта стоит, только если сроки позволяют ( о чем там в принципе и написано). Использовать react для какой-то отдельной страницы/части можно.

    Как сказал, Dan, создатель Redux (примерно, по памяти):
    "Если у вас нет времени изучать А, то А не требуется на этом проекте"
    Ответ написан
    1 комментарий
  • Как открывать заново текущий rout React.js, после перезагрузки страницы?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Я правильно понимаю, что у вас есть проект, на котором реакт рендерит лишь некоторые вьюхи? (то есть, только некоторые страницы?)
    В таком случае, вы можете сделать отдельные сборки для каждой страницы без использования роутинга вообще. Или, зачем он вам в таком случае?

    То есть: есть страница about на реакте, сделайте для нее bundle-about.js, для contacts на реакте - bundle-contacts.js и так далее.
    Ответ написан
    2 комментария
  • В каждом файле по умолчанию подключены несколько node modules?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Про директории не в курсе, а в файлах можно не импортировать, для этого нужно использовать webpack-provide-plugin

    ...
      plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new webpack.ProvidePlugin({
          'React':     'react'
        })
      ],
    ...


    Здесь немного подробнее ( переведу последний пример - как импортировать сразу несколько...)

    new webpack.ProvidePlugin({
        '$':          'jquery',
        '_':          'lodash',
        'ReactDOM':   'react-dom',
        'cssModule':  'react-css-modules',
        'Promise':    'bluebird'
      })


    Позволит вам не писать в файлах:

    import ReactDOM from ‘react-dom’
    import _ from 'lodash'
    import $ from 'jquery'
    import cssModule from 'react-css-modules'
    Ответ написан
    1 комментарий