Сейчас в основном, все что касается html (тэги, атрибуты) я обрабатываю в bemhtml, остальное в bemtree. А если мне понадобятся эти же преобразования на клиенте, то их надо будет перенести в bemhtml или возможно шаблоны bemtree по депсам включить в собираемый js? Или все же bemtree это чисто серверная технология?
К примеру одно из обычных преобразований:
block('custom-menu').elem('item')
(
def()(function () {
var ctx = this.ctx;
return applyCtx({
block : 'link',
url : ctx.url
mix : {
block: this.block,
elem: this.elem
}
content : ctx.content
})
})
)
Вот, если это преобразование необходмо на клиенте оно должно быть в bemhtml? Просто по логике мне хочется пред. код описать в bemtree, а всякие теги и атрибуты для этого блока в bemhtml.
bemtree - это просто шаблоны, нет ничего плохого в шаблонах на клиенте.
Более того — для Single Page Application (или близкой к SPA архитектуре) в них есть еще и куча плюсов ;-)
Так их можно подключить на клиент в общий js? Если так, то теряется смысл моды
def()
иcontent()
для bemhtml, т.к преобразование по этим модам необходимо выполнять в bemtree.@4ok безусловно их можно подключать в общий js.
def()
в BEMTHML действительно чаще всего не требуется, аcontent()
нужен для кейсов создания число оформительских оберток и добавления всяких визуальных штук в разметку, которые не несут особой семантической нагрузки.Приведи пример пож-то визуальных штук, чтобы было ясно, что именно имеется ввиду, спасибо.
@4ok например, элемент для иконки, какие-то разделители и прочие украшательства, которые по каким-то причинам не удается выразить через
:before
и:after
в CSS@tadatuta, спасибо, понял.
В bemtree шаблонах на сервере я часто использую require необходимых модулей, выходит, что в случае подключения этих шаблонов на клиент, необходимо придумать как обходится без них. Что можно придумать в этом случае?
Например необходим модуль форматирования даты - для ноды это require в самом bemtree, а на клиенте подключение через
<script src="..."></script>
. Но в этом случае сам require в шаблоне я так понимаю нужно удалить и передать этот модуль как параметр в bemtree.Правильное направление мысли?
@4ok можно заворачивать все в YModules, которая работает и на клиенте и на сервере.
Получится что-то типа:
@tadatuta - супер! Но как потом эти объявленные модули использовать в bemtree? Не соображу никак.
@4ok например, вот так:
дальше можно пробросить все необходимые модули вглубь по дереву в шаблонах:
и, соответственно, они будут доступны из всех блоков:
Я вот подобное в
BH
изобразил для инлайновых svg.@tadatuta а на сколько адекватно использовать пободную конструкцию?
@Guria Нормально )
Я бы еще предложил посмотреть в сторону инлайнинга SVG прямо средствами
borschik
:Хотелось бы тогда технологии делить на серверные, клиентские и общие по суффиксу. Правильно ли разделить их след. образом -
*.node.bemtree
,*.browser.bemtree
,*.bemtree
?В силу того, что мы можем доопределять функциональность на разных уровнях и нас никто не может оставить от этого — не проще вынести общий функционал на уровень
common.blocks
, серверный наserver.blocks
, и браузерный вbrowser.blocks
?Но если очень хочется — можно и так разделять, только надо будет технологии написать, по аналогии с
enb-modules
(или аналогов дляbem-tools
).@4ok да, вполне можно делить так (для консистентности можно еще последовать принятой в bem-core схеме и общее для всех платформ явно назвать
vanilla.bemtree
), а можно и разнести по уровням, как предлагает @zxqfox. Но я бы рекомендовал не плодить сущностей и ограничиться просто использованиемdepsByTech
, если только не предполагается, что будет много блоков, которые принципиально несовместимы, но называются одинаково.@tadatuta, @zxqfox - доступно, спасибо.