• Какова суть фреймворков и библиотек?

    sHinE
    @sHinE
    веб-разработчик, php/js/mysql и сопутствующее
    Про отличие фреймворка и библиотеки видел такую фразу и она мне понравилась:
    Библиотеку ты вызываешь из своего кода, а фреймворк наоборот вызывает твой код.
    Ответ написан
    Комментировать
  • Какова суть фреймворков и библиотек?

    Stalker_RED
    @Stalker_RED
    Библиотека это инструмент или набор каких-то инструментов.
    Бибилиотека для скачивания видео с ютуба
    Бибилиотека для кропа и ресайза картинок
    Бибилиотека для определения города по IP

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

    "набор для постройки скворечника"
    В комплекте молоток, гвозди, столярный клей, 20 деревянных досточек разных форм и расцветок и инструкция с тремая вариантами скворечника на выбор.

    Или вот два фреймворка:
    Ezva9I.pngzC6ZHT.png
    Можно ли их использовать вместе? (Конечно, никто не запрещает)
    Можно ли из этих деталей построить что-то совсем другое, не такое как в инструкции? (Конечно да)
    Можно ли с этими фреймворками использовать детали еще и из этого?
    lGjE1A.png
    (конечно можно, но придется что-то придумать для совместимости деталек. Быть может придется применить клей, изоленту, пластилин или жвачку. Или шуруповерт, или сварочный аппарат. Но ни в один комплект эти дополнительные инструменты не входят, как и скиллы к ним.)

    Можете посмотреть еще сюда, этот ответ частично покрывает ваш вопрос:
    Для чего нужны фреймворки, а-ля Laravel?
    Ответ написан
    Комментировать
  • Как отложить выполнение кода пока не будет получен ответ от сервера?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нужно держать состояние диалога, индивидуальное для каждого пользователя.

    Команды пользователя складывать в очередь, и как-то помечать, «где мы сейчас»: ждём очередную команду от пользователя или ждём ответа от сервера.

    Состояние можно держать в Redis, MySQL или другой БД. Входящее сообщение от пользователя содержит его from.id – по нему идентифицируется диалог и берется его состояние.

    Промисы и прочая асинхрота тут не поможет, так как дело шире, чем один запрос.
    Ответ написан
  • Как правильно использовать async/await в связке react-redux?

    @afanasiyz
    Javascript-разработчик
    Можно и без redux-thunk.
    Просто создаете middleware

    const someMiddleware = store => next => action => {
      if(action.type === 'Нужный_вам_экшн'){
         loadData(store.dispatch);
      }
    }


    где loadData - асинхронная функция
    const  loadData = async(dispatch) =>{
      const resultData = await fetchDataFromServer();
      dispatch(actions.saveData(resultData));
    }


    Внутри компонента Вы, соответственно, вызываете экшн "Нужный_вам_экшн", его отловит someMiddleware, вызовет функцию loadData, которая собственно и сделает запрос к серверу.
    Ответ написан
    Комментировать
  • Fetch вместо axios?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    можно условно считать, что fetch это низкоуровневая реализация, а axios - более высокоуровневая библиотека. Fetch он вам предоставляет минимум для работы с запросами, в аксиос есть дополнительные интересные плюшки. И вы вероятно правы, - если написать обертку над фетчем (а ее скорее всего придется писать в более или менне непростом сайте), то получится как минимум кастрированный аксиос, как максимум — что-то лучше.
    Ответ написан
    Комментировать
  • Как правильно сделать модель юзеров с ролями? Есть ли примеры/практики авторизации с ролями?

    planc
    @planc
    const ADMIN = 0b11111111
    
    const CAN_DELETE = 0b00001000
    const CAN_EDIT =   0b00000100
    const CAN_WRITE =  0b00000010
    const CAN_READ =   0b00000001
    
    const REGULAR_USER = CAN_WRITE | CAN_READ
    const ANONYMOUS = CAN_READ
    const BANNED = 0b0
    
    const MODERATOR = REGULAR_USER | CAN_EDIT | CAN_DELETE
    
    class User {
      constructor(name, mask) {
        this.name = name;
        this.mask = mask;
      }
    }
    
    
    const users = [
      new User('admin', ADMIN),
      new User('moder', MODERATOR),
      new User('regular_user', REGULAR_USER),
      new User('anon', ANONYMOUS),
    ]
    
    
    users.forEach( u => {
      console.log(u.name);
      if ((u.mask & ADMIN) === ADMIN) {
        console.log('\t ADMIN');
      }
      if ((u.mask & MODERATOR) === MODERATOR) {
        console.log('\t MODERATOR');
      }
      if ((u.mask & REGULAR_USER) === REGULAR_USER) {
        console.log('\t REGULAR_USER');
      }
      if ((u.mask & CAN_EDIT) === CAN_EDIT) {
        console.log('\t CAN_EDIT');
      }
      if ((u.mask & CAN_DELETE) === CAN_DELETE) {
        console.log('\t CAN_DELETE');
      }
      if ((u.mask & CAN_WRITE) === CAN_WRITE) {
        console.log('\t CAN_WRITE');
      }
      if ((u.mask & CAN_READ) === CAN_READ) {
        console.log('\t CAN_READ');
      }
    });


    admin
    	 ADMIN
    	 MODERATOR
    	 REGULAR_USER
    	 CAN_EDIT
    	 CAN_DELETE
    	 CAN_WRITE
    	 CAN_READ
    moder
    	 MODERATOR
    	 REGULAR_USER
    	 CAN_EDIT
    	 CAN_DELETE
    	 CAN_WRITE
    	 CAN_READ
    regular_user
    	 REGULAR_USER
    	 CAN_WRITE
    	 CAN_READ
    anon
    	 CAN_READ
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Для чего замыкание существуют?
    Для инкапсуляции данных.
    В ООП есть модификаторы доступа (private, protected), которые закрывают доступ к данным извне класса, но позволяют обращаться к ним из методов.
    В ФП для этой задачи используют замыкания, закрывая данные внутри функции. Из вне данные недоступны, но вложенные функции имеют к ним доступ.

    2. В каких условиях они создаются?
    Когда вложенная функция обращается к переменным внешней функции.

    Хоть и просили без примеров, но на примере показать проще:
    // makeCounter - внешняя функция
    function makeCounter(initialValue) {
      var value = +initialValue || 0;
      // counter - внутренняя функция
      // она использует переменную value из внешней функции
      // что-бы это было возможным, для counter создается замыкание,
      // в котором хранится переменная value
      // переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
      return function counter() {
        return value++;
      };
    }
    
    // у нас 3 экземпляра функции counter
    var counter1 = makeCounter();
    var counter2 = makeCounter();
    var counter3 = makeCounter(100);
    // и для каждой есть своя переменная value
    console.log(counter1()); // 0
    console.log(counter1()); // 1
    console.log(counter2()); // 0
    console.log(counter1()); // 2
    console.log(counter3()); // 100
    
    // а вот получить как-то напрямую переменную value мы не можем
    // инкапсуляция нам не дает поломать данные
    Ответ написан
    Комментировать
  • Что означает каждыи аргумент функции в своих скобках?

    Rema1ns
    @Rema1ns
    и так сойдет
    Ответ написан
    Комментировать
  • Актуально ли изучать nodejs для бекенда или лучше оставаться на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Изучать надо программирование.
    Все эти вопросы, "Какую машину лучше учиться водить - Рено или Фольксваген?" - это детский сад, честное слово.
    Если для вас потолок - это несколько десятков встроенных функций одного языка, то всё равно что учить - ковыряться помаленьку можно на любом.
    Программист же мыслит не инструкциями, а алгоритмами, паттернами, потоками данных, структурами объектов, шинами сообщений. На каком языке это все реализуется - не принципиально.
    Ответ написан
    2 комментария
  • Что подучить в добавок к PHP / JQuery веб разработчику?

    serginhold
    @serginhold
    с фреймворками знакомься, можно с микро начать, slim или silex, а потом полноценный пробовать: laravel, symfony, yii.
    на фронте vue или react, совместно с webpack.
    Ответ написан
    2 комментария
  • Как организовать код для небольшого лендинга?

    alex-1917
    @alex-1917
    Если ответ помог, отметь решением
    Типовой лендинг (не такой конечно как сказал пан Профессор08 на какие-то фантастические тысячи строк кода))), за такой лендинг меня бы убил мой СЕО-шник ) касаемо js:

    1. фэнсибокс
    2. слик
    3. скролл по #
    4. моб меню
    5. табы
    6. хрень для параллакса бекграунда или элементов

    Из этого списка п.1 и п2 - можно подключать в видеобновляемых библиотек, НО я лично уже год как собрал их в общий js, так как то, что там авторы периодически обновляют - хрень на пустом месте, не нужно оно, эти либы даже в версии 2017 года пашут железобетонно!
    далее - п.3,4,5 - ПЯТЬ строчек))) (хотя кто-то для табов прицепляет бутстрап)))
    п.6 - редко для особо "одаренных" клиентов)))

    На круг: один js файл обеспечивает все потребности типового лендинга, плюс 2 строчки кода для подключения к классам в зависимости от верстки, что тоже можно обойти (и НАДО обходить!), используя одни и те же классы от клиента к клиенту!
    Ответ написан
    7 комментариев
  • Как организовать код для небольшого лендинга?

    filgaponenko
    @filgaponenko
    frontend developer
    Хорошей практикой будет разбивка кода покомпонентно.
    Это даст вам более четкое понимание структуры проекта и позволит в случае необходимости переиспользовать эти компоненты в будущем.

    Примерная структура может быть такой:
    ./
    index.html
    src/
      /scss
        _header.scss
        _slider.scss
        ...
      /js
        /header.js
        /slider.js
        ...


    После этого собираете эти модули любимым сборщиком и радуетесь структуре)
    Ответ написан
    Комментировать
  • Как задеплоить React приложение с секретным ключем для апи?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Судя по доке:
    now secret add acme-api-key my-value-here

    https://zeit.co/docs/features/env-and-secrets
    Ответ написан
    1 комментарий
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @WhoMe
    UPD:
    > Это нормально что в контроллере столько много catch'eй?
    Не то чтобы нет, но "попахивает".
    > как быть, если у меня возникает несколько исключений, и я хочу выдать пользователю информацию о всех возникших сразу

    У вас смешана валидация входных параметров с возникновением нештатных ситуаций.
    Exception стоит кидать если метод не может вернуть осмысленный результат.
    Ошибки валидации ("сообщение слишком длинное", "файл не того расширения") можно собирать, к примеру, в массив. Как валидировать входные данные выходит за рамки этого вопроса.
    ------
    > Можно ли так делать?
    Попробуйте использовать правило 5 почему (ну или "зачем") чтобы попытаться добраться до сути.

    - Я даю отдельные имена исключениям.
    - Зачем?
    - Для того что бы отловить различные ошибки.
    - Зачем отлавливать различные типы ошибок?
    - Чтобы показывать разные сообщения.
    - Зачем показывать разные сообщения?
    - Чтобы пользователь мог отреагировать определенным образом на конкретный тип ошибки
    (решить что ему делать в случае конкретного исключения).

    Давайте посмотрим что человек (пользователь) на вашем сайте (системе) может сделать в случае ошибки:
    1. Не корректное сообщение.
    Привести его к корректному (сделать его короче, как-то отформатировать и т.п.)

    2. Не удалось загрузить файл.
    Если файл слишком большой - можно попробовать загрузить файл поменьше.
    Если это внутренняя ошибка (например: закончилось место на диске на сервере, нет прав на запись и т.п) - то ничего, здесь уже требуется вмешательство тех кто обслуживает систему.

    3. Ошибка PDO.
    Ничего, это внутренняя ошибка.

    Т.е. есть смысл создавать новый тип исключения, если пользователь системы может иначе отреагировать на этот тип.

    Я использую 2 типа исключений на уровне web-слоя: внешние и внутренние.
    Внешние - если пользователь может повлиять на них (страница не найдена, файл слишком большой, нет доступа и т.п.).
    В них сообщение показывается пользователю как есть. Подноготная (пути к файлам, пароли, названия БД и т.п) в такие ошибки не вкладывается.

    Внутренние - пользователь не может влиять (ошибка подключения к БД, SQL syntax error и т.п).
    Пользователю показывается только код ошибки. В такие ошибки также вкладываю техническую информацию.

    Ты (как программист) также можешь быть пользователем какой-то системы (к примеру, библиотеки).
    Например, библиотеки для работы с БД.
    Предположим ты импортируешь csv-файл в базу, заполняешь числовую колонку и вместо числа у тебя попадается текст.
    Запрос падает с ошибкой и тебе не плохо бы отличать её от ошибки синтаксиса.
    Если попался текст вместо числа - то можно просто пропустить строку.
    Если ошибка синтаксиса - то у ошибка в коде и продолжать импорт нет смысла.

    Подытожу:

    > Можно ли создавать свои пустые классы Exception'ов наследуемые от класса Exception только лишь для того что бы было отдельное имя исключения?

    Можно.

    Сколько делать отдельных исключений?
    Зависит от того как их будет обрабатывать пользователь.
    Если твой контроллер(модель, подсистема) кидает множество разных ошибок и все они обрабатываются одинаково - то стоит призадуматься.
    Ответ написан
    3 комментария
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    Практика хорошая. Именно так и стоит делать. В идеале у каждой ошибки должен быть свой уникальный эксепшн. Например, от FileException можно наследовать например NotFoundFileException и AccessFileException. При этом тело классов в большинстве случаев будет пустым.

    А вот то, что ты пытаешься поймать все возможные эксапшны в контроллере - это совсем не хорошо. По хорошему нужен отдельный эксепшн хендлер для этого.
    Ответ написан
    6 комментариев
  • В чем практическая польза итераторов в JS?

    search
    @search
    мама говорит что я особенный
    Полезность итераторов в том что это открытый интерфейс для любой структуры данных. Как вы уже поняли, любой класс/объект в JS может обладать интерфейсом итератора. Идея итератора в том чтобы скрыть внутреннее представление структуры данных от потребителя этих данных. Например, если вы работаете с какими-либо замысловатыми структурами данных, типа бинарных деревьев. Пользователю совсем не обязательно знать как ваш класс/объект хранит бинарное дерево. Пользователь просто его получает и проходит по всем его элементам в цикле. В дальнейшем, вы можете, при необходимости, заменить одну структуру данных на другую, не меняя самого пользователя. Например, вы можете заменить бинарное дерево на б-дерево прозрачно для самого пользователя (пользователь не будет знать что вы подменили структуры, он по прежнему получает что-то что можно проитерировать и ему этого достаточно).

    Для того чтоб глубже понять суть вопроса, можно погуглить про инкапсуляцию и SOLID (в вашем случае, принцип Open/closed).
    Ответ написан
    1 комментарий
  • Какова суть генерации своих событий в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробую на пальцах объяснить.

    Событие – это конверт, на котором написано его название. Внутрь конверта можете вложить что-нибудь, а можете оставить конверт пустым.

    Элемент – это столик. Кто угодно может подойти и положить на столик свой конверт.

    Слушатель – это мужик, который топчется около столика и смотрит, нет ли чего с интересующим его названием. Может несколько человек поджидать конвертики с определённым названием – прочтут все, если только в конверте не написано «по прочтении съесть» – тогда кто-то съест и дальше не передаст.

    Как создать/отправить конверт. В любом месте кода создайте конверт и дайте ему название: var myEvent = new Event('teaTime'); Остается положить конверт на нужный столик:
    document.getElementById('stolik').dispatchEvent(myEvent);


    Чтобы в событие вложить какие-то данные, нужно использовать другой конструктор и передать нагрузку в поле detail:
    var event = new CustomEvent('saySomething', { detail: "Hello there!" });


    Для чего нужно создавать свои события? Чтобы развязать куски кода. Например, в разных местах документа можно нажать на кнопку повторяющегося виджета. Виджет создаст на document событие "widgetClicked". А ещё несколько одинаковых компонентов в странице, слушающих document на предмет события "widgetClicked", получат пинок и что-нибудь вытворят.
    Ответ написан
    2 комментария
  • Как отследить изменение свойства объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вешаю на него сеттер...

    Не-а, не на него. Созданное ранее свойство вы перетёрли вызовом defineProperty, кроме того, вы не определяете геттер - отсюда и undefined.

    Можно добавить геттер, само же значение сделать локальной переменной конструктора:

    function test(m) {
      let money = m;
    
      Object.defineProperty(this, 'money', {
        get() {
          return money;
        },
        set(val) {
          alert(`Значение свойства money меняется с ${money} на ${val}`);
          money = val;
        },
      });
    }

    Или можно воспользоваться Proxy:

    function test(m) {
      this.money = m;
    
      return new Proxy(this, {
        set(target, prop, val) {
          alert(`Значение свойства ${prop} меняется с ${target[prop]} на ${val}`);
          target[prop] = val;
          return true;
        },
      });
    }
    Ответ написан
    4 комментария
  • Риск авторских прав если программист заливает приложение в AppStore под корпоративным аккаунтом, но используя личную электронную почту?

    de-iure
    @de-iure
    just a crazy lawyer
    Несет ли заказчик какие либо риски если я не использую его корпоративную почту при авторизации в AppleID?


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

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

    Риски скорее могут возникают у вас, поскольку вы не являясь автором опубликовали чужое приложение со своего личного аккаунта... вы имеете право на публикацию?
    Ответ написан
    2 комментария
  • Как работать с очень длинными списками в JavaScript (angular, react, vuejs)?

    alvvi
    @alvvi
    export default apathy;
    (angular не использует vdom, для него история другая)
    перерисует целиком свой виртуальный dom

    Давайте немного проясним: виртуальный DOM - это грубо говоря js объект содержащий другие объекты.
    При добавлении нового сообщения туда добавится новый объект и весь DOM сравнится со старой версией с помощью diff-алгоритма специфичного для конкретного фреймворка.
    И только результат этого сравнения добавится в реальный DOM.
    Работа с объектом значительно быстрее работы с самим DOM-ом, поэтому чтобы оно начало работать заметно медленее у вас должен быть дикий уровень вложенности или очень большой DOM.

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

    Вот пример бенчмарков с большим количеством объектов(1000+) для многих фреймворков на примере незамысловатой таблицы:
    www.stefankrause.net/js-frameworks-benchmark6/webd...
    (там же есть ссылка на репо чтобы увидеть как она выглядит)
    Как видите, там в таблицу уже содержащую 10 000 добавляется еще 1000(!) объектов, и многие фреймворки впонле с этим справляются.

    В реальности же, вам вряд-ли придется добавлять такие цифры, потому что подгружают изначально обычно меньшее количество: такое, которое пользователь сможет увидеть в одном экране, все остальное догружается постепенно по мере надобности. То же самое касается вашей истории чата, ее стоит подгружать только за тот период, за который она необходима пользвателю.
    Ответ написан
    1 комментарий