Войти с помощью github

Всем привет! Верстаю проект. Верстаю один. Верстаю статику.

Сложности (недостатки). Не знаю JavaScript, препроцессоры не использую (и не изучены).

Проект длинный, объемный и сложный по функционалу, и вот сейчас, где то по середине появилось опасение, что в ближайшем будущем, то что я делаю, будет понятно только мне, и то не с первого раза.

В этой связи, а так же с учетом недостатков, могу я использовать БЭМ, например модульно, с самого низа и по мере роста своих возможностей приращивать используемый функционал? Если да. Поскольку я ребенок в технологии, могу ли задавать дурацкие вопросы и получать вразумительные ответы? Или же пока пойти подкачаться в html/css и смежных технологиях?

P.S. Читал, читаю, смотрю видео на тему. Пока каша в голове. Может еще особенность восприятия, и мне нужно просто поговорить с живым человеком, в контексте насущных вопросов.

Добрый день, я еще новенький в бэме, но подскажите, как вы оборачиваете, строите колонки из элементов на уровне bemhtml ? Поясню о чем я, например, пришел блок в bemjson:

{
    block: 'bootm',
    blk: [
        {
            inpval: '444',
            logo: '../../common.blocks/index/images/logo.png',
            url: '/',
            bagvar: '143',
            элем2: 'что то тут',
            элем3: 'что то тут'
        }
    ]
}

Вот если такой разметки будет мало:

elem('item')(
    tag()('li')
),
elem('title')(
    tag()('h3')
)

И тут мне, как бедному верстальщику, нужно из этих данных средствами bemhtml сделать раскрасивую конфетку, с колоночками, row' ами небольшими обертками, одним словом кастомную разметку на выходе, далекую от бутстрапа, вот тут и прошу совета в двух словах.

Есть примерно такая структура:

<div class='block'>
<div class='block__elem block__elem_active'>Элемент 1</div>
<div class='block__elem'>Элемент 2</div>
</div>

Когда я пытаюсь искать элемент при помощи this.findElem('elem', 'active'), то получаю пустой результат. Если делаю this.elem('elem', 'active');, или this.findElem('elem', 'active', true); то получаю нужны элемент.

Как я понимаю, это происходит из-за того, что _self.buildClass() в https://github.com/bem/bem-core/blob/v2.6.0/common.blocks/i-bem/__dom/i-bem__dom.js#L742 возвращает block_elem_active вместо block__elem_active.

Есть блок который содержит контролы у контролов свой js. Каким образом можно отловить изменение конкретного контрола в другом блоке(я без проблем повешу модификатор если контрол изменился), но уровень абстракции должен быть таким, что конкретный контрол не знает, что он меняет. Своего рода события как в jquery. Собственно как отловить это событие?

Привет всем! Как правильно подключать сторонние библиотеки (например если хочу подключить иконки Font-Awesome, или materialize.min.js)

Хочется делать определённые действия с элементом, на котором нет модификатора. Как бы мне его выбрать? this.elem('elemName', 'modName', false) не даёт нужного результата.

В старых проектах везде используется bootstrap и не всегда есть настроянный галп и препроцессоры css. От этого работать с такими проектами просто не хочется. Как можно совмещать bem и bootstrap ?

Ребята, rss на форум для отслеживания новых тем можете прикрутить?

Сделал демку использования bem-components с angular'ом с поддержкой ngModel и 2-way data binding.

Скоро будет уже в виде либы в инкубаторе. Жду фидбек, пожелания, идеи.

Здравствуйте, пытаюсь разобраться в этой технологии, подскажите пожалуйста, как можно организовать выпадающее меню ? С одноуровневым все понятно, взял из компонентов, затемизировал как нужно, но как тут поступить ?

Собственно как выполнить в блоке несколько шаблонов? т.е по одним и тем же входным данным генерятся 2 разных блока.

Хочу использовать Gemini на Mac. Требуется установить Selenium Server. А он говорит

