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

Добрый вечер.

В конфиге уровни определены:

const builder = Builder({
    levels: [
        'node_modules/bem-core/common.blocks',
        'node_modules/bem-core/desktop.blocks',
        'node_modules/bem-core/touch.blocks',
        'node_modules/bem-components/common.blocks',
        'node_modules/bem-components/desktop.blocks',
        'node_modules/bem-components/touch.blocks',
        // 'node_modules/bem-components/design/common.blocks',
        // 'node_modules/bem-components/design/desktop.blocks',
        'common.blocks',
        'desktop.blocks',
        'touch.blocks'
    ],

Вопросы:

1) Означает ли что с данной настройкой - desktop.bundles/index/index.html соберет в себя уровень touch ?

2) У меня собирает уровень touch для desktop. так и должно быть? Необходимо в конфиге закомментировать "не нужное" находящееся на одном уровне с "нужным"?

Клонирован шаблонный репозиторий - Project-stub, установлен ym

Команда - $ bem create desktop.bundles/page/page.bemjson.js создает пустой page.bemjson.js. В readme Project-stub говорится о начальном заполнении содержимым.

Как bem-tools дать понять, что необходимо *.bemjson.js заполнить содержимым, и где это содержимое найти?

Привет!

Если вы используете enb-postcss (это актуально как минимум для пользователей project-stub или bem-express), то вам необходимо сделать вот такие изменения у себя на проекте https://github.com/bem/project-stub/commit/7795a5648f29343577f962b2ab1cd09dbae29071, чтобы избежать дублирования стилей в собранных бандлах.

Привет всем! Начал разбираться с bem-config. Крутецкая, между прочим, штуковина! Жаль, только примеров использования крайне мало. Хотелось бы узнать, как предполагается использовать секции libs и levels?

Приветствую всех на форуме!

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

https://youtu.be/rO1k3j6PN8w

На видео записал экран + панель разработчика. OS Win10 Проблема на клиенте или сервере? У кого ни будь такое происходит?

EDGE, Chrome - отказываются добавлять пост. Chrome - постит только после того, как из панели разработчика запустил эмуляцию мобильника. Данный пост смог написать только с IE11. Тревожно на свой проект тянуть - т.к. с JS мало знаком, и самостоятельно исправить не смогу.

Ребята, дайте обратную связь...

Историческая справка

До недавнего времени мы работали над возможностью генерации Virtual DOM на основе BEMHTML-шаблонов. Мы разработали специальный движок для bem-xjst – xjst-ddsl, который может превращать шаблоны в некий DDSL, который с помощью дополнительного хелпера – ddsl-react превращался в React. Это было сделано для того, чтобы отделить специфику React и сделать закладку на тот случай, если захочется другую реализацию Virtual DOM. Об этом рассказывал я, например, на Я.Субботнике. Мы выдвинули и даже математически доказали гипотезу об эффективности этого метода, поскольку он позволял в 10 раз ускориться на сервере относительно нативного рендеринга на React, ведь на сервере мы можем использовать стандартный рендер в HTML, так как шаблоны одни.

Спустя некоторое время

Все это время мы делали подход в опенсоре – react-bl и внутри на реализацию компонентов для React на BEMHTML-шаблонах. Внутри мы попробовали очень большой объем компонентов, в том числе и составные/сложные с попапами и модальными окнами.

В чем разница открытой версии и внутренней?

В react-bl мы пробовали писать React-код для клиента "сверху" верстки и шаблонов, чтобы не трогать сами шаблоны и пробрасывать биндинги через пропсы компонентов. То есть получался "настоящий" React-компонент, где только разметка генерировалась с помощью BEMHTML. Такой подход нёс в себе несколько проблем. Во-первых, не работали уровни переопределения для клиентского кода, только для верстки в шаблонах. Во-вторых, добавлял иногда большие трудности при пробрасывании пропсов во вложенные элементы, тем более, если они строились динамически и имели вариативность.

Основываясь на этом опыте внутри мы попробовали писать клиентский код прямо в BEMHTML шаблонах. Например так:

block('link')(
   tag()('a'),
   js()(function() {
      return {
        onClick: () => console.log('hi there')
      };
   })
);

