Добрый день, насколько рационально использовать bem для небольших проектов 1-5 страниц верстки. Очень хотелось бы использовать готовую библиотеку блоков но есть несколько нюансов
Например если у блока переопределить css то в скомпилированном css будет несколько блоков например
.input {
font-size:14px;
}
И в переопределенный стиль
.input {
font-size:30px;
}
Или я неправильно что-то понимаю? Нет ли возможности при использовании блока из библиотеку сразу копировать его в папку проекта а не переопределять его поведение?
И возможно ли собрать проект например так:
js/
script.js
css/
style.css
html/
index.html
innerPage.html
И т.д.
Привет. Когда работал в студии, использовал bem stack для всех задач, от одно страничных прототипов до сильно сложный проектов. Когда есть библиотека блоков это сильно ускоряет все процессы.
@voichev а на тему переопределения блоков и финальной сборки что-то можете сказать?
@serhioone, я соглашусь с @voischev. Особенно когда проекты однотипные со своей библиотекой у тебя уже пол-проекта есть. Чтобы было меньше дублирования, в библиотеку стоит помещать общие стили и js. для этого их изначально стоит писать раздельно. Например, когда я писал проект, в
common.blocks
у меня была общая реализация, которую я мог скопировать в другой проект или добавить в библиотеку. а вdesktop.blocks
все было заточено под конкретный проект.@kompolom этого я добиться и хочу, не совсем понимаю как технически это все должно быть реализованно, Например как вы дублировали из проекта в проект
common.blocks
? Просто копировали в директорию? Или через гит? Потом в папкеdesktop.blocks
вы переопределяли стили и js? На сколько адекватный код получается после сборки?@serhioone использовать оправдано для проекта любого размера.
По поводу дублирования стилей отвечу так:
Есть несколько способов, например:
enb make
, а потом раскладывал файлы в нужную структуру.В обоих случаях потребуется написать правильный конфиг для
borschik
, чтобы сохранялись относительные пути. Подробнее об этом см. обсуждение в тредике https://ru.bem.info/forum/277/git
, а еще лучше —bower
, чтобы явно управлять версиями подключаемых блоков.В целом рекомендую в качестве примера смотреть на https://github.com/bem/project-stub/ — там подключаются
bem-core
иbem-components
в bower.json.@serhioone, получается большая часть из
git
- блоки с прошлых проектов. Некоторые, которые "недостойны" библиотеки, руками копирую.А как еще правильней организовать css файлы для адаптива например
Понимаю что вопрос тоже уже поднимался, но дельного ответа так и не нашел
@serhioone
так вполне нормально
@tadatuta извиняюсь за глупые вопросы, но ведь нужно еще где то прописать чтобы из блока собирались все css файлы.
можно использовать deps:
header.deps.js
Недавно в рамках Html Academy устраивали митап по полному стеку. Я пришел к выводу, что:
Вывод: для проектов проще «корпортативного портала» (новости, галерея, форум, переписка пользователей, каталог/магазин) БЭМ дает СИЛЬНЫЙ прирост времени разработки даже при наличии хорошоизменяемой кросспроектной библиотеки компонентов.
Ответ: нет
@nicothin
Правда же, что никто не мешает добавить аналогичные шоткаты для любых структур и создавать их точно так же за 6-10 сек?
Так все-таки разумно или сводит на нет ускорение? ;) Для простых проектов вполне можно писать все в одном файле и никаких дополнительных расходов не будет. А если проект начнет разрастаться, постепенно раскладывать по разным файлам, чтобы его можно было нормально поддерживать.
И снова: это возможность, а не необходимость. Если при разработке удобно разнести конструкции в разные файлы, например, чтобы получить разную разметку для десктопа и телефона или для авторизованного пользователя и анонима, то пожалуйста. А если это кажется лишним, то никто ведь не заставит.
@nicothin Ну незнаю, твое слово против моего. Кто прав? ;)
Если четно кажется все доводы кажутся надуманными. Но ок, не понимаю почему нельзя писать bemjson за 6-10сек, Ведь даже структуры проще чем у html. И прям в коде можно использовать JS для обработки данных.
Далее... Тут 6-10сек там 6-10сек, а если нужно что-то менять в нескольких местах? БЭМ прилагает из коробки возможность сделать компонент/шаблон блока, голый html ничего не предлагает. А если мы начинаем использовать шаблонизаторы, то чем это будет отличаться по скорости от БЭМ стека?
А если тебе нужно на 5 страницах блок поменять, что быстрее — изменить в файле кусок html и его копипастить 5 раз, или просто изменить один файл шаблона? ;)
Ну и вроде как давно понятно всем, что любой компонентный подход в любых инструментах будет сильно быстрее чем верстать html даже с Emmet. (Кстати не использую Emmet уже пару лет, а в css использую Hayaku ибо он не просто набор правил, а более человечен за счет не четкого поиска).
Вот это может оказаться сложновато. Пример: необходимо обернуть несколько блоков в структуру из нескольких других блоков (к примеру, в .row>.col-xs-6>.chto-to-tut-escho). С Эмметом и обычным HTML это очень быстро — шоткат+ввод оборачивающей аббревиатуры. Как и каким образом можно это быстро сделать в bemjson? Есть инструменты? Я, правда, не знаю :) Еще пример: нужно обернуть 2-4 фрагмента разметки (разные,увы, а не повторяющийся блок) в 1-2 одинаковые обёртки. Еще пример: нужно убрать одну или две обёртки блока. Это я все к тому, что шоткаты бывают существенно хитрее простого ввода разметки.
Все верно говорите. Нюанс: это добавляет вероятность ошибки. Если (тем паче — в команде) есть вероятность неоднородности подхода, то обязательно возникнет неоднородность подхода. Следствие — увеличение времязатрат на редактирование.
В моем случае — я, в Вашем — Вы :) Все как обычно :) Я привожу свои аргементы, Вы — свои. Мне интересно что получится в результате.
Потому, что нет (или я о них просто не знаю) инструментов, ускоряющих написание, типа того же Эммета, с которым можно быстро создавать структуры любого размера (все необходимые атрибуты и форматирование возникнут без участия набирающего), быстро оборачивать имеющиеся структуры, убирать обертки, оборачивать каждую из нескольких структур во введенный фрагмент. JS для обработки данных для простого проекта? Ну, не знаю, не знаю...
Скоростью набора разметки, конечно. Пока главный минус для меня лично — скорость работы с разметкой (больше набирать приходится, работа медленнее), а значит, нужен ОЧЕНЬ серьезный профит для выбора фуллстек-БЭМ.
Представьте, что это один фрагмент разметки, он 5 раз инклудится. Никаких проблем, выходит даже чуть-чуть быстрее в плане времени работы автоматики.
Именно. Вопрос только в скорости работы с компонентами и в комфорте (читай — скорости) работы со стилями. Если возможен инклуд фрагментов HTML в разметку, работа комфортнее за счет более быстрого редактирования и написания разметки. Ну и чисто личное: HTML ощутимо нагляднее, особенно в случаях наличия разметки, не являющейся блоками.
Полный стек БЭМ — не серебрянная пуля. Он очень хорош на КРУПНЫХ проектах (дает выигрыш для команды), но на мелких — очевидно избыточен. Есть и другие мелкие минусы, которые я заметил (должен сказать, опыт с полным стеком у меня более чем скромный, в отличие от опыта в верстке):
п.с.: я очень люблю БЭМ как систему именования классов и уважаю фулстек, но использовать его на мелких проектах... нет. Пока, по крайней мере.
Мм... как там было? «Я реализую эту фичу за 5 строк» :)
Понятно, что для полноценной поддержки элементов, модификаторов и всяких сложных кейсов потребуется потратить несколько часов. Но ведь всегда можно и поискать готовое.
Даже если отбросить тот факт, что скорее всего такая необходимость указывает на проблемы архитектуры (абстрактные обертки слабо вписываются в компонентный подход к разработке), не вижу принципиальной разницы между добавлением их в HTML и в BEMJSON.
Вот уж где-где, а тут наличие декларативного шаблонизатора рулит и бибикает ;)
Не очень понял, в каком случае появляется вероятность переделывать готовую работу и почему?
Логично. Либо быстро писать все в одном файле, либо инвестировать в то, чтобы разбить все хорошо на файловой системе и дальше за всем следит автоматическая сборка. БЭМ предоставляет оба варианта, а разработчик выбирает, что ему удобнее. Причем варианты можно комбинировать.
Справедливо. Но. Без шаблонизатора вероятность ошибки увеличивается каждый раз, когда разработчик повторяет один и тот же кусок HTML с помощью emmet-шоткатов или еще как-то. А потом еще раз, когда он понимает, что во всех похожих кусках нужно внести одинаковое изменение и где-то забывает или вносит его чуть иначе, чем в остальных аналогичных конструкциях. Здесь снова побеждают декларативные шаблоны, позволяющие забыть про копипаст. Аналогия:
vs.
Вот фрагмент, который требуется на самых простых проектах
Вот он же на JS:
Даже уже здесь JS-вариант короче. А если потребуется что-то менять, то во втором случае это будет гораздо проще.
Мне кажется, что скорость набора занимает настолько незначительное время по сравнению со временем на обдумывание архитектуры или поиск хитрых багов, что его вообще можно не учитывать.
Чаще всего это один фрагмент, но с разным содержанием. Как в примере с меню:
На самом деле нет. И правда ли это серьезная проблема? Кстати, можно весь JS целиком писать полностью кастомный.
o_0 Вообще он у нас из коробки подключается внизу.
Всегда можно выбрать тот, который больше нравится (например, где меньше скобок ;)) Ну и, вроде, все документировано плюс-минус.
PS: Можно использовать полный стек и продолжать писать HTML руками с помощью
emmet
. См., например, https://github.com/tadatuta/bem-project-stub-heЕдва ли :) В эммете и генераторы (
tag>(tag>tag)*2
)? и текстовые узлы, и фильтры, и уйма всего еще. Не верю, что Вы не видели http://docs.emmet.io/ :)Скорость. С компонентным подходом бывают сложности — да, это не идеальный мир.
Это про стили и разбивку стилизации элементов по файлам.
Вот такими намерениями усеяна дорога в ад поддержки проекта :)
Так он не повторяет. Он написал 1 раз и инклудит разметку туда, куда нужно.
А как, скажем, третьему дать модификатор активности? (несколько менее красиво получится :) )
Увы, нельзя. По крайней мере, в моем случае. У коллег и студентов спрошу, но, думаю, отличия незначительные.
Ну, 120+ Кб, вроде, не?
Хм... Что-то не так в демо-проекте было, значит. Я точно видел подключение в
head
и мы потратили определенное время на перенос его вниз.Ссылку посмотрю, спасибо.
Я ведь заранее написал, что для полноценного конкурента
emmet
(возможно на его основе) несколько часов потратить придется, если по какой-то причине существующие решения не подходят. Кстати, по какой?Все еще не понимаю, почему возможность разбивки на файлы может заставить переделывать что-то готовое.
И как мы только с yandex.ru справляемся? ;)
Я в предыдущем комментарии спрашивал про инклюд, когда внутри одинаковых фрагментов разный контент.
Ага. +1 строка:
Похоже, коллеги и студенты не овладели слепым набором, никогда не сталкиваются с багами браузерного рендеринга и заранее держат в голове готовую архитектуру любого проекта ;)
да-да и не существуют :D
Хмм… Позвольте влезть со своим комментарием в ваш калашный ряд и показать взгляд с позиции джуниора, так сказать) Как раз начал потихоньку копать БЭМ. По поводу скорости. Так как я начинающий, для меня скорость набора играет малую роль, в отличие от процесса мыслительного. Но первый раз взглянув на страницу, размеченную в bemjson, подумал: "Неужели вся эта простыня писалась руками?" Разметив первую страницу, понял, что все совсем не так страшно, а БЭМ-дерево выглядит гораздо нагляднее голого HTML. Создание отдельных файлов – тоже не так страшно, особенно через командную строку. А вот что действительно напрягает (возможно, пока) – необходимость прописывать теги через шаблонизатор. Уверен, что, как и писалось в самом начале обсуждения, наличие своей библиотеки в значительной мере решает все эти проблемы.
Далее, препроцессоры. По сути, мы теряем только вложенность, и то не всегда. Переменные, миксины, экстенды – все это можно смело использовать. Пользуясь случаем, задам вопрос: как можно подключить файлы с переменными и миксинами, чтобы не приходилось их импортировать в файл каждого блока, где они используются?
Скрипты сразу ставятся внизу страницы (юзаю project-stub).
К недостаткам full stack отнесу высокий порог вхождения. Особенно, если требуется тонкая настройка инструмента и правка конфигов - borschik, make.js…
Поэтому мой ответ на вопрос темы такой: full stack на маленьких проектах хорош, если ты уверенно владеешь этим инструментарием, у тебя есть библиотеки и заготовки проектов и/или велика вероятность, что тебе придется поддерживать его и дальше, и он будет расти. С другой стороны, как все это наработать, если не использовать, начиная с маленьких проектов?..
На самом деле можно «хардкодить» их прямо в BEMJSON:
Но это примерно как писать инлайновые стили в разметке — один раз нормально, но когда таких
b1
появится несколько, дешевле окажется вынести в шаблон. Чтобы не напрягало, стоит добавить шоткаты в редактор. Например, чтобы по табу строкаtag
превращалась вblock('').tag()('')
и курсор автоматом прыгал в места подстановки.С помощью DEPS.
Есть такое. Сейчас активно занимаемся документацией, чтобы стало полегче. Кроме того, есть надежда, что постепенно сможем минимизировать количество кастомных инструментов (например, перейти на сборку с помощью
gulp
).@nicothin Скрипт вырос до 80 строк и научился рисовать BEMJSON для конструкций типа
b1>__e1*2>b3_theme_islands+_state_active
, так что я решил запушить его на github и вnpm
:)@tadatuta круто!
очень хотелось бы! особенно — Grunt- или Gulp-сборку и «дружественный верстальщику» демо-проект с минимумом лишнего.
Gulp бы сильно уменьшил порог входа я думаю, пока не понятно когда это чудо произойдет? Потому что пока мне видеться что итоговый проект перед cдачей заказчику все равно нужно через gulp прогонять
Да, читал, но харкодить как раз и не хочется
Двумя руками за такую сборку. По поводу документации и демо - очень полезным оказалось видео Николая Ильченко с Loftblog (https://github.com/tavriaforever/project-stub)
@serhioone
пока конкретных дат нет :(
Как мы только в маленькой компании из двух разработчиков с этим справилась? Причем как на супер маленьких проектах так и на больших? ;)))
Спасибо @Kater-auf-Dach Ты крутой! И все правильно говоришь! Ваще Молодец! Я просто обучил двух ребят и они такими же словами описывали полученный опыт! Не нужно думать — нужно использовать и на маленьких проектах https://github.com/bem/project-stub и все будет хорошо.
Зачем писать голый html? Бррр!