14:07:45.339 INFO - Driver provider org.openqa.selenium.ie.InternetExplorerDriver registration is skipped:
registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match the current platform MAC

Из документации: "Obviously the InternetExplorerDriver will only work on Windows!"

И что делать?

Коллеги, давненько присматриваюсь к БЭМ методологии. Но никак не могу до конца понять как его интегрировать в проект на django. Может у кого есть опыт, поделитесь?

Всем привет! У меня php сайтик на самописном mvc - фреймворке, сейчас хочу использовать методологию БЭМ для своего представления.

Сделал следующее:

Логинимся на наш сервер ( не локальный)
Перехожу в htdocs cd htdocs Версия git (у меня 2.4.2) git version Версия php (5.5.26) php -v Клонирую на сайт git clone --depth 1 -b php-bem-bh git@github.com:bem/project-stub.git ls-php-bem-bh Иду в эту директорию cd ls-php-bem-bh Чищу от остальных коммитов — опционально rm -rf .git; git init; git add ./; git commit -m "initial" Устанавливаю последнюю версию Node.js Перед установкой необходимо убедиться в наличии libexecinfo. Ставится он так: cd /usr/ports/devel/libexecinfo sudo make install Устанавливаем Node.js cd /usr/ports/www/node sudo make DISABLE_VULNERABILITIES=yes install clean Проверяю, (должно отобразится Hello World) node console.log('Hello World');

Для того, чтобы выйти из интерактивной оболочки, необходимо просто нажать Ctrl + C. Ctrl + C (2 раза) Затем устанавливаю менеджер пакетов npm Перехожу в директорию, в которой находился до перехода в текущую директорию cd Устанавливаю curl -L https://npmjs.org/install.sh | sudo sh Проверяю npm -v

Иду в директорию с проектом cd htdocs/ls-php-bem-bh стягиваю npm и bower зависимости (нужны только для сборки и станка верстальщика) npm install стягиваем bem/bh-php (можно и через composer: composer require bem/bh) git clone --depth 1 https://github.com/bem/bh-php.git ./vendor/bem/bh Собираю проект с помощью ENB:

Конфигурация процесса сборки хранится в файле .enb/make.js. На ее основе ENB подключает все технологии, которые составляют реализацию блоков: шаблоны, зависимости, CSS-правила и JavaScript-функциональность. ./node_modules/.bin/enb make -n смотрим файлы:ls ./desktop.bundles/index/ | grep php Для удобства разработки запускаем сервер: ( переназначаем порт с помощью аргумента –p ) node_modules/.bin/enb server

второй вариант если порт 8080 занят

./node_modules/.bin/enb server -p 3333 На нашем сервере запускаю инструмент для разработки, который при обновлении страницы в браузере будет автоматически пересобирать только ту часть проекта, которую затронули ваши изменения. Результат доступен по ссылке:

http://мой сайт.com:8080/desktop.bundles/index/index.html

или

http://мой сайт.com:3333/desktop.bundles/index/index.html

У меня такие вопросы:

  1. Как написано здесь https://ru.bem.info/forum/175/ В libs должны лежать бибилиотеки, в т.ч. библиотеки (с суффиксом -php) с bh.php шаблонами. Что-то я немогу их найти, где конкретно искать, и что я сделал не так?
  2. В папке desktop.bundles/index тоже ничего не вижу с расширением php
  3. Что мне нужно удалить, какие файлы и с каким расширением создавать?
  4. как мне передавать данные из своих контроллеров, если структура сайта следующая (упрощенный вариант):

index.php /app |----myapplication.php |----/core |----/config |----/controllers |----/helpers |----/filters |----/models |----/view |----------/contetnt |----------/layout ну и соответственно наш Бэм проект /ls-php-bem-bh |------------------/.bem |------------------/.enb |------------------/.git |------------------/common.blocks |------------------/node_modules |------------------/desktop.blocks |------------------/libs |------------------/desktop.bundles |---------------------------------------/.bem |---------------------------------------/index |-----------------------------------------------index.bemjson.js |-----------------------------------------------index.bemhtml.js |-----------------------------------------------index.html