Это позволило решить проблемы с уровнями переопределения. И декларацией клиентского кода для вложенных элементов. Но... Нам пришлось добавить немного магии в ddsl-react (тот самый хелпер, что превращает DDSL в React). Мы добавили автоматический биндинг контекста. Ведь клиентский код в шаблонах ничего не знал про инстанс React-компонента и мы сделали это автоматически.

Кроме того, скорее всего вы спросите...

Как же было дело со вложенными компонентами?

Вопрос о том, что если кнопка использует иконку, а иконка тоже компонент? Ведь вызов иконки описан в BEMHTML и это просто BEMJSON, а не какой ни React-component. Мы решили эту проблему полуавтоматически: во время обьявления класса мы используем хелпер (ddsl-react), который первым аргументом принимает обьект с матчингом блоков на React-компоненты. Внутри во время рендера, когда встречается блок из матчинга он подменяется на React-компонент. Ведь разработчик знает, что за блоки используется в составном среди BEMHTML.

Что стало?

К сожалению, мы не учли несколько нюансов, и как мы ни пытались их обойти, сделать это эффективно у нас не получилось. А именно:

  • проблема автоматического биндинга контекста: это очень большая магия и возникают неоднозначности при обращении к элементам из блока или к другим элементам из элемента
  • проблема проставления refs, в 99% случаев все хорошо, но только не когда нужен ref на вложенный элемент в блоке, который вложен в другой блок
  • слишком строгие правила для написания шаблонов чтобы серверный рендер работал действительно быстро. То есть клиентский код должен быть вынесен в другой уровень относительно верстки и это надо учитывать в сборке. В противном случае среди рендера BEMHTML функции React по прежнему выполнялись, что сильно замедляло процесс

Всё прям плохо?

На самом деле нет. В 99% случаев решение работает и работает хорошо. Просто ожидаемый профит показался недостаточным. Нам хотелось быстрый рендер на сервере и удобное написание React-компонентов. Опытным и трезвым умом нам показалось что мы этого не достигли. Тем не менее использовать BEMHTML-шаблоны в React можно, но базировать на этом библиотеку с компонентами не стоит. Если у вас есть желание работать с этим решением, я с радостью помогу разобраться и раздам прав. Мейнетейнеры нынче в цене.

Что дальше?

Мы проверяем новую гипотезу в bem-react-core. Это очень маленькая по обьему библиотека, которая позволяет декларировать React-компоненты в BEMHTML подобном синтаксисе, писать на последнем стандарте, собираться чем угодно(webpack, gulp, rollap, babel), поддерживает уровни переопределения и все все, что мы так любим. В репозитории есть набор примеров, которые можно посмотреть и понять. Мы работаем над новым набором компонентов в bem-react-components. Внутри мы так же попробовали очень много компонентов и кажется все очень хорошо. У нас уже почти готова документация и скоро она появится в репозитории. И так же скоро появится поддержка i18n ;) Приходите с PR и хейтерством. Все что мы запланировали пока, кажется отражено в issues.

Код для привлечения внимания

Имеется стандартный JSON кнопки -> block : 'button', mods : { theme : 'islands', size : 'm', view : 'action'}, text : 'Создать' В html мы получаем: <button class="button button_theme_islands button_size_m button_view_action button__control i-bem button_js_inited" data-bem="{&quot;button&quot;:{}}" role="button" type="button"><span class="button__text">Создать</span></button>. К данному html мне нужно ещё добавить элемент к JSON чтобы в конечном результате в html вышло: <button class="button button_theme_islands button_size_m button_view_action button__control button__add-form i-bem button_js_inited" data-bem="{&quot;button&quot;:{}}" role="button" type="button"><span class="button__text">Создать</span></button>.

Привет!

