Как известно, был создан форк NodeJS -> io.js Планируется ли разработка bem-tools на нём?
IO обгоняет Node по скорости, если исходить из этой статьи http://www.quora.com/Is-IO-js-faster-than-Node-js
Как известно, был создан форк NodeJS -> io.js Планируется ли разработка bem-tools на нём?
IO обгоняет Node по скорости, если исходить из этой статьи http://www.quora.com/Is-IO-js-faster-than-Node-js
Привет ! Подскажите пожалуйста, в методологии есть возможность создать layout как в Jade , подключать все скрипты в теге head и для других страниц.
Как правильно составить условие в bemtree для блока, чтобы он не выводился при определенных условиях
Например у меня есть блок block-a и я хочу чтобы он вообще не появился в результирующем bemtree, если в нем this.ctx.data не определено. У меня получился следующий рабочий вариант:
block('block-a')
(
match(this.ctx.data)
(
content()
(
function ()
{
var ctx = this.ctx;
var result;
// Some code ....
return result;
}
)
),
match(this.ctx.block && !this.ctx.data && !this.ctx.content) // @todo !!!
(
function ()
{
this.block = undefined;
this.ctx = {};
return applyNext();
}
)
);
Но мне кажется, что условие может быть более простым, но у меня не выходит.
Буду рад любой подсказке, заранее спасибо!
Всем привет!
На прошедшей неделе совместно с проектом LoftBlog мы проводили открытый вебинар по БЭМ, где в процессе знакомились с БЭМ-стеком и сверстали макет страницы Яндекс.Музыки.
В процессе подготовки к вебинару мы решили, что смотивируем пользователей на активное знакомство с БЭМ-платформой и придумали небольшое задание.
До дня защитника отечества – 23 февраля 2015 года мы ждем ваши проекты на БЭМ. Под проектами мы подразумеваем любые варианты разработки веб-проекта, будь то верстка страницы, написание отдельного компонента (слайдер чего-либо, корзина товаров и т.п.), БЭМ проект с бэкендом на node.js/php или разработка своей библиотеки с часто используемыми блоками.
Исполнителей лучших работ мы вознаградим подарками от команды БЭМ. Мы будем выбирать не по крутости проекта, а по полноте использования БЭМ стека и качеству выполнения. За основу можно брать заготовку для БЭМ проектов – Project-stub.
Результаты мы опубликуем на сайте bem.info. На вопросы, возникшие в процессе верстки проекта, команда и сообщество БЭМ с радостью ответит на бэм-форумe, а также не забывайте, что на сайте bem.info собрано много полезной информации и документации по БЭМ.
Требования:
Запись вебинара доступна на Youtube Тяжело в учении, легко в бою. Всем удачи в освоении и Stay BEMed!
Есть ли смысл писать вручную bemjson для сайтов с динамическим контентом? Сайт берет данные из БД, bemjson генерируется автоматически, получается bundlename.bemjson.js используется только при сборке, и то зачастую, там прописаны 2 - 3 блока, все остальное попадает в сборку по зависимостям.
Вижу на странице:
TypeError: Cannot read property '0' of undefined
at __$b29.iterateItems__$69 (.../users-list.bemhtml.js:501:46)
at __$b29.iterateItems__$69 (.../users-list.bemhtml.js:509:21)
at __$b29 (.../users-list.bemhtml.js:513:9)
at __$g2 (.../users-list.bemhtml.js:1028:24)
at applyc (.../users-list.bemhtml.js:33:20)
at __$b75 (.../users-list.bemhtml.js:809:5)
at applyc (.../users-list.bemhtml.js:105:20)
at __$lb__$160 (.../users-list.bemhtml.js:784:22)
at __$b74 (.../users-list.bemhtml.js:787:7)
at applyc (.../users-list.bemhtml.js:102:24)
Реально ли собирать sourcemaps и при таких выбросах резолвить файлы/строки вменяемо?
Не могу разобратьcя:
{
block: 'logo',
mix: { block: 'header', elem: 'logo' },
content: [
{
elem: 'name',
content: {
block: 'image',
mix: {block: 'logo', elem: 'pic'},
url: 'карзина.svg',
alt: ' альтернативный текст '
}
}
}
Вопрос: Как сделать чтобы image блок находил картинку которая лежит в папке блока logo, но не хочется менять путь url
Выявил особенность работы с модификаторами одного js блока на нескольких DOM-нодах:
i-bem
изменяет соответствующий класс на всех нодах блокаhasMod
имеет некоторые особенности:{ block: 'a', mods: { foo: 'bar'}, js( { id:1})},
{ block: 'a', js( { id:1})}
> this.hasMod('foo')
true
> this.toggleMod( 'foo', 'bar').getMod( 'foo')
""
{ block: 'a', js( { id:1})}
{ block: 'a', mods: { foo: 'bar'}, js( { id:1})},
> this.hasMod('foo')
false
> this.toggleMod( 'foo', 'bar').getMod( 'foo')
"bar"
Возможные последствия:
Способы решения:
#asktheteam
console.warn("unambigios mods set on block's nodes. see http://bem.info/... for more info")
при инициализации в девелопер режиме
P.S. если способа добавлять js код специфичный для девелопер режима сейчас нет, рассматривать это как отдельный фичреквест([
{
block: 'page',
content: [
{ block: 'test', mods: { foo: 'bar'}, js: true}
]
}
]);
<div class="test test_foo_bar i-bem" data-bem="{"test":{}}"></div>
page
из bem-core
автоматом тянет i-bem__dom_init_auto
и в собранном .js
присутствует.Однако блок не инициализировался: (https://gist.github.com/6bb4a5dc7d97cba5fa67) (http://bl.ocks.org/Guria/raw/6bb4a5dc7d97cba5fa67/)
Есть блок с элементами саджеста, сверстан как нумерованный список, а элементы списка, собственно элементы. Нужно что-бы цвет содержимого отличался от цвета цифр списка. Для этого решено оборачивать элементы тэгом и задавать другой цвет. Чем отталкиваясь от БЭМ методологии следует считать эти теги? Сейчас обертка выглядит как блок, это допустимо? Или нужно заставить их быть модификаторами?
<ol class="input__samples" role="list">
<li class="input__sample link link_pseudo_yes i-bem link_js_inited" role="listitem">
<div class="sample-inner">sample</div>
</li>
<li class="input__sample link link_pseudo_yes i-bem link_js_inited" role="listitem">
<div class="sample-inner"> sample2</div>
</li>
</ol>
Есть такая страничка, заявляющая, что она раскрывает смысл терминов Блок, Элемент, Модификатор. https://ru.bem.info/method/definitions/ Но, во-первых, нет конкретного определения, и, во-вторых, ничего не говорится про технологии, реализации, и другие важные при разработке сборки части.
Надо бы определиться с терминологией и определениями, чтобы можно было двигаться дальше. Подсобите, пожалуйста.
Off-topic. А еще вот такое хочу:
// возвращаем первое удачно разрешенное
target('bemdecl', oneOf(
// либо грузим файл `{level.path}/{bundle.name}/{bundle.name}.bemdecl.js`
fs.provide('bemdecl.js'),
// либо пытаемся загрузить bemjson.js и собрать динамически из bemjson.js
bemjsonToBemdecl(fs.provide('bemjson.js'))
));
Всем привет! Начал писать небольшой скрипт (т.к. подобного не смог найти), который на основе html файлов генерирует мне dep.js файл со всем используемыми блоками/элементами. Вот я получил такой файл:
exports.deps = [
{ block: 'b-layout', elem: 'content' },
{ block: 'b-layout', elem: 'content', modName: 'align', modVal: 'center' },
{ block: 'b-logo' },
{ block: 'b-auth-form' },
{ block: 'b-form' },
{ block: 'b-form', modName: 'stretch', modVal: true },
{ block: 'b-form', elem: 'content' },
{ block: 'b-form', elem: 'title' },
{ block: 'b-form', elem: 'controls' },
{ block: 'b-form', elem: 'control' },
{ block: 'b-input' },
{ block: 'b-input', modName: 'size', modVal: 'xl' },
{ block: 'b-button' },
{ block: 'b-button', modName: 'type', modVal: 'primary' },
{ block: 'b-button', modName: 'size', modVal: 'xl' },
{ block: 'b-button', elem: 'text' },
{ block: 'b-form', elem: 'footer' },
]
Конечный результат я получил с помощью библиотеки bem-naming. Но там не совсем корректно устанавливаются ключи для модификаторов. Собственно в этой issue как раз об этом говорится. Я не совсем понял что там в комментариях решили по этому поводу, поэтому пришел сюда. Чем я могу собрать свои css/js файлы используя полученный deps.js? Или я пошел в какие-то дебри и решение на основе обычных html файлов уже есть?
И снова популярный вопрос про вспомогательные классы, на этот раз его задает @life_maniac.
«Я правильно понимаю, что по БЭМу я не могу добавлять общие вспомогательные классы ко всем блокам? Например, есть класс center
, который центрирует содержимое по обеим осям. Хочется иметь его в шапке и еще в паре блоков.»
Да, но нет :)
С одной стороны, БЭМ утверждает: «Не может быть классов вне блоков». С другой стороны, в БЭМ есть понятие миксов — нескольких блоков на одном DOM-узле.
Этот случай — наш.
Предлагаю рассмотреть класс center
как универсальный блок, который можно подмешивать к любым другим блокам, чтобы центрировать их содержимое.
Примером такого блока в bem-core может служить clearfix, а в bem-components — z-index-group.
Важно помнить, что миксы можно использовать не только в CSS, но и в JavaScript.
Подробнее об этом можно узнать из доклада «Миксы во вселенной БЭМ».
https://gist.github.com/ec7034b7a409c826e989 Объявил зависимость shouldDeps модификатора от другого булевого модификатора.
({
shouldDeps:[
{ mods: { visible: true}}
]
})
В итоге в собранный deps.js булевый модификатор попадает дважды. До исходного модификатора:
{
"block": "drawer",
"mod": "visible"
}
После исходного модификатора:
{
"block": "drawer",
"mod": "visible",
"val": true
}
При этом появление модификатора visible до исходного является нежелательным и неожиданным.
Сборщик ENB настроенный generator-bem-stub
Приветствую, подскажите пожалуйста, куда нужно класть шрифты?
Использую BEM для генерации страничек, которые ходят в java-сервер за данными. Тестирую с помощью 'bem server'.
Собственно вопрос, могу ли я что-то сказать в командной строке, чтобы весь необходимый контент сгенерировался в указанную мной директорию, которую я положу за ngnix/Apache и у меня все будет работать?
Есть в bem-tools такое волшебное заклинание?
Пытаюсь осваивать bem в качестве веселой игрушки. Сам с вебом связан очень посредственно, основная деятельность C++ для приложений и Java для серверов.
Сейчас не могу вполне понять, как я могу из JavaScript кода динамически создавать bem-блоки и добавлять их в дерево на странице.
Есть желающие помочь разобраться?
Потерял ссылку на GITHUB-страничку, где было полное и поступенное описание всего стека технологий. В т.ч. там было про то, как вводить свои технологии, расширяя имеющиеся, и т.д. Перерыл историю браузера, но ничего не могу найти. Если подскажете, буду рад, т.к. имеющаяся документация оставляет некие кусочки в голове, не давая сразу целой картины мира. Спасибо.
Приветствую, друзья! Хочу собрать i-bem.js из bem-core, чтобы использовать его на проекте без полного БЭМ-стека. И я собрал его, но что то не фурычит он. Видимо я что-то не правильно делаю. Подтолкните в нужном направлении. Вот мой порядок действий:
common.bundles\index
создал файл index.bemjson.js
с таким содержимым:({
block: 'i-bem',
elem: 'dom'
});
`bem make
i-bem.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src='i-bem.js' type="text/javascript"></script>
<script src='index.js' type="text/javascript"></script>
</head>
<body>
<div class="b-calendar i-bem" data-bem="{'b-calendar:{}'}"></div>
</body>
</html>
modules.define('i-bem__dom', function(provide, DOM) {
DOM.decl('b-calendar', {
onSetMod: {
'js' : {
'inited' : function() {
console.log('inited');
}
}
}
});
provide(DOM);
});
В итоге после открытия страницы в консоль ничего не выводится... Что не так в моих действиях?
Привет, подскажите пожалуйста, что нужно сделать для того что бы подключить i-bem и правильно им воспользоваться, сейчас при обращении к серверу получаю ошибку "Uncaught ReferenceError: modules is not defined"
Ссылки по теме:
Roadmap
bh.php
код из bh.js
шаблонов, если bh.php
отсутствует, а bh.js
в наличии, чтобы уменьшить кол-во работы при поддержке (тулзы не смогут?);Шаблоны для bem-core и bem-components
Делитесь историями успеха, не стесняйтесь!
upd: поправил ссылки — перенсли проект в группу bem
upd: еще поправил ссылки — веточки протухли, вместо PR получились отдельные библиотеки с шаблонами для PHP
Доброго времени суток комрады. Столкнулся с необходимостью использовать конструкции сабжа, из доки, ничего не понял. Сделал вывод что для понимания нужно знать как это работает в XSL. Но с XSL'ом не работал, кто нибудь может объяснить как эти конструкции работают более подробно и в чем разница между ними? Было бы очень круто если на примерах.
А суть моей проблемы в том, что один шаблон должен помимо своей основной сущности, так же выводить результаты еще 1 шаблона при условии что у его родителя есть элемент этого шаблона.
Текст комментария не сохраняеться при ошибке отправления комментария. Не очищайте форму до отправки сообщения, или сохраняйти в localstorage.
Леша @zxqfox, а следом и Коля @gruzzilkin интересуются, как начать разрабатывать свою БЭМ-библиотеку.
Ответ на этот вопрос может быть разным в зависимости от того, что вы вкладываете в этот термин.
Я попробовал рассмотреть создание библиотеки от простого к сложному, постепенно добавляя фичи.
А именно:
А в конце поделился рецептом, как быстро получить себе всю инфраструктуру, которую мы используем для bem-библиотек. TL;DR
В самом простом случае любая папка, в которой лежат файлы с реализацией блоков, может служить библиотекой.
Например, вот так может выглядеть полезная библиотека с блоком clearfix
:
my-library/
clearfix/
clearfix.css
Конечно, просто копировать ее из проекта в проект не очень удобно. Поэтому стоит воспользоваться любимой системой контроля версий и опубликовать библиотеку, скажем, на github.
На проекты ее удобно будет доставлять через bower
.
Получим:
my-library/
.git/
bower.json
clearfix/
clearfix.css
Теперь представим, что у нас в библиотеке появился блок ua
, который будет помогать с feature detection.
Хозяйке на заметку: не стоит бояться класть в библиотеку блоки, которые не будут востребованы во всех ваших проектах, ведь сборщик соберет только нужные вам блоки в каждом конкретном проекте.
Нужный блок можно реализовать несколькими способами.
Самый простой — поступить по аналогии с clearfix
и положить реализацию в соответствующую папку:
my-library/
.git/
bower.json
clearfix/
clearfix.css
ua/
ua.js
Однако, очевидно, что для разных платформ будут нужны разные данные. Например, на мобильном устройстве нас интересует ориентация устройства, для десктопа это знание не нужно. Тогда как часть информации о user agent будет нужна на всех платформах.
Как можно избежать дублирования кода и при этом не тянуть лишний код туда, где он заведомо не нужен?
Можно воспользоваться концепцией уровней переопределения. Это может выглядеть так: один блок представляем «слоями», а каждый новый слой до- переопределяет либо какую-то часть визуальных свойств, либо доопределяет поведение блока.
В результате структура библиотеки может выглядеть так:
my-library/
.git/
bower.json
common.blocks/
clearfix/
clearfix.css
ua/
ua.js
desktop.blocks/
ua/
ua.js
touch.blocks/
ua/
ua.js
Мы видим, что блок ua
оказался разделен на общую между всеми платформами часть (она попала в common.blocks
) и специфику, необходимую в конкретном окружении.
Как это работает?
Сборщик знает, какие уровни переопределения и в каком порядке мы хотим собирать для нашего проекта. Поэтому код из последующих «слоев» сможет перекрыть предыдущий.
Нагляднее всего это можно продемонстрировать на примере с CSS:
/* my-library/common.blocks/b1 */
.b1 {
width: 150px;
height: 50px;
}
/* my-library/desktop.blocks/b1 */
.b1 {
font-size: 24px;
height: 80px;
}
Здесь некий блок b1
представлен на двух уровнях: common.blocks
и desktop.blocks
. При этом на общем уровне ему задаются высота и ширина, на уровне desktop.blocks
добавляется знание про размер шрифта, а высота переопределяется новым значением.
Если писать код определенным образом, то аналогичного эффекта можно достичь и для остальных технологий, в т.ч. JavaScript и шаблонов. Например, мы используем i-bem.js и BEMHTML(https://ru.bem.info/technology/bemhtml/), чтобы упростить себе эту задачу.
Когда в библиотеке окажется много блоков, потребуется какое-то описание для всей библиотеки в целом. А если блоки в ней будут достаточно сложными, то хорошо бы иметь описание каждого блока отдельно. Кроме того, нужно где-то фиксировать информацию об изменениях в каждой версии библиотек.
Получим что-то вроде:
my-library/
.git/
bower.json
common.blocks/
clearfix/
clearfix.css
clearfix.md
ua/
ua.js
ua.md
desktop.blocks/
ua/
ua.js
ua.md
touch.blocks/
ua/
ua.js
ua.md
README.md
CHANGELOG.md
Если работу над библиотекой ведут сразу несколько разработчиков, то нужно следить за кодстайлом, для блоков писать тесты, которые бы запускались на прекоммит-хук и в CI:
my-library/
.csscomb.json
.git/
.githooks/
pre-commit
.jscsrc
.jshint-groups.js
.travis.yml
bower.json
common.blocks/
clearfix/
clearfix.css
clearfix.md
ua/
ua.js
ua.md
ua.spec.js
desktop.blocks/
ua/
ua.js
ua.md
ua.spec.js
package.json # здесь задекларируем модули для сборки и тестирования
touch.blocks/
ua/
ua.js
ua.md
ua.spec.js
README.md
CHANGELOG.md
В какой-то момент для наглядного примера работы каждого блока во всей его вариативности может потребоваться демо-страница.
Я не случайно оставил за скобками всю историю про сборку таких примеров, тестов и документации по всем уровням переопределения.
Также не стоит ограничиваться unit-тестами для JavaScript, проверки требуют и шаблоны, и верстка. А для всех видов тестов в свою очередь потребуется анализ покрытия (coverage).
Для решения всех этих задач в БЭМ-платформе существуют готовые инструменты. Их достаточно много, и каждый требует какого-то времени, чтобы с ним разобраться.
Поэтому самый простой способ быстро начать разрабатывать библиотеку, а не заниматься налаживанием необходимой инфраструктуры вокруг — взять готовое.
Я бы предложил поступить примерно так:
git clone https://github.com/bem/bem-components.git my-library
cd $_
rm -rf *.blocks/* design
Теперь можно пользоваться ;)
Конечно, это не самый элегантный способ, но зато быстро и работает.
Мы думаем над тем, как облегчить получение готовой инфраструктуры для своей библиотеки. Решение видится в пакете-обертке над всем необходимым с удобным и лаконичным API.
Рассказывать о ней планируем в нашем блоге. Stay BEMed!
Возможно ли использование компонентов реализованных как bem блоки на проектах ничего не знающих о bem? Если да, то как именно?
Привет.
Я тут думаю, как бы мне так доопределить bemtree, чтобы можно было писать
block('block').js()({a: 1});
и
block('block')(
js()({a: 1})
);
вместо
block('block').def()(function () {
this.ctx.js = {a: 1};
return applyNext(this.ctx);
});
Может, кто-то уже делал такое?
Здравствуйте. Хочу сделать сервисный блок, чтобы блок фактически генерил только один элемент и при повторном обращение его просто обновлял, но генерил эту штуку только если его вообще потребовали. Столкнулся с проблемой, что я без понятия как засейвить этот элемент и как с ним правильно обращаться. В сам по себе блок не хочется вставлять эту логику, так что синглтонизацию вынес в отдельный модуль, он инитится(я пользуюсь bem-stack'ом и инитится он i-bemdom) и выводится, но как его дальше взять я без понятия, и как послать событие от моего модуля к таким образом сгенеренному блоку тоже без понятия. Помогите плиз ._.
И еще вопрос в догонку есть ли какой-то cheatsheet с шаблонами реализации для i-bem. И еще один вопрос в http://ru.bem.info/technology/i-bem/v2/i-bem-js/ тут написано Пример: Вызов статического метода close блока popup — закрыть все попапы на странице: можно полностью этот пример, а то я пытался как-то реализовать, но если метод статический то никакой this.delMod('visible') не сработал и что либо еще не смог сделать с объектом, нужно видимо еще какие-то настройки в случае объявление такого делать, можно их привести полностью и сам метод close?
Можем ли мы использовать вместо BEM модификаторов WAI ARIA атрибуты, в случаях, когда нужно отобразить состояние и прочие кейсы на доступность?
Например,
<div aria-disabled="true"></div>
Можем ли мы опираться только на ARIA-атрибуты, если нам нужно написать какую-то логику на задисейбленный элемент?
if (this.attr('aria-disabled')) {}
Коллега аргументирует, что раз мы используем уже методологию, то зачем нам распыляться и использовать атрибуты, если есть модификаторы:
if (this.elem('some-element').mod('disabled')) {}
Смотря на то как написаны COA нет ясности, а из API то как мне использовать команды?
Вот мне надо собирать bem-tools-ом так, чтобы он не использовал cache,
И вроде нечто такое есть forceCache: ture
, но как мне
require('bem').api.build({ forceCahse: true, //..... })
выполнить то? Чтобы не использовал он Cache.... А то подает с ним постоянно.