• Оценка своего уровня. Как улучшить код?

    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 комментариев
  • Как сделать быстрый ввод тегов В PhpStorm?

    @pu6elozed
    Bitrix, fullstack
    Это называется в шторме live templates. Там можно указать свои собственные шаблоны ака сниппеты. Собственно автор скорее всего так и сделал
    Ответ написан
    Комментировать
  • Как в JS проверить является ли объект файлом?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    var isFile = file instanceof File
    Ответ написан
    Комментировать
  • Как работает подход Unit of Work?

    @Flying
    Unit of Work - это паттерн определяющий логическую транзакцию т.е. атомарную синхронизацию изменений в объектах, помещённых в объект UoW с хранилищем (базой данных).

    Если обратиться к исходному описанию этого паттерна у Мартина Фаулера - то видно что объект, реализующий этот паттерн отвечает за накопление информации о том какие объекты входят в транзакцию и каковы их изменния относительно исходных значений в хранилище. Основная работа производится в методе commit() который отвечает за вычисление изменений в сохранённых в UoW объектах и синхронизацию этих изменений с хранилищем (базой данных).

    Паттерн Unit of Work как правило не является полностью самостоятельным, он обычно тесно связан с паттерном Identity Map, задача которого - сохранение карты созданных объектов, взятых из хранилища с тем чтобы гарантировать что одна единица информации из хранилища представлена ровно одним экземпляром объекта данных в приложении. Это позволяет избежать конфликтов изменений т.к. не допускает ситуации когда два объекта, представляющих один и тот же элемент данных в хранилище, изменены по-разному. Информация из Identity Map используется в методе commit() паттерна Unit of Work для вычисления разницы между исходными данными и накопленными изменениями.

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

    Также, если данные в хранилище не являются независимыми (к примеру связи между таблицами в базе данных) - может потребоваться реализации ряда паттернов, отвечающих за сохранение информации о связях между данными (это паттерны раздела Object-Relational Structural Patterns в каталоге паттернов).

    Подводя итог: сам по себе Unit of Work довольно прост в своём внешнем интерфейсе, но реализация его корректной работы требует предоставления множества дополнительных данных, поэтому миниатюрных примеров привести не могу.

    Если говорить о PHP - то лучшей реализацией этих паттернов на PHP безусловно является Doctrine ORM. В частности в разделе Working with Objects документации Doctrine можно найти хорошее описание и множество примеров использования паттернов, описанных выше.
    Ответ написан
    6 комментариев
  • На чем зарабатывает Quora, toster или подобные сайты?

    shmatuan
    @shmatuan
    8 year of Web, 5 years of Vue
    Можно просто выключить адблок и увидеть ответ
    5bd0447166cd2277435374.png
    Ответ написан
    Комментировать
  • Документирована ли postMessage?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Там же в документации есть и ссылки на спецификации: https://developer.mozilla.org/ru/docs/Web/API/Wind...

    MDN вполне можно доверять, если что-то не соответствует стандарту, там это указано.
    Ответ написан
    Комментировать
  • Интернет-магазин на nodejs?

    Sanes
    @Sanes
    Javascript плохо дружит с математикой. Не биллинг конечно, но я бы задумался.
    Ответ написан
  • Как переопределить функцию в классе EloquentUserProvider?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Документацию не читаете по религиозным причинам или каким-то иным?
    Ответ написан
    1 комментарий
  • Как переопределить функцию в классе EloquentUserProvider?

    Astatroth
    @Astatroth
    Я тут случайно
    Создайте свой провайдер, наследующий EloquentUserProvider, зарегистрируйте и переопределяйте сколько душе угодно.
    Ответ написан
    Комментировать
  • Как проверить значение по регулярному выражению, пришедшему с сервера?

    bubandos
    @bubandos
    bash'у, javascript'ую, php'лю, css'аю, html'каю
    new Regexp() в помощь
    Ответ написан
    Комментировать
  • В чем удобство ставить boolean константу/строку/число в начале выражения?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Это yoda style
    Ответ написан
    Комментировать
  • В чем удобство ставить boolean константу/строку/число в начале выражения?

    DevMan
    @DevMan
    чтоб по ошибке не написать = вместо ==/===
    ($media->delete() = false) - валидно
    (false = $resource->delete()) - не валидно

    других причин нет.
    Ответ написан
    2 комментария
  • Как лучше сделать такую штуку, плагин или самопис?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    плагин или самопис?

    слайдер можно взять готовый, а вот переключение слайдов в зависимости от выбора в форме надо дописать ручками
    Ответ написан
    Комментировать
  • Что нужно иметь и знать в фреймворке React джуну?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Хороший кандидат на должность Junior React Developer, по моему мнению, должен соответствовать следующему перечню требований:
    1. Хорошее знание JavaScript. В React разработке используется ES6 и большинство экспериментальных фич еще не вошедших в стандарт.
    2. Хорошее знание HTML и CSS. Кроссбраузерная верстка. Так же, хорошо иметь представление о том, что такое css-in-js.
    3. Web APIs. Умение работать с объектной моделью документа(DOM) и все эти XMLHttpRequest, localstorage, cookie, history и прочее.
    4. Хорошее знание API React. Вы должны хорошо знать React, знать его возможности, понимать основные концепции и уметь ответить на большинство типовых вопросов. Для этого достаточно хорошо изучить документацию, разобрать пару типовых проектов на github и попрактиковаться. Много полезной информации, приёмов и идей можно подчерпнуть из тематических статей и докладов. Так же, на просторах интернета можно найти подборки типовых вопросов, часто задаваемых на собеседованиях. В англоязычном сегменте их больше.
    5. Redux. Уверенное знание API. API библиотеки до боли пост. Знать, что такое промежуточное ПО и зачем оно. Понимать базовые концепции архитектуры Flux. Все это есть в документации и многочисленных курсах.
    6. Умение работать с менеджером пакетов npm на базовом уровне.
    7. Node.js. Хотя бы уметь написать простейший express/koa сервер, который будет отдавать ваше приложение и статику.
    8. Webpack. Базовые знания.
    9. Умение работать с git. Хотя бы знать и уметь примерять команды: init, clone, add, commit, push, pull, merge, checkout.
    10. Иммутабельность. Четкое понимание зачем это надо. Знание приемов иммутабельного изменения структур данных. Это есть в официальном туториале React.
    11. Статическая типизация TypeScrpt/Flow. Для начала хватит самых основ и способности понимать чужой код.
    12. Функциональное программирование. Хватит знаний полученных в процессе изучения JavaScript, а так же не помешает знать, что такое каррирование, чистые функции и рекурсия.
    13. Базовые концепции ООП. Хватит знаний полученных в рамках изучения JavaScript.
    14. Асинхронный код. Понимать как его правильно организовывать. Promise, async/await.
    15. Сетевые протоколы передачи данных. Вполне хватит базовых знаний о http/https, о том, что такое заголовки и какие они бывают. Хорошо знать о том, что такое websocket.
    16. За плечами должен быть хотя бы один учебный проект на React. Хватит типового тестового задания.
    Примеры таких заданий: 1, 2, 3(сайт может быть не доступен на территории РФ, советую отрыть через VPN и посмотреть), 4, 5. Если подобного проекта у вас нет, то будьте готовы, что потенциальный работодатель предложит вам выполнить тестовое задание и только по его результату вас, может быть, пригласят на техническое интервью. Если напишите хорошо, вас скорей всего пригласят.
    17. Желателен опыт создания типовых UI элементов. Например, чтобы не вызывало трудностей написать простой кастомный чекбокс. Куча примеров реализаций типовых элементов есть на codepen.

    Это не красный минимум знаний и во многих компаниях требования могут быть значительно ниже. Но соответствие вышеперечисленым пунктам будет хорошим аргументом для работодателя остановить свой выбор именно на вашей кандидатуре.

    Похожий вопрос.
    Ответ написан
    18 комментариев
  • В чем разница pojo и dto?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    POJO - это аббревиатура от Plain Old Java Object, что в переводе значит "обычный объект Java". А DTO - это аббревиатура Data Transfer Object, то есть "объект передачи данных". POJO - это широкий термин, используемый обычно для того, чтобы подчеркнуть отсутствие тесной связи класса с конкретным фреймворком. DTO - более узкое определение из области архитектуры, ограничивающее область применения класса. Как следствие, DTO - это подвид POJO.
    Ответ написан
    2 комментария
  • Какую книгу мне лучше начать изучать по PHP с нуля, в которой много практики (чем больше, тем лучше)?

    @marlboro13
    делал, делаю и буду делать сайты на PHP
    на русском Котеров, Семидянов "РНР 7 в подлиннике" ее в основном все советуют, сам по ней учился
    Ответ написан
    2 комментария
  • Есть ли метод «this» у «while»?

    rockon404
    @rockon404
    Frontend Developer
    Есть ли метод «this» у «while»?

    this - это не метод.

    Можно ли к внутри цикла «while», как-нибудь обратиться к найденному [в условии] результату?

    Нет.

    Решение вашей задачи:
    [].forEach.call(document.querySelectorAll('article p'), function(node) {
      node.remove();
    });
    Ответ написан
    1 комментарий
  • Какой метод перебора массивов JS использовать и как?

    0xD34F
    @0xD34F Куратор тега JavaScript
    map/filter:

    arr.map((n, i) => n ? i : null).filter(n => n !== null)
    // или
    arr.map((n, i) => n ? i : NaN).filter(n => n === n)
    // или
    arr.map((n, i) => !!n && i).filter(Number.isInteger)
    // или
    arr.map((n, i) => !n || i).filter(n => n !== !0)

    reduce:

    arr.reduce((acc, n, i) => n ? [ ...acc, i ] : acc, [])
    // или
    arr.reduce((acc, n, i) => (n && acc.push(i), acc), [])

    или, если надо изменить текущий массив, а не создавать новый

    for (let i = arr.length; i--;) {
      if (arr[i]) {
        arr[i] = i;
      } else {
        arr.splice(i, 1);
      }
    }
    
    // или
    
    arr.reduceRight((_, n, i, a) => n ? a[i] = i : a.splice(i, 1), 0);
    
    // или
    
    arr.splice(0, arr.length, ...любое_выражение_с_map/filter_или_reduce_из_показанных_выше);
    
    // или
    
    let count0 = 0;
    
    for (const [ i, n ] of arr.entries()) {
      arr[i - count0] = i;
      count0 += !n;
    }
    
    arr.length -= count0;
    Ответ написан
    Комментировать
  • Как работает applyMiddleware?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Что именно непонятно, как работает ()() ?
    Такая запись понятна?
    function sum(x) {
       return function(y) {
        return x+y
      }
    }
    
    sum(1)(2) // 3
    sum(1) // Function


    В документации посмотрите на:
    - Arguments
    - Returns

    promiseMiddleware получает в качестве аргументов dispatch и getState (хоть это и не прописано явно, типа promiseMiddleware(dispatch, getState)).

    applyMiddleware(promiseMiddleware) - возвращает функцию, поэтому можно вызвать (скобочки) ее, куда передается createStore аргумент, который импортирован выше из библиотеки redux.
    Ответ написан
    5 комментариев
  • Какой мессенджер использовать для автоматической рассылки уведомлений внутри компании?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Если что-то не важное и нужно быстро: HOP E-mail (работает как почтовый клиент с удобным интерфейсом в виде мессенджера)

    Мессенджер для уведомлений - странная затея (и больше похоже на пафос).
    Есть стандартные варианты:
    1. SMS - оперативное уведомление,
    2. ПОЧТА (E-mail) - НЕ оперативное уведомление.

    Если компании нужно оперативное мобильное общение: тогда ставится IM-сервер и под него подбирается создаётся свой корпоративный клиент (+изменяются нормативные документы обязанностей всех сотрудников).

    Кроме своего XMPP-сервера (jabberd, openfire), также, можно использовать любой публичный протокол (Телеграмм и т.д.), имеющий открытое API для создания своего клиента (или бота), в "связке" со своим клиентом! и алгоритмом шифрования/дешифрования для корректного обмена сообщениями.

    PS: Можно разработать свой почтовый клиент, который может работать по IMAP-протоколу с почтовым сервером конторы и на все отправляемые уведомления (почтовые сообщения с коротким текстом) требовать подтверждения прочтения, которое после открытия сообщения на просмотр, будет автоматически отсылаться мобильным клиентом на почтовый сервер.
    Ответ написан
    3 комментария