Ответы пользователя по тегу JavaScript
  • Как создать блок по метoдологии BEM?

    qfox
    @qfox
    Ответы есть у меня
    Блок должен находится на уровне переопределения. Например: app.blocks.
    Удобнее блоку сделать свою папку (и все блоки хранить каждый в своей папке): app.blocks/hello-world
    У блока должна быть какая-то реализация. Например, css: app.blocks/hello-world/hello-world.css

    Возвращаясь к вопросу:
    mkdir ./app.blocks/hello-world/ -p
    touch ./app.blocks/hello-world/hello-world.css


    Либо, если хотите использовать bem-tools:
    npm i bem-tools
    bem create level app.blocks
    bem create block -l app.blocks hello-world
    Ответ написан
    1 комментарий
  • Дзен BEM: где держать .bemjson?

    qfox
    @qfox
    Ответы есть у меня
    В bemjson описывается структура в блоках/элементах и данные страницы, бандлы — это, суть, ваши страницы.
    Кажется, теперь очевидно, что bemjson нужно класть в папки бандлов.

    Для чего он нужен? Для того, чтобы знать как собирается страница и из чего она состоит. Фактически, из этого файла собираются все артефакты, а процесс сборки выглядит так:
    1. Собираются все названия блоков и элементов, описанных в файле bemjson;
    2. Из блоков собираются файлы *.deps.js и общий список нужных файлов дополняется блоками из этих файлов, и таких же файлов этих блоков (рекурсивно);
    3. Полный список файлов записывается как bemdecl.js;
    4. Собираются все описанные в сборке технологии (файлы js/css/шаблоны);
    5. Если сборка была из bemjson — генерируется еще и html из bemjson и шаблонов (иначе — просто шаблоны);
    6. Минификация и обфускация css/js файлов (или же еще и компиляция less/stylus/sass в css, es6/coffee в js, etc.).

    Как-то так)
    Ответ написан
    5 комментариев
  • Как организовать архитектуру javascript-генератора форм с использованием шаблонизатора и БЭМ методологии?

    qfox
    @qfox
    Ответы есть у меня
    Один из простых способов:
    1. Генерируем из исходного json по каким-то правилам bemjson c описанием структуры формы и блоков с элементами;
    2. Используем https://github.com/bem/bem-forms как базу (или пишем аналог) для создания базовой библиотеки с шаблонами и базовыми типами полей и контролов;
    3. На уровне проекта расширяем своими контролами (шаблонами, стилями, и т.д.);
    4. Собираем чем-то стандартным, типа enb.

    MVC для фронтенда не есть удачное решение, это становится очевидно, когда кол-во успешных MVC фреймворков для JS фактически равно нулю. MV* парадигма вполне работает, но без контроллеров.

    С шаблонами мусташ ситуация следующая — либо не будет возможно доопределять трансформации, описанные шаблонами: т.е. придется копировать из исходной библиотеки шаблон и изменять его, в итоге проблемы при обновлениях; либо не использовать библиотечный подход для шаблонов вообще. Почему так: потому что mustache интерполируемый и императивный шаблонизатор, его технически нельзя научить доопределению. Если все же нужен именно mustache — достаточно будет написать технологию для enb, в гитхабе точно есть примеры для jade, и, кажется, некоторых других. По сути, пара несложных функций, где пишется: возьми этот файл как шаблон для шаблонизатора такого-то и создай из него функцию для отрисовки данных.

    Если думаете про i-bem.js, то jquery у вас так и так будет (потому что i-bem использует jquery), с require.js — возможно, будет проще использовать ymodules: не сильно отличается от require.js, на нем уже основаны bem-core/bem-components и, соотв., bem-forms тоже, и взяв стандартный набор джентельмена от яндекса ничего не надо будет менять с этой точки зрения — все уже настроено.

    Применять БЭМ-подход, не используя БЭМ-стек технологий, обычно больно, и так или иначе начинает писать свой БЭМ-стек технологий. Многие это проходили (если не все) и большинство перестали так делать.

    А вообще, есть форум, где на такие вопросы отвечают намного быстрее и с примерами ;-)
    Ответ написан
    Комментировать
  • Как правильнее парсить результаты ajax запроса?

    qfox
    @qfox
    Ответы есть у меня
    Если использовать https://github.com/bem/bh и https://github.com/bem/bh-php (шаблоны там почти 1-в-1, с точностью до $ в переменных), то можно выгружать шаблоны и на фронт, и на бекенде собирать нужное.

    Еще лучше использовать прослойку на nodejs чисто для сборки html для первого захода, поисковиков, людей без JS, и не думать про это в целом, а на PHP оставить всю логику и использовать как API.

    Еще, чтобы уменьшить размер передаваемых данных:
    а) gzip;
    б) raw-json;
    в) protobuf.

    Если передавать только нужное и не потеряться — нужно сделать двухпроходную шаблонизацию, т.е. в 2 шага — 1) конвертируем из сырых данных в некий промежуточный view-ориентированный json, а затем из последнего собираем html с помощью шаблонов на матчерах.

    Если любите экспериметировать, можете попробовать еще вот так:
    // Допустим, у нас есть выгруженные шаблоны на фронт
    bh.match('users-list', function ... );
    bh.match('user', function ... );
    // etc.
    // дальше мы должны получить данные с бекенда, для простоты укажем их явно
    var usersFromBackend = [{name: 'Vasya', id: 5}, {id: 42, name: 'Petya'}, ...];
    // как получили — собираем каким-то образом некую view-ориентированную структуру типа:
    var viewOriented = {
      // здесь можно использовать и что-то более умное
      block : 'users-list',
      content : fromBackend.map(function (el) {
        return {
          block : 'user',
          // привязываем к users-list по БЭМ
          // (мало ли понадобится что-то в стилях-скриптах подтюнить)
          mix : { block : 'users-list', elem : 'item' }, 
          // выводим контент в каждый div
          content : {
            block : 'link',
            mix : { block : 'user', elem : 'link' },
            url : el.url || '/users/' + el.id,
            text : el.name
          }
        };
      })
    };
    // И после получаем готовый HTML еще одной операцией, который останется куда-то вставить
    console.log(bh.apply(viewOriented));


    При том, что шаблоны у нас одинаковые (для php с точностью до $ в переменных) для фронта и бекенда — кол-во дублируемого кода падает. Появляется возможность вставлять одинаковые блоки в разные места на странице с разными данными, структурировать CSS (самое известное из BEM, даже гугл рекомендует), и т.д.
    Ответ написан
    Комментировать
  • Технологии для highload?

    qfox
    @qfox
    Ответы есть у меня
    Я бы ничего не менял. Возможно, попробовал бы еще tarantool для микрозадач или как замена редиса.

    Но как вариант — C# или Java, и RavenDB какой-нибудь тоже вполне вкатит под «технологии highload».

    Еще вместо обычного mongo можно попробовать drop-in замену в виде TokuMX: https://github.com/Tokutek/mongo
    Ответ написан
    Комментировать
  • Подсоветуйте фреймворк для node?

    qfox
    @qfox
    Ответы есть у меня
    Можно еще попробовать https://github.com/2gis/slot

    У них там специфичный БЭМ, изоморфность, и все такое.
    Ответ написан
    Комментировать
  • Javascript backend frameworks or vanilla js?

    qfox
    @qfox
    Ответы есть у меня
    В nodejs все немного подругому — нет, увы, но там совсем все иначе.

    Во-первых, ваше приложение будет висеть в памяти долго и параллельно обрабатывать несколько запросов, в то время как в PHP тред сдохнет после отправки ответа на запрос; во-вторых, в node.js широко практикуется микромодульность; в-третьих, на vanilla.js вы замучаетесь писать, потому что это просто ядро js — окружение nodejs вам все равно понадобится для работы с libuv и сокетами/дескрипторами, и это будет уже не vanillajs.

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

    И вопрос стоит больше не в готовом фреймворке, а в наиболее подходящих частях.

    Я бы порекоммендовал смотреть в сторону сырого https://github.com/senchalabs/connect, либо чуть более полного https://github.com/strongloop/loopback (фактически, connect с плагинами).
    Если чем-то не устраивает — можно смотреть https://www.npmjs.com/package/restify (или то, что его у себя использует: https://www.npmjs.com/browse/depended/restify).

    В качестве абстракции над моделями либо https://github.com/sequelize/sequelize (если база будет mysql/pgsql), либо https://github.com/Automattic/mongoose (если без разницы какая база) + https://github.com/Tokutek/mongo.

    Для веб логов — https://github.com/expressjs/morgan
    Для других логов — например, https://github.com/winstonjs/winston + нужные транспорты
    Для конфигов — https://github.com/flatiron/nconf, если не хватает просто require("config.json")

    И т.д.

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

    qfox
    @qfox
    Ответы есть у меня
    Можно еще через OOP в Ruby. www.theodinproject.com/ruby-programming/object-ori...

    Берете OOP в Ruby, отсекаете Классы и Мета-классы, добавляете (вместо классов и метаклассов) — свою реализацию типа https://github.com/dfilatov/inherit или любую другую — получаете классы в JS.

    ES6 классы, насколько я знаю, это просто сахар, так что не питайте надежд — оно не далеко уйдет от того, что есть сейчас, просто появится возможность писать более коротко.
    Ответ написан
    Комментировать
  • Как отсортировать массив с добавлением разделителей групп?

    qfox
    @qfox
    Ответы есть у меня
    Толи я не понимаю, толи это ответ:
    // сортируем
    var sorted = $scope.dis.sort(function (a, b) {
      return a.name > b.name? 1 :  -1;
    });
    // собираем сам массив
    var sortedWithGroups = sorted.reduce(function (res, a) {
      // добавляем дополнительно букву перед первым словом на новую букву
      // если это первое слово на эту букву
      if (res.lastGroup !== a.name[0]) {
        res.lastGroup = a.name[0];
        res.push({name: a.name[0], group: true});
      }
      // добавляем саму ссылку
      res.push(a);
      return res;
    }, []);

    В итоге в sortedWithGroups отсортированный массив с группировкой по буквам.

    p.s. Разделил на переменные только ради комментариев. Все это можно собрать в несколько строк и вызывать reduce сразу после sort в одной конструкции.

    Ссылки:
    Array.prototype.sort: https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Array.prototype.reduce: https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Ответ написан
    8 комментариев
  • JS библиотека для рисования графиков с возможностью установки разных цветов на одной линии?

    qfox
    @qfox
    Ответы есть у меня
    Возьмите, например, d3js.org

    Какой-то у вас вопрос из разряда «Пацаны в гугле забанили спасите!»
    Ответ написан
    Комментировать
  • Как в three.js разделить куб на произвольное количество кубов кратное 8?

    qfox
    @qfox
    Ответы есть у меня
    Если на входе: координаты, кол-во кубов (через коэффициент или число, кратное 8) и размеры, geometry, material.
    То: мне видится цикл вложенности 3, который можно будет оптимизировать, и который будет считать координаты для кубов для каждой размерности, ну и запускать там вашу функцию (только слегка модифицированную, ибо x, y, z не должны быть 0).

    Сделайте расчет координат отдельно, выведите их, проверьте что все правильно, и после подставьте туда отрисовку в нужных координатах вашего куба. Самое простое — это разделить задачу на несколько простых и после использовать их в правильном порядке.
    Простите, без кода ;-)
    Ответ написан
  • Запустить тригер document.ready вручную?

    qfox
    @qfox
    Ответы есть у меня
    Идея, мягко говоря, очень плохая. Лучше сделайте так:
    $(document).ready(onDOMReady);
    function onDOMReady () {
      // ваш код
    }

    И в нужном месте просто вызовите эту функцию.

    Это будет и быстрее, и надежнее.
    Ответ написан
  • Друзья, есть ли какие задачи для практики по JavaScript?

    qfox
    @qfox
    Ответы есть у меня
    Я бы еще предложил:
    - написать библиотеку промисов или монад (www.youtube.com/watch?v=b0EF0VTs9Dc);
    - поучаствовать в одном из сотен тысяч опенсорс проектов на гитхабе (https://github.com/search?q=language%3AJavaScript&...);
    - поотвечать на вопросы новичков про JS на тостере ;-), искать самому ответ, параллельно читать ответы других участников, как проверочный материал.

    А вообще — весь спектр классических задач — лучше брать те, которые самому интересны. JS таков, что ограничений на алгоритмы у него нет, хочешь используй как функциональный язык, хочешь — как императивный — простор для фантазии ;-)
    Ответ написан
    Комментировать
  • Трансляция видео стрима с помощью HTML5 Websockets?

    qfox
    @qfox
    Ответы есть у меня
    Не очень понятно зачем это делать через websocket, но даже если представить какой объем вы будете через них отправлять — качество будет того.

    Можно попробовать посмотреть в сторону решений типа https://github.com/phoboslab/jsmpeg, но это на nodejs и требует ffmpeg/VLC.
    Ответ написан
    4 комментария
  • Как сместить target index в jcarousel с первого слайда на второй?

    qfox
    @qfox
    Ответы есть у меня
    Насколько я понимаю, проще всего подписаться на событие изменения таргета и выставлять свой класс на следующий после таргета элемент. Либо же какие-то другие события посмотреть.
    Я бы читал код и документацию.

    Не очень тянет на вменяемый ответ, но уж коль ничего другого нет ;-)
    Ответ написан
  • Kind of Capistrano на Node.JS

    qfox
    @qfox
    Ответы есть у меня
    Сам капистрано хорошо справляется с задачей, но аналоги есть.

    Например, https://github.com/1602/roco
    Если будет интересно — я переписал его, чтобы его можно было пилить дальше и использовать для создания своих оберток, но остановился на тестах и процесс пока встал. Т.е. оно вроде бы работает, но без тестов МР не поставишь, а тесты были сильно завязаны на внутреннюю архитектуру, которая поменялась.
    Ну и да, кроме того, что он на nodejs, его скрипты не синхронные, как и сам nodejs, хотя таски и группы создаются аналогично.

    Сами таски описываются на coffee и очень похожи на таски capistrano.
    Ответ написан
    Комментировать
  • Какая есть альтернатива Flowy для node.js?

    qfox
    @qfox
    Ответы есть у меня
    Сходу, это Q, и Vow (именно его я чаще всего и использую, в т.ч. на клиенте).
    Еще есть менее известные then promise и bluebird
    Все это называется Промисы (обещания) или Promises/A+
    Это то, что касается промисов. Есть и другие библиотеки bit.ly/1putPFj

    Есть еще вариант использования различных библиотек для контроля потоком, которые тоже из горной лапши делают более-менее стройный код.
    В т.ч. async, более простая, но не менее эффективная обертка над стандартными колбеками.
    И другие: Step, Seq, FuturesJS.

    Кроме этого, в стандарт рано или поздно будут включены т.н. генераторы (yield) — часть harmony es6. Уже даже есть наработки в эту сторону типа koajs (замена expressjs).
    Они находятся в ветке 0.11, но требуют флага при запуске. Гарантий, что это появится в 0.12, конечно, нет, но в 0.14 или 0.16 оно появится с большой долей вероятности.
    Ответ написан
  • Существует ли в природе подобный слайдер?

    qfox
    @qfox
    Ответы есть у меня
    Имхо, это все css3, js тут мало играет.

    Делаете прямоугольный «слайдер», который загибаете, а его элементы наоборот разгибаете. При наличии какого-то класса сдвигаете, опять же, css3 свойствами и ставите нужную прозрачность (или меняете картинку), тени.

    Вариант 2: svg. В этом случае, делаете inline svg, с нужной формой элементов, классы там тоже поддерживаются и при наличии класса active на элементе двигаете его вниз и меняете прозрачность.
    Ответ написан