Только что bem-express получил очередную партию мажорных обновлений:

  1. Обновление bem-core до версии ^4.1.1 и bem-components до ^5.0.0.
  2. Переход со Stylus к PostCSS, из коробки поставляется тот же набор плагинов, что и в bem-components.
  3. Внедрение опционального livereload. Подробнее см. https://github.com/bem/bem-express/blob/master/development.blocks/livereload/livereload.md и в README проекта.
  4. Ускорение сборки за счет прогрева npm-модулей, необходимых для сборки. Теперь обновление стилей у меня на ноутбуке занимает ~300мс и не требует перезагрузки браузера.
  5. Отказ от bower для поставки библиотек. Теперь все зависимости ставятся через npm в папку node_modules.

Приятных вам апдейтов в новом году!

Клонирую себе project-stub, ставлю зависимости, добавляю вторую страницу. https://ru.bem.info/toolbox/enb/enb-bem-techs/build-merged-bundle/ — копипастю код .enb/make.js (исходный — комментирую) вызываю node_modules/.bin/enb make получаю Error: Cannot find module 'enb-css/techs/css'... ставлю https://github.com/enb/enb-css как зависимость, вызываю node_modules/.bin/enb make получаю Error: file not found: D:\projects\project-stub\desktop.bundles\contacts\contacts.bemdecl.js...

Немного странно выходит: чтобы собрать merged-бандл мне нужно сначала собирать обычный (в моем случае — постраничный), потом менять код .enb/make.js? (Данублин!)

Вопросы:

  1. Можно ли запускать node_modules/.bin/enb make с разными конфигами? ( .enb/make.js отдельно, какой-нибудь .enb/build.js) отдельно). Если да — как?
  2. Как собрать merged-бандл для project-stub без описанных выше извращений с .enb/make.js?
  1. Я сделал страницу. К ней подключена тонна JS (это не про jQuery). Что это? Как получить необходимый минимум (только функциональность использованных блоков)?
  2. Как собрать результат верстки нескольких страниц в отдельную папку?
  3. Как получить неминимизированный HTML?
  4. Как получить один JS и один CSS файл для нескольких страниц?

Вероятно, это можно добавить в FAQ.

Хочу из одного места склонировать блок в другое и потом поменять у этого клона модификатор

Если просто делать

bemDom.prepend(
    ctx,
    activeSlide.domElem
 );

то при смене модификатора у этого клона, меняется модификатор и у блока с которого происходило клонирование))

Хочется практического четкого примера с gulp. Много надежд после этого заявления: https://youtu.be/Ai-yt0b8iKE?t=2h4m5s (t=2h4m5s про галп) Смотрел https://ru.bem.info/forum/1138/ — размыто, нечетко, много накладок по ходу и некоторое количество «непонятной магии». Колеблюсь межу переходом к полному стеку и написанием очередного велосипеда (сейчас использую методологическую часть). Сформулировал желания, которые хотелось бы воплотить на практике или посмотреть на примеры их реализации в рамках одного проекта:

  • Написание страниц с BEM-XJST
  • Диалект Галлахера
  • Автоматически получать список стилевых файлов для компиляции на основании списка используемых на страницах блоков, управлять очередностью
  • Автоматически получать список JS-файлов для конкатенации на основании списка используемых на страницах блоков
  • Произвольный CSS-препроцессор
  • Уровни переопределения
  • Возможность использовать bem-core и bem-components (переопределять на проектном уровне)
  • Автообновление в браузере по изменению файлов в папке блока, страницах, в доп. файлах (шрифты, картинки, SVG-спрайт ect.)
  • На входе: технологии блока в папке блока, глобальные файлы
  • На выходе: папка (build/?) с готовыми страницами, картинками, одним стилевым файлом, одним JS-файлом (отправка на gh-pages?)

Возможна ли вообще такая комбинация на данный момент? Стоит ли тратить время на попытки воплотить это всё?

Привет, любителям Pug / Jade и БЭМ возможно будет интересен мой велосипед:

+b('alert', 'success')
    +e('text', 'bolder') Success
<div class="alert alert--success">
    <div class="alert__text alert__text--bolder">Success</div>
</div>

Подробнее на GitHub или NPM

