Мій колега наполегливо підштовхує метод BEM (Block Element Modifier) для CSS в проект, який він керує, і я просто не можу зрозуміти, що робить це краще, ніж МЕНШИЙ CSS, про який ми писали роками.
BEM - це методологія CSS. До інших належать OOCSS та SMACSS. Ці методології використовуються для запису модульного, розширюваного, багаторазового коду, який добре працює в масштабі.
LESS - препроцесор CSS. До інших належать Sass та Stylus. Ці препроцесори використовуються для перетворення відповідних джерел у розширений CSS.
BEM і менше не є порівнянними як "кращі" один за одного, вони є інструментами, які служать різним цілям. Ви б не сказали, що викрутка краще, ніж молоток, за винятком випадків, коли ви розглядаєте корисність для вирішення конкретної проблеми.
Він стверджує, що "більш високі показники" ...
Ефективність потрібно вимірювати між класичним стилем CSS:
.widget .header
і BEM стиль:
.widget__header
але в цілому ефективність роботи селектора CSS не є вузьким місцем і його не потрібно оптимізувати.
BEM "продуктивність" зазвичай стосується коду написання продуктивності розробника. Якщо методологія BEM використовується послідовно і правильно, групам розробників легко одночасно створити окремі модулі без зіткнень стилів.
Він стверджує, що "читабельність" та "повторне використання" ...
Я не знаю, що я сказав би новому розробнику, що BEM читабельніше. Я можу сказати, що він містить деякі чітко визначені вказівки щодо сенсу та структури занять.
Бачити такий клас
.foo--bar__baz
Мені каже, що є foo
блок, який знаходиться в bar
стані, і містить baz
елемент.
Я б абсолютно сказав, що BEM є більш багаторазовим використання, ніж класична модель.
Якщо два розробники створюють блоки ( foo
і bar
), і обидва ці блоки мають заголовки, вони можуть безпечно використовувати свої блоки в різних контекстах, не хвилюючись про зіткнення імен.
Це тому, що в класичному контексті було б .foo .heading
і .bar .heading
конфлікт, і запровадив конфлікт специфіки, який потрібно було б вирішити, можливо, у кожному конкретному випадку.
На сайті BEM класи були б .foo__heading
і .bar__heading
ніколи не конфліктували б.
Він стверджує, що "вкладений CSS є анти-зразком". Що навіть означає "антидіаграма" і чому вкладений CSS поганий?
"Антидіаграма" - це схема кодування, яку легше вивчити та використовувати недосвідченим розробникам, ніж більш підходяща альтернатива.
Що стосується того, чому вкладений CSS поганий: вкладення підвищує специфіку селектора. Чим вище специфіка, тим більше зусиль потрібно, щоб перекрити. Недосвідчені розробники часто переживають, що їх CSS може вплинути на кілька сторінок, тому вони використовують селектори, наприклад:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
Коли досвідчений розробник побоюється, що їх CSS може не впливати на кілька сторінок, тому вони використовують селектори, як-от:
.more
Він стверджує, що "всі рухаються до використання BEM, тому ми також повинні". ...
Це помилка прокладки , тому ігноруйте це як поганий аргумент. Не потрапляйте в пастку до помилкової помилки , тому що поганий аргумент на підтримку BEM - це не привід вважати, що BEM не може бути хорошим.
Невже хтось може, будь ласка, пояснити детально, що робить BEM кращим за МЕНШЕ?
Я висвітлював це раніше, BEM & МЕНШЕ не порівнянні. Яблука та апельсини тощо.
Мій колега повністю не переконує мене, але я не знаю, чи є у мене вибір, як слідкувати.
Я рекомендую ознайомитись з OOCSS, SMACSS та BEM та зважити плюси та мінуси кожної методології ... як команду . Я використовую BEM, тому що мені подобається його суворість у форматі, і не заперечую проти некрасивих селекторів, але я не можу сказати вам, що підходить для вас або для вашої команди. Не дозволяйте одному відвертому особистості вести шоу. Якщо вам не подобається BEM, пам’ятайте, що існують інші альтернативи, які можуть полегшити підтримку вашої команди. Можливо, вам доведеться відстоювати свою позицію разом із колегою, але довгостроково це, ймовірно, позитивно вплине на результат ваших проектів.
Я дійсно швидше зміг би оцінити BEM, ніж бурхливо прийняти його.
Я написав відповідь на StackOverflow, яка описує, як працює BEM . Важливо розуміти, що ваші ідеальні селектори повинні мати специфіку, 0-0-1-0
щоб їх було легко перекрити і розширити.
Вибір використання BEM не означає, що вам потрібно відмовлятися від МЕНШЕ! Ви все ще можете використовувати змінні, ви все ще можете використовувати @imports, і ви, безумовно, можете продовжувати використовувати гніздування. Різниця полягає в тому, що ви хочете, щоб виведений результат став єдиним класом, а не ланцюгом нащадків.
Де ти, можливо, був
.widget {
.heading {
...
}
}
З BEM ви можете використовувати:
.widget {
&__heading {
...
}
}
Крім того, оскільки BEM обертається навколо окремих блоків, ви можете легко розділити код на окремі файли. widget.less
містив би стилі для .widget
блоку, тоді як component.less
містив би стилі для .component
блоку. Це значно полегшує пошук джерела для будь-якого конкретного класу, хоча ви, можливо, все ж бажаєте використовувати вихідні карти.