Привет!

В результате разговора с @voischev в слаке случилась тулза под гордым названием bem-deps-lint. На самом деле она умеет лишь проверить наличие на файловой системе сущностей, которые оказались в deps-бандле.

Причем, в силу обстоятельств реальной жизни, выдает кучу false positive (например, реализации модификаторов size, active, hovered, disabled, visible физически находятся в файлах _theme_islands, так что такие «лишние» депсы не являются ошибкой) и напрочь лишена тестов и документации. Но внезапно с ее помощью удалось найти несколько проблем в алгоритме сборки deps-бандлов и библиотеках блоков.

Так что тулза потенциально полезная, но на тесты и документацию сил нет.

Есть ли желающие помочь?

Добрый день,

Подскажите пожалуйста как производить навигацию между страницами. Так сложилось что мне сначала нужно зайти на url для авторизации и потом зайти на другой где собственно уже и производить тест. Пытался найти есть ли возможность работать в gemini с навигацией в браузере из коробки. Как я понял нету, т.к. в кол бэк возможно передать только actions и find/ Вторым вызовом suite.setUrl() поменять урл на другой не вышло. С нестед сьютами так же не выходит. Возможно я не так их применял ниже код:

parent.setUrl('first url') .setCaptureElements('element'); gemini.suite('first child', function (child) { //this suite captures same elements on different pages child.setUrl('secondUrl') .capture('plain'); Заранее спасибо за любую помощь.

как бороться с циклическими зависимостями Circular dependence has been detected: "i-bemdom_init -> tabs -> i-bemdom -> i-bem -> events -> i-bem__dom"

Подскажите пожалуйста, возможно ли я и как это сделать. Допустим я использую технологии i-bem.js, BH и др для формирования HTML+CSS. а я могу вариант данной верстки использовать с php? Или вся верстка динамически формируется только с помощью Node.js?

Хочется получая ajaxом(bemjson(Данные) - блока), прогнав его через bemhtml получить исходный html Делать это все добро надо на клиенте. Есть ли такая возможность?

Хочу сделать следующую штуку. Блок без модификатора - ленивая инициализация Блок с модификатором - автоматическая

Возможен ли такой вариант?

Вопрос от @lehakos: Скажите, пожалуйста, а как можно использовать jade вместо json формата для БЭМ? Есть ли такая практика вообще? :) И еще вопрос, хотелось бы использовать плагины Gulp вроде минификатора изображений, генератора спрайтов, livereload и т.д. Возможно ли это совместить с БЭМ сборщиком проекта?

Проблема следующая есть блоки

{
    block: 'form-input',
    name: 'user',
}

Как все понимают элемент формы input, и есть блок

{
    block: 'form-input',
    name: 'tel',
    js: true,
    mods: {type: 'tel'},
    maxlength: '13'
}

Блок с модификатором, проблема с шаблоном, сейчас у него изменился шаблон относительно других inputов, я заюзал новый шаблон, но проблема в том что при сборке этот блок собирается сначала без модификатора потом с модификатором, получается вложенность. Как избежать подобной проблемы?

block('form-input')(
    //code
);

block('form-input').mod('type', 'tel')(
  //code
);

Вот здесь https://ru.bem.info/technology/i-bem/v2/i-bem-js/#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0-%D0%B2-%D0%B4%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%86%D0%B8%D0%B8

Вместо modules.define('button', ['i-bem'], function(provide, Button) {

Должно быть modules.define('button', function(provide, Button) {

Не нашел репозиторий bem.info, чтобы поправить самому. Почему нету на него ссылки нигде на сайте? Или какой-нибудь штуки типа "нашли ошибку?".

Всем привет!

Очень интересную ситуацию наблюдаю при сборке примеров для документации на разных платформах (Windows, Linux/OS X) с использованием пакетов enb-bem-examples и enb-magic-factory. На Windows сборка проходит без ошибок на остальных возникает следующая ошибка:

  ~/src/drom-bem-makeup   master ●  enb make examples -n
16:14:26.665 - build started
16:14:27.446 - [failed] [blocks.examples/common-desktop/common-desktop.bemjson.js] file-provider
16:14:27.448 - [failed] [blocks.examples/common-mobile/common-mobile.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/ee3ZC6dyTetTRFqbHHZqKvywwXM/ee3ZC6dyTetTRFqbHHZqKvywwXM.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/wrlcu38vmkNaP3tb9gvwZXBiszI/wrlcu38vmkNaP3tb9gvwZXBiszI.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/PNXYUr__M6VSB4YxqCmkdMhk2l0/PNXYUr__M6VSB4YxqCmkdMhk2l0.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/Ekw9TzRLS_fyQiOkC-Zi804eDzo/Ekw9TzRLS_fyQiOkC-Zi804eDzo.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/9y8JjzeQPxlsleieuSrVga8xv4U/9y8JjzeQPxlsleieuSrVga8xv4U.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/WgU-OFa8iJsKWLBtnoxXtfgoLCc/WgU-OFa8iJsKWLBtnoxXtfgoLCc.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/D1rJB4_MGVvbnFlNUN1xUlQvtpQ/D1rJB4_MGVvbnFlNUN1xUlQvtpQ.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/6O-IryxuQJM1YwYJYT_hHvf20NQ/6O-IryxuQJM1YwYJYT_hHvf20NQ.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/kreyF1JOyT4hpa2NBRIP_KwvWkY/kreyF1JOyT4hpa2NBRIP_KwvWkY.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/7PpftPzRoUzxzKCcgS8Xn51w1o/7PpftPzRoUzxzKCcgS8Xn51w1o.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/28tLGFFUSZMApDlzg9Hi-09cNzg/28tLGFFUSZMApDlzg9Hi-09cNzg.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/XCMcnEyp-kgOzxTPExe9Xyu6xUI/XCMcnEyp-kgOzxTPExe9Xyu6xUI.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/uIFN2UGU4DNbCgT2JACquwcCSUo/uIFN2UGU4DNbCgT2JACquwcCSUo.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/UgeVMmhNha9pAtahV7VjriQCt9I/UgeVMmhNha9pAtahV7VjriQCt9I.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/xhSZr6XvNYk0AwDEfeLBCjtMs1g/xhSZr6XvNYk0AwDEfeLBCjtMs1g.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-button/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/m-button-ico/cUvu2JGXCO5KN8cmKNt11ZL40nI/cUvu2JGXCO5KN8cmKNt11ZL40nI.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/xIo7WqepN6yOXUzXkxpVCwoPtLw/xIo7WqepN6yOXUzXkxpVCwoPtLw.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/QD3PyE2oaSabCQ_mcdAbZliSAME/QD3PyE2oaSabCQ_mcdAbZliSAME.bemjson.js] file-provider
16:14:27.586 - [rebuild] [blocks.examples/common-desktop/common-desktop.levels] levels
16:14:27.586 - [rebuild] [blocks.examples/common-mobile/common-mobile.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/ee3ZC6dyTetTRFqbHHZqKvywwXM/ee3ZC6dyTetTRFqbHHZqKvywwXM.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/wrlcu38vmkNaP3tb9gvwZXBiszI/wrlcu38vmkNaP3tb9gvwZXBiszI.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/PNXYUr__M6VSB4YxqCmkdMhk2l0/PNXYUr__M6VSB4YxqCmkdMhk2l0.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/Ekw9TzRLS_fyQiOkC-Zi804eDzo/Ekw9TzRLS_fyQiOkC-Zi804eDzo.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/9y8JjzeQPxlsleieuSrVga8xv4U/9y8JjzeQPxlsleieuSrVga8xv4U.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/WgU-OFa8iJsKWLBtnoxXtfgoLCc/WgU-OFa8iJsKWLBtnoxXtfgoLCc.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/D1rJB4_MGVvbnFlNUN1xUlQvtpQ/D1rJB4_MGVvbnFlNUN1xUlQvtpQ.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/6O-IryxuQJM1YwYJYT_hHvf20NQ/6O-IryxuQJM1YwYJYT_hHvf20NQ.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/kreyF1JOyT4hpa2NBRIP_KwvWkY/kreyF1JOyT4hpa2NBRIP_KwvWkY.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/7PpftPzRoUzxzKCcgS8Xn51w1o/7PpftPzRoUzxzKCcgS8Xn51w1o.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/28tLGFFUSZMApDlzg9Hi-09cNzg/28tLGFFUSZMApDlzg9Hi-09cNzg.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/XCMcnEyp-kgOzxTPExe9Xyu6xUI/XCMcnEyp-kgOzxTPExe9Xyu6xUI.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/uIFN2UGU4DNbCgT2JACquwcCSUo/uIFN2UGU4DNbCgT2JACquwcCSUo.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/UgeVMmhNha9pAtahV7VjriQCt9I/UgeVMmhNha9pAtahV7VjriQCt9I.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/xhSZr6XvNYk0AwDEfeLBCjtMs1g/xhSZr6XvNYk0AwDEfeLBCjtMs1g.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-button/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/m-button-ico/cUvu2JGXCO5KN8cmKNt11ZL40nI/cUvu2JGXCO5KN8cmKNt11ZL40nI.levels] levels
16:14:27.589 - [rebuild] [blocks.examples/b-link/xIo7WqepN6yOXUzXkxpVCwoPtLw/xIo7WqepN6yOXUzXkxpVCwoPtLw.levels] levels
16:14:27.589 - [rebuild] [blocks.examples/b-link/QD3PyE2oaSabCQ_mcdAbZliSAME/QD3PyE2oaSabCQ_mcdAbZliSAME.levels] levels
16:14:27.590 - build failed
16:14:27.597 - build failed
Error: File not found: /Users/rudoy/src/drom-bem-makeup/blocks.examples/common-desktop/common-desktop.bemjson.js
    at /usr/local/lib/node_modules/enb-bem-examples/node_modules/enb/techs/file-provider.js:47:49
    at FSReqWrap.cb [as oncomplete] (fs.js:212:19)

Кусок кода отвечающий за сборку примеров и их бандлов:

var factory = config.module('enb-magic-factory'),
        helper = factory.getHelper('examples');

    helper.prebuild(function(magicConfig){
        magicConfig.registerNode('blocks.examples/common-desktop');
        magicConfig.registerNode('blocks.examples/common-mobile');
    });

    helper.configure(function(config, nodes, targets){
        var nodes = nodes;
        config.nodes(nodes, function(nodeConfig){
            if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop' || nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
                var depsDesktop = [],
                    depsMobile = [];

                nodeConfig.addTechs([
                    [ require('enb-bem-techs/techs/levels'), {levels: getExamplesLevels(config)} ],
                    [ enbBemTechs.files ],
                    [ techs.js ]
                ]);

                nodes.forEach(function (node) {
                    if (!/\/.*common.*/.test(node)) {
                        var pathNorm = path.normalize(node),
                            splitedPath = pathNorm.split(path.sep);

                        if(/m\-.\w*/.test(node)){
                            depsMobile.push(splitedPath[splitedPath.length - 1] + '.deps.js');
                            nodeConfig.addTechs([
                                //copy deps files to common-mobile dir
                                [ enbBemTechs.provideDeps, { node: pathNorm,  target: splitedPath[splitedPath.length - 1] + '.deps.js' } ],
                            ]);
                        }else{
                            depsDesktop.push(splitedPath[splitedPath.length - 1] + '.deps.js');
                            nodeConfig.addTechs([
                                //copy deps files to common-desktop dir
                                [ enbBemTechs.provideDeps, { node: pathNorm,  target: splitedPath[splitedPath.length - 1] + '.deps.js' } ],
                            ]);
                        }

                    }
                });

                //merge bundle
                if(nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
                    nodeConfig.addTechs([
                        [ enbBemTechs.mergeDeps, { sources:  depsMobile }]
                    ])
                }
                if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop'){
                    nodeConfig.addTechs([
                        [ enbBemTechs.mergeDeps, { sources:  depsDesktop }]
                    ])
                }

                nodeConfig.addTechs([
                    //bemhtml
                    [ techs.bemhtml, { sourceSuffixes: [ 'bemhtml', 'bemhtml.js' ] } ],
                    //css
                    [ techs.cssStylus, {target: '?.noprefix.css'}],
                    [ techs.cssAutoprefixer, {
                        sourceTarget: "?.noprefix.css",
                        destTarget: '?.css',
                        browserSupport: ["> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5"]
                   }]
                ]);

                nodeConfig.addTargets(['?.js', '?.css', '?.bemhtml.js']);

            }else {
                nodeConfig.addTechs([
                    [require('enb-bem-techs/techs/levels'), {levels: getExamplesLevels(config)}],
                    [enbBemTechs.bemjsonToBemdecl],
                    [enbBemTechs.depsOld],
                    [enbBemTechs.files],
                    //CSS
                    [techs.cssStylus, {target: '?.noprefix.css'}],
                    [techs.cssAutoprefixer, {
                        sourceTarget: "?.noprefix.css",
                        destTarget: '?.css',
                        browserSupport: ["> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5"]
                    }],
                    //BEMHTML
                    [techs.bemtree, {sourceSuffixes: ['bemhtml', 'bemhtml.js']}],
                    //BEMHTML
                    [techs.bemhtml, {sourceSuffixes: ['bemhtml', 'bemhtml.js']}],
                    //HTML
                    [techs.htmlBeautify],
                    [techs.htmlFromJSON],
                    //client JS
                    [techs.browserJs],
                    [techs.fileMerge, {target: '?.pre.js', sources: ['?.bemhtml.js', '?.browser.js']}],
                    [techs.prependYm, {source: '?.pre.js'}]
                ]);

                nodeConfig.addTargets(['?.js', '?.css', '?.html', '?.browser.js', '?.beauty.html', '?.bemtree.js']);
            }
        });
    });

Ошибка возникает на этапе сборки бандлов(common-desktop и common-mobile) . При сборке которых нет необходимости провайдить .bemjson.js.

Не много дебага с помощьюnode.getTechs().

if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop' || nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
           console.log(nodeConfig.getTechs());
           ......
}

На Windows результат будет пустой на OS X/Linux [ { _options: { target: '?.bemjson.js' } } ]

Хотелось бы разобраться, почему сборка ведет себя по разному на разных платформах?

Было хотели прикрутить enb-bem-specs

В общем полная беда. Templates только на bemhtml, а мы пользуемся BH - ибо он по мнению команды понятнее.

Потом, как оказалось он тянет за собой блок jquery - которого у нас просто нет, а еще хочет i-bem.

i-bem

В общем очень странные желания для сборки тестов и не понятно почему ему нужен так jquery, и i-bem?

Итог выглядит печально:

Так может кто уже получил опыт заведения unit-тестирования без i-bem, jquery?

Видится это примерно так:

В блоках файлы *.spec.js

В которых написаны тесты в BDD стиле.

Сборка происходит в отдельную папочку, и для сборки используются только те слои переопределения кои используются для development мода.

Существует несколько способов подключения bem-библиотек на свой проект.

Здесь я рассмотрю варианты подключения заранее собранных версий, их 4:

  1. Подключить напрямую с CDN Яндекса
  2. Установить собранные библиотеки через bower
  3. Самостоятельно собрать из исходников
  4. Воспользоваться альфа-версией кастомного билдера

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

Подключить напрямую с CDN Яндекса

Это самый простой способ. Достаточно подключить необходимые файлы (см. раздел «Состав») в HTML и готово:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>bem-components dist</title>
    <link rel="stylesheet" href="https://yastatic.net/bem-components/latest/desktop/bem-components.css">
</head>
<body class="page page_theme_islands">
    <!-- write your code here -->
    <script src="https://yastatic.net/bem-components/latest/desktop/bem-components.js+bh.js"></script>
</body>
</html>

Более полный вариант базовой HTML-разметки, включающий поддержку IE8 и определение наличия JS в браузере см. в конце поста.

Установить собранные библиотеки через bower

При условии, что bower у вас уже установлен, достаточно выполнить bower i bem/bem-components-dist#v2 (либо bower i bem/bem-core-dist#v2).

Далее просто прописать путь к необходимым файлам в HTML:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>bem-components dist</title>
    <link rel="stylesheet" href="bower_components/bem-components-dist/desktop/bem-components.css">
</head>
<body class="page page_theme_islands">
    <!-- write your code here -->
    <script src="bower_components/bem-components-dist/desktop/bem-components.js+bh.js"></script>
</body>
</html>

Самостоятельно собрать из исходников

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

git clone https://github.com/bem/bem-components.git
cd bem-components
npm i
npm run dist

В результате в корне bem-components появится папка dist со всеми необходимыми файлами.

Подключение не отличается от предыдущего варианта.

Воспользоваться альфа-версией кастомного билдера

Важно! На данный момент билдер не тестируется и в целом работоспособность сервиса никак не гарантируется. Используйте на собственный страх и риск.

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

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

Как работать с подключенными библиотеками

Тут снова возникает несколько вариантов.

Общая часть состоит в том, чтобы найти нужные блоки на bem.info.

Допустим, нужен блок select. Среди примеров нужно найти тот, который больше всего подходит.

Далее 3 варианта:

  1. Просто скопировать нужный HTML из примера и поправить его под свои нужды (для этого нужно нажать на HTML в шапке примера). Этот вариант максимально простой, но очевидно, что при обновлении шаблонов в последующих версиях библиотеки апдейт потребует ручного внесения изменений в каждый обновленный блок.
  2. Воспользоваться шаблонизацией на клиенте (dist включает предсобранные шаблоны BEMHTML и BH на выбор).

Для этого вместо готового HTML-кода следует брать из документации с примерами BEMJSON (кнопка рядом). Получится что-то типа:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>bem-components as a library</title>
    <link rel="stylesheet" href="https://yastatic.net/bem-components/latest/desktop/bem-components.css">
</head>
<body class="page page_theme_islands">
<script src="https://yastatic.net/bem-components/latest/desktop/bem-components.js+bemhtml.js"></script>
<script>
modules.require(['i-bem__dom', 'BEMHTML', 'jquery'], function(BEMDOM, BEMHTML, $) {
    var html = BEMHTML.apply({
        block : 'select',
        mods : { mode : 'check', theme : 'islands', size : 'm' },
        name : 'select1',
        val : [2, 3],
        text : 'Программа конференции',
        options : [
            { val : 1, text : 'Доклад' },
            { val : 2, text : 'Мастер-класс' },
            { val : 3, text : 'Круглый стол' }
        ]
    });

    BEMDOM.append($('.page'), html);
});
</script>
</body>
</html>

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

А третий вариант — это выполнять {BEMHTML,BH}.apply() на ноде и отдавать браузеру уже готовый HTML:

var BEMHTML = require('./dist/desktop/bem-components.bemhtml.js').BEMHTML;

BEMHTML.apply({
    block : 'select',
    mods : { mode : 'check', theme : 'islands', size : 'm' },
    name : 'select1',
    val : [2, 3],
    text : 'Программа конференции',
    options : [
        { val : 1, text : 'Доклад' },
        { val : 2, text : 'Мастер-класс' },
        { val : 3, text : 'Круглый стол' }
    ]
}); // вернется HTML-строка

Разумеется, все три варианта можно произвольно комбинировать.

Как еще можно пользоваться dist-ом

Т.к. файлы теперь доступны с CDN, можно использовать их на разнообраных песочницах вроде jsfiddle: https://jsfiddle.net/bmu7bkne/4/ или http://jsfiddle.net/bmu7bkne/

Состав

bem-core

Доступны отдельные наборы файлов для двух платформ:

  • desktop
  • touch

Каждый набор включает в себя:

И аналогичные dev-версии (с сохранием форматирования и комментариев):

  • bem-core.dev.css
  • bem-core.dev.js
  • bem-core.dev.bemhtml.js
  • bem-core.dev.bh.js
  • bem-core.dev.js+bemhtml.js
  • bem-core.dev.js+bh.js

    bem-components

На данный момент доступны отдельные наборы файлов для трех платформ:

  • desktop
  • touch-pad
  • touch-phone

Однако каких-либо отличий в коде между touch-pad и touch-phone нет, поэтому планируется их объединение.

Каждый набор включает в себя:

  • bem-components.css # стили
  • bem-components.ie.css # стили для IE8 (подробнее)
  • bem-components.js # JS
  • bem-components.bemhtml.js # BEMHTML-шаблоны
  • bem-components.bh.js # BH-шаблоны
  • bem-components.js+bemhtml.js
  • bem-components.js+bh.js

И аналогичные dev-версии (с сохранием форматирования и комментариев):

  • bem-components.dev.css
  • bem-components.dev.ie.css
  • bem-components.dev.js
  • bem-components.dev.bemhtml.js
  • bem-components.dev.bh.js
  • bem-components.dev.js+bemhtml.js
  • bem-components.dev.js+bh.js

Схема подключения с CDN: //yastatic.net/название-библиотеки/версия/платформа/имя-файла. Например, //yastatic.net/bem-components/latest/desktop/bem-components.dev.js+bh.js.

Полный вариант базовой HTML-разметки

<!DOCTYPE html>
<html class="ua_js_no">
<head>
    <!--[if lt IE 9]><script src="https://yastatic.net/es5-shims/0.0.1/es5-shims.min.js"></script><![endif]-->
    <meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title>bem-components dist</title>
    <script>(function(e,c){e[c]=e[c].replace(/(ua_js_)no/g,"$1yes");})(document.documentElement,"className");(function(d,n){d.documentElement.className+=" ua_svg_"+(d[n]&&d[n]("http://www.w3.org/2000/svg","svg").createSVGRect?"yes":"no");})(document,"createElementNS");</script>
    <!--[if gt IE 8]><!--><link rel="stylesheet" href="https://yastatic.net/bem-components/latest/desktop/bem-components.css"/>
    <!--<![endif]--><!--[if lte IE 8]><link rel="stylesheet" href="https://yastatic.net/bem-components/latest/desktop/bem-components.ie.css"/><![endif]-->
</head>
<body class="page page_theme_islands">
<!-- write your code here -->
<script src="https://yastatic.net/bem-components/latest/desktop/bem-components.js+bh.js"></script>
</body>
</html>

Ребят подскажите какой инструмент использовать для подсветки синтаксиса? Помимо верстки делается руководство стиля оно представляет собой ту же сборку bem блоков Сейчас юзаю prism.js, но так как enb в процессе сборки сжимает код в строку результат получается в строку, а хочется что бы с отступами и новыми строками.

Собственно b-layout-table преобразовывается в div, а не table. Примеры даже с документации копировал, все равно на выходе из json получаю div. то я делаю не так?

Например у меня есть блок Thing

block("thing")(
  attrs()({
    "itemscope": "",
    "itemtype": "http://schema.org/Thing"
  })
);

И я хочу чтоб блок Product наследовался от Thing

block("product")(
  attrs()({
    "itemtype": "http://schema.org/Product"
  })
);

и на выходе получал: <div class="product thing" itemscope itemtype="http://schema.org/Product"></div> Возможно ли такое?