Приветствую! Вчера познакомился с БЭМ методологией и решил использовать её в новом проекте, только стиль наименования. Так вот, интересно, правильно ли я пока всё делаю или можно как-то улучшить или в корне неправильно, жду советов и помощи, если что. Заранее хочу предупредить, что использую блоки центрирования контента, .row {margin-left: -15px; marign-right: -15px} col-12 {padding-left: 15px; padding-right: 15px} но их я не отношу к данной методологии, они служат мне просто как разметка и я делаю вид, что их просто не существует, в коде увидите сами, знаю, что так неправильно вроде, но не знаю как под другому сделать, да и так в принципе неплохо. Код codepen.io/anon/pen/ZBVVgy Заранее всем спасибо!

Добрый день! Подскажите как правильно собрать несколько страниц в рамках одного проекта. Структура такая: project -page1 -------scroll1 -------scroll2 -------scroll3 -page2 -page3

Как получить отдельную сборку js для scroll1, scroll2, scroll3 без библиотеки i-bem тк хочу загрузить js код каждого скрола в отдельный компонент при интеграции в Битрикс а библиотеку I-bem вывести один раз, например подгрузить в шапке для всего проекта.

Привет, друзья!

Мы наконец-то выпустили долгожданную версию bem-components 5.0.0! Это там самая версия, которая под капотом использует bem-core 4.1.1. Как и в bem-components 4.0.0, в версию вошли сразу 2 набора стилей: исходники на postCSS и скомпилированный CSS на случай, если вы предпочитаете использовать какой-нибудь препроцессор.

В ближайшее время на bem.info появится документация на эту версию.

Кстати, вы обратили внимание, как круто она выглядит в новом дизайне?

Давно хотел понять, пожалуйста поясните какой смыл в одинаковом содержании разделов платформ.

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

Понятно что каждый уровень может содержать доопределения и какие именно можно разглядеть в табе "Source" (если внимательно присмотреться), и как следствие демонстрация блоков учитывает эти доопределения.

При этом дока, html, BEMJSON deps на первый взгляд идентичны.

Какая в этом польза?

Правильной ли по БЭМ будет такая верстка, или можно сократить, перенеся, например класс блока home-featured-item на уровень container__col container__col_size_6?

<section class="home-featured-items">
    <div class="container">
        <div class="home-featured-items__title">Интересные предложения</div>
        <div class="home-featured-items__ads">
            <div class="container__row">
                <div class="container__col container__col_size_6">
                    <div class="home-featured-item">
                        <div class="home-featured-item__title">Название объекта</div>   
                    </div>
                </div>
                <div class="container__col container__col_size_6">
                    <div class="home-featured-item">
                        <div class="home-featured-item__title">Название объекта</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

у нас есть несколько разделов сайта. Админка, профиль, публичная часть. Сейчас собирается 3 merged бандла. При этом на публичной части много разных страниц. Хотелось бы иметь что то вроде core.js, core.css куда попадут стили и скрипты общие для всех страниц публичной части, и маленькие js и css для каждой отдельной страницы, где будут уникальные стили-скрипты для нее. Как это сделать?

Здравствуйте! Помогите пожалуйста разобраться с методологией БЭМ на примере. Есть HTML:

<div class="block">
<p class="block__paragraph">Some text</p>
<span class="block__fragment">Some fragment</span>
</div>

Нужно стилизовать селекторы block__paragraph и block__fragment блока block. В дизайне оба селектора имеют одинаковый цвет и подчеркивание.

Вариант 1

.block {
 color: red;
 text-decoration: underline;
}

В результате элементы block__paragraph и block__fragment УНАСЛЕДУЮТ color и text-decoration. Нужно понимать, что так как они ЭЛЕМЕНТЫ, то НЕ БУДУТ использоваться вне блока.

Вариант 2

.block__paragraph {
 color: red;
 text-decoration: underline;
}

.block__fragment {
 color: red;
 text-decoration: underline;
 }

Здесь мы просто копируем одинаковые свойства КАЖДОМУ элементу (много одинакового кода).

Скажите пожалуйста, какой вариант по методологии БЭМ верный? Может есть ссылка на ту часть документации, которая дает ответ на вопрос.

Спасибо.

Хочу верстать новый проект с именованием по БЭМ. Как быть с готовыми jquery плагинами, например Owl carousel, который при подключении генерирует свои классы. Они будут не по БЭМ?

