Добрый день! Начал верстку интернет-магазина в котором более 30 страниц. И тут же заказчику уже захотелось кое-что поменять в шапке. Страшно представить, что когда будет сверстан весь проект и начнутся правки, то придется ходить по ВСЕМ страницам и менять что-то в одинаковых блоках (header, footer, menu, rightbar и т.д.). Это будет просто самоубийство, и при всём уважении к данной методологии и её способности увеличивать скорость создания проектов, для данного случая эту будет намного дольше. Я пересмотрел и перечитал уже кучу материалов, но, блин, не могу сделать, чтобы это было корректно и удобно. Подскажите кто-нибудь, пожалуйста, как такое реализовать. Ведь полюбому есть решения данной проблемы, т.к. БЭМ используется, в основном, в крупных проектах. Прям очень очень прошу помощи и указать как такое реализовать, потому что не хочется, особенно при верстке такого крупного проекта, отказываться от БЭМ. Да, использую в качестве сборщика gulp, т.е. как реализовать это всё на нём. Спасибо!
Не понятно, почему "придется ходить по ВСЕМ страницам и менять что-то в одинаковых блоках", вместо того, чтобы поменять только шаблон блока, в котором нужны изменения. Например, шаблон блока header.
Посмотри на https://github.com/tadatuta/bem-bemtree-static-project-stub/blob/master/README.ru.md, если после прочтения понятно не станет — пиши, попробую помочь.
@apsavin - потому что контент пишется не в шаблоне то, а в page.bemjson.js, а клиент выносит мозг по этому поводу - то ему одно слово хочется изменить, то фразу, то убрать что-то, а на такие мелкие правки столько времени в совокупности тратиться.
@tadatuta - читал данную статью и даже смотрел вебинар, но, к сожалению, не понял как это реализовать на gulp. Я так понял он пока еще не сильно популярен в БЭМ и в основном используется ENB. Но честно, ENB не сильно хочется использовать, тем более многие задачи, которые нужны именно мне, разработал на gulp. Вот не поверите, но пока ждал ответ, заказчик вообще попросил заморозить верстку шапки на внутренних страницах, и продолжать верстать дальше, пока дизайнер отрисует новую. А это значит, что потом придется либо копипастом заниматься, либо как-то вынести это, на что у меня пока не хватает знаний(( Буду очень признателен в помощи. И если разберусь, то прям подробно напишу статью, чтобы другие новички, при столкновении с данной проблемой решили её легко.
Для начала важно понимать, что BEMJSON — это обычный JS, там доступны все возможности избавиться от копипаста типа
require
иfs.readFileSync
.Т.е. вместо условного
Можно смело писать
Ну а пример со сборкой BEMTREE на gulp попробую сейчас состряпать...
Хорошо, буду ждать, спасибо большое, Владимир!
Блин, и всё равно не понятно как подключить один файл в другой, т.к. там генерится куча других файлов, посмотрите пожалуйста, ато если начну расписывать, то получится целая статья https://yadi.sk/d/a_5j5L97x5Msh
Код хорошо бы показывать на github — там и смотреть можно, не разворачивая у себя и комментировать построчно.
В целом то, что в архиве — просто невалидный JS.
require
возвращает то, что экспортирует модуль. Соответственно, если ожидается, что нужно вызвать функцию (require('path/to/module')()
), то, конечно, и экспортить нужно функцию. Если достаточно просто объекта, то не нужно пытаться его вызывать :)В моем примере функция для того, чтобы мочь в одинаковую часть передать какие-нибудь данные. Скажем, в одинаковую шапку передавать уникальные названия каждой страницы.
Т.е. в
common.blocks/header/header.bemjson.js
кладем что-то типа:Тогда в
desktop.bundles/page1/page.bemjson.js
можно будет:Как по мне использовать require, если есть bemtree это как то фу. Нужен starter-kit с bemtree, а не с bemjson.
https://github.com/tadatuta/bem-bemtree-static-project-stub
А как тогда писать шаблоны в движке BEMTREE, если в документации написано: "Движком BEMTREE используются только режимы def и content. Пользовательские режимы тоже могут быть использованы. Остальные режимы, описанные в документации выше, применимы только к BEMHTML."
Нужно использовать 2 прохода: BEMTREE генерирует только дерево (данные), а за HTML-разметку по-прежнему отвечает BEMHTML, ровно как здесь https://github.com/tadatuta/bem-bemtree-static-project-stub/blob/master/README.ru.md описано.
Владимир, можете, пожалуйста, объяснить в каких случаях использовать движок BEMTREE, а в каких BEMHTML? Потому что, если не ошибаюсь, в одном из вебинаров я слышал, что BEMTREE уже устаревает и не желательно его использовать. Возможно я слышал это не от Ваших специалистов, а от какого-то блогера, но суть в том, что это точно у меня отложилось в голове. Есть ли возможность использовать BEMTREE с gulp? Извиняюсь, если уже надоел своими вопросами))
https://events.yandex.ru/lib/talks/1354/
BEMTREE не устаревает, скорее наоборот развивается. Использовать его нужно для построения структуры страницы, а BEMHTML — для генерации разметки (теги, атрибуты, дополнительные классы, оформительские оберточки и т.п.). Возможность использовать его с
gulp
, разумеется, есть. Но для этого прямо сейчас потребуется либо понаписать костылей вgulpfile
, либо добавить в пакет https://github.com/gulp-bem/gulp-bem-xjst метод, похожий наtoHtml
, но про выполнение BEMTREE. Второй вариант, разумеется, предпочтительнее. Будем рады пулл-реквестам ;)Я бы вот такое видео порекомендовал https://www.youtube.com/watch?v=1fo-6vJJdd0
@tadatuta а при сборке через галп нужно с начала построить bemjson на основе BEMTREE а дальше запускать уже обычную сборку, или можно сразу рендирить html файл?