Доброго врмени суток! Я сразу к делу. Дано: проект на yii2. Верстальщики отдают верстку в виде набора html, ccs, js файлов. Программисты это дело прикручивают к движку (в процессе вносят собственные правки в стили) на выходе получаем полный треш, которые верстальщиками приходится править уже на живом проекте во вьюхах и лейаутах yii Задача: внедрить в верстку методологию bem, использовать автоматизацию сборки фроненда. Проблема: как это сделать отдельно на этапе верстки вопросов нет. Вопрос как сохранить использование этой методолгии и всех ее инструментов после программирования. Может есть кто автоматизировал процесс верстки с бекендом на yii ?

<div class="sub-menu">
        <ul class="sub-menu__list">
            <li><a class="sub-menu__link sub-menu__link_active" href="#">Главная</a></li>
            <li><a class="sub-menu__link" href="#">Мобильная версия</a></li>
            <li><a class="sub-menu__link" href="#">О компании</a></li>
            <li><a class="sub-menu__link" href="#">Каталог продукции</a></li>
            <li><a class="sub-menu__link" href="#">Склад</a></li>
            <li><a class="sub-menu__link" href="#">Партнеры</a></li>
        </ul>
        <div class="sub-menu__info">
            <div class="sub-menu__info-group">
                 адрес компании
            </div>
            <div class="sub-menu__info-group">
                 информация о компании
            </div>
        </div>
    </div>

Как именовать блоки внутри элемента? (sub-menu__info)

Как быть если возникает такая ситуация что в css-классе блока нечего писать, оказалась достаточно написать стили только для его элементов - оставлять пустой css-класс блока для единообразия?

Ознакомился с материалами на https://ru.bem.info/, но не могу для себя прояснить ряд моментов, объясните пожалуйста:

  1. Где должен быть описан внешний вид блока (размер, цвет и т.д.): можно в css-классе блока писать или обязательно в модификаторе блока? Можно ли писать дефолтный внешний вид прямо в в css-классе блока?
  2. Где должен быть описан внешний вид элемента: можно в css-классе элемента или обязательно в модификаторе элемента? Можно ли писать дефолтный внешний вид прямо в в css-классе блока?
  3. В методологии указано: Блок не должен влиять на свое окружение, т. е. блоку не следует задавать внешнюю геометрию (в виде отступов, границ, влияющих на размеры) и позиционирование. А где тогда указывать свойства влияющие на позиционирование(position, display, float, margin и т.д.)?
  4. Все что касается позиционирования элемента я могу писать в css-классе элементе?

Привет! Я хотел вкрутить юнит тесты в проекте по инструкции https://ru.bem.info/toolbox/enb/enb-bem-specs/, но получил ошибку

Failed to start mocha: Init timeout Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL

Решил попробовать на базовом проекте (https://github.com/bem/project-stub), но получил такой же результат. Посмотрел какие файлы формируются и заметил, что в конечных файлах тестов пустые html и css файлы. Пропущена какая-то зависимость?

Здравствуйте. Разворачиваю bem-site-engine. https://github.com/bem-archive/bem-site-engine Столкнулся со следующе ошибкой: [2016-11-29 18:33:54] DEBUG app.app.node.js: app initialization [2016-11-29 18:33:54] DEBUG _type.provider_type_file.node.js: make directory backups/0 [2016-11-29 18:33:54] DEBUG _type.provider_type_file.node.js: copy file from backups/data.json to backups/0/data.json [2016-11-29 18:33:54] ERROR model.model.node.js: Error occur while loading model ENOENT: no such file or directory, stat 'backups/data.json' [2016-11-29 18:33:54] DEBUG app.app.node.js: starting server [2016-11-29 18:33:54] ERROR app.app.node.js: TypeError: Cannot read property 'redirects' of undefined

Верно ли я понимаю, что надо сделать snapshot? Если да, как его сделать? Спасибо.

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

Вопрос, куда прописать зависимость бандла от блоков без DOM-представления модели?

Если прописать модель в BEMJSON виде пустого блока, то у блока page появляется зависимость от модели и асинхронной инициализации визуальных блоков внутри page не происходит.