Що робить BEM кращим, ніж використання нестабільної мови аркуша стилю, як МЕНШЕ?


27

Мій колега наполегливо підштовхує метод BEM ( Block Element Modifier ) для CSS в проект, який він керує, і я просто не можу зрозуміти, що робить це краще, ніж МЕНШИЙ CSS, про який ми писали роками.

Він стверджує, що "більш висока продуктивність", але я не уявляю, як продуктивність може мати значення для типів веб-додатків, про які ми пишемо в цьому магазині кодів. Тут ми не робимо Twitter чи Facebook. Я був би дуже здивований, якщо наші додатки з найвищим рівнем використання мають більше 10000 звернень на місяць , а більшість - менше 1000.

Він стверджує, що "читабельність" та "повторне використання", але , на мою думку , ЛЕСС це вже робить набагато краще . І я відчуваю, що BEM так погано обробляє розмітку з десятками зайвих символів, присвячених цим іменам наддовгих класів, що це кардинально знижує читабельність.

Він стверджує, що "вкладений CSS є анти-зразком". Що навіть означає "антидіаграма" і чому вкладений CSS поганий?

Він стверджує, що "всі рухаються до використання BEM, тому ми також повинні". Мій лічильник: "Якби всі стрибали з мосту, ви б пішли за ними?" Але він до цього часу абсолютно неприхильний.

Невже хтось може, будь ласка, пояснити детально, що робить BEM кращим за МЕНШЕ? Мій колега повністю не переконує мене, але я не знаю, чи є у мене вибір, як слідкувати. Я дійсно швидше зміг би оцінити BEM, ніж бурхливо прийняти його.


1
BEM і Менше служать різним цілям. Я використовую як BEM, так і менше.
zzzzBov

4
Зауважте, що BEM не в першу чергу стосується CSS - це виявлення повторюваних інкапсульованих шаблонів у вашому дизайні та збирання всього необхідного для цього блоку (поведінка, шаблон, стилі) в одному центральному місці. Навіть якщо обмежений лише CSS, BEM все ще є прекрасним способом організації своїх стилів та надійного запобігання зіткненням імен. Це все абсолютно незалежно від препроцесорів, таких як LESS або SASS, які є просто більш продуктивними мовами стилізації, ніж звичайний CSS, оскільки вони пропонують макроси та змінні, скорочення та всілякі приємні функції. Менше = виграш, BEM = виграй, але МЕНШЕ × BEM = win²!
amon

Відповіді:


29

Мій колега наполегливо підштовхує метод 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блоку. Це значно полегшує пошук джерела для будь-якого конкретного класу, хоча ви, можливо, все ж бажаєте використовувати вихідні карти.


4
@CoreDumpError, проблема полягає в тому, коли ви починаєте вкладати модулі в модулі. "кожен розробник може просто вкласти код свого конкретного віджета на один рівень глибше" - не зовсім коректно, кожен розробник повинен вкладати код свого конкретного віджета глибше і глибше, інакше каскад зіткнень називає способами, які, як правило, ненавмисні. Єдиний спосіб уникнути зіткнення імен - це якийсь простір імен, і BEM пропонує простий спосіб послідовно класів простору імен.
zzzzBov

3
@CoreDumpError, Розглянемо цей приклад . Автору, що пише без BEM, потрібно докласти додаткових зусиль, щоб перевірити кожну комбінацію кожного модуля, яка може бути додана в їх модуль. Автор, який використовує BEM, не робить.
zzzzBov

1
@CoreDumpError, це, безумовно, може бути. Мені здається, що BEM легко навчати нових розробників, і це полегшує огляд коду, але SMACSS та OOCSS є хорошими альтернативами. Я настійно рекомендую розглянути ці варіанти як альтернативу. Я скажу, що використовую BEM для власного розвитку, щоб не конфліктувати з собою, особливо з майбутнім мною, який дурний і забуває речі.
zzzzBov

1
Я вважаю, що BEM є чудовим у будь-якому проекті, що передбачає будь-яку складність, це css. У вас може бути веб-сайт, який працює на WordPress і використовує лише Javascript для запуску речей прокрутки, але він все ще такий же складний, як веб-додаток у css. Важливо не потрапляти в пастку мислення "мій сайт не складний", просто тому, що більшість його речей є виключно у візуальній царині (як це робиться у багатьох маркетингових сайтах)
Toni Leigh

1
@CoreDumpError Більшість моїх попередніх проектів були сольними починаннями, і я прийшов на більшу частину BEM на власному ре: специфіці та унікальних селекторах. Підтримка бази даних - це величезна проблема, яка стає надзвичайно зрозумілою з BEM. Код - це технічне обслуговування. Будувати речі легко. Зберігати ідеальні візерунки важко, особливо через кілька місяців від кодової бази. Проблеми специфіки складаються з часом. Переваги поширюються на будь-яку команду розмірів IMO!
Юджі Томіта

8

Редагувати 2017 рік

Якщо ви читаєте це в 2017 році, тіньові полімери DOM та тіні DOM, а також компоненти вирішують усі ці проблеми, зберігаючи код невеликим, щільним та модульним. Не використовуйте BEM у проекті IMO, що займається екологічним полем.

Замість BEM у нас є такі інструменти, як ViewEncapsulation, Polymer, StyledJSX, SASS модулі, Styled Components тощо.

Подумайте про використання BEM, якщо у вас немає архітектури, орієнтованої на компоненти; якщо у вас є застарілий код для підтримки; або якщо ви просто мертві, готові робити все вручну без інструментів.


BEM робить вашу укладку незалежною від вашого гніздування DOM. Це робиться, надаючи кожному елементу, який, можливо, захочеш атрибутувати клас атрибутів великого походження, який, ймовірно, буде унікальним на вашій сторінці. Більшість стилів виконується на заняттях.

Це робить ваш код більш модульним, оскільки вкладення вже не враховується за рахунок великої кількості багатослівних.

Без BEM

Без BEM, ми можемо написати це:

<div class="widget">
  <a>Hello!</a>
  <ul>...</ul>
</div>

Стандартна укладка CSS може виглядати приблизно так:

.widget {
  border: 1px solid red;
}

.widget a {
  color: green;
}

Те саме було б із SASS:

.widget {
  border: 1px solid red;
  a {
    color: green;
  }
}

Якщо ви невелика команда, де кожен може кодувати CSS на високий рівень, а проект досить малий, щоб ви могли підтримувати його повне усвідомлення, це хороше і розумне рішення.

З BEM

Однак якщо ваш код стає більшим і у вас є велика команда зі змішаними можливостями, це може бути не таким простим рішенням. Що робити, якщо ви хочете, наприклад, зелених якорів в іншому віджеті. Тому ми робимо якір модульним і усуваємо селектори нащадків.

Тепер наш HTML набагато більш багатослівний:

<div class="widget">
  <a class="widget__anchor">Hello!</a>
  <ul class="widget__ul">...</ul>
</div>

У нашому CSS немає селекторів:

.widget {
  border: 1px solid red;
}

.widget__anchor {
  color: green;
}

Але ми можемо це зробити:

<div class="widget__2">
  <a class="widget__anchor">Hello!</a>
</div>

Віджет__anchor є модульним. Навряд чи інше визначення .widget__anchor буде існувати на сторінці.

компроміси:

BEM:

  • Надає вам більше модульного коду. Ви можете взяти будь-який шматок ізольовано.
  • Дозволяє комусь писати CSS. Вам не потрібно знати про майстерне стилювання та спеціальні зміни. У великій команді це приємно.
  • Видаляє будь-які проблеми з специфікою.
  • Значно більш багатослівний.

Стандартний CSS (який спирається на використання селекторів нащадків):

  • Значить, ваш стиль залежить від контексту.
  • Вимагає усвідомлення каскаду. Код одного разу може вплинути на код в іншому місці. У невеликій команді це гарна річ.
  • Може постраждати від питань специфіки, які новачеві-розробнику може бути важко налагодити.
  • Значно жорсткіше.

Третій спосіб - реальні компоненти.

Якщо ви використовуєте щось на кшталт React, Angular 2 або будь-який інший сучасний фреймворк, у вас є інше рішення. Ви можете використовувати інструменти для забезпечення інкапсуляції.

У цьому прикладі використовуються React та StyledJSX, але є багато варіантів. Ось віджет:

const Widget = () => 
  <div>
    <a>Hello</a>
  </div>
  <style jsx>
    div {border:red }
    a { background: pink }
  </style>

Тоді ви скористаєтесь новим віджетом таким чином:

<Widget />

Усі стилі, оголошені у віджеті, будуть інкапсульовані та не застосовуватимуться до елементів поза компонентом. Ми вільні просто стиль divі aбезпосередньо , не піклуючись про випадкову стилізації що - небудь ще на цій сторінці.


1
Плюси і мінуси, не віддаючи перевагу жодній стороні, мені це подобається.
Адріана Мойса

Я думаю, що є щось дійсно сумно в тому, щоб сказати "пишіть свій код так, щоб люди, які не розуміють каскад, могли це зрозуміти". Це як сказати: "Я пишу свій код без будь-яких масивів, тому що один з молодших членів команди не розуміє, як працюють масиви". Особисто я віддаю перевагу більш лаконічному методу, який надає перевагу природній каскадній стороні каскадних таблиць стилів.
Метт Флетчер

@MattFletcher - Я думаю, що це питання розміру проекту. Каскад за своєю суттю глобальний. Ви встановлюєте значення, потім переосмислюєте та переопрацьовуєте дерево вниз. Якщо у вас є менший проект із повною видимістю, це добре, але при більшому проекті він стає крихким. Люди бояться змінювати речі, тому що зміна вище вгору каскад розбиває випадкові речі в інших місцях. Інкапсуляція компонентів насправді приємна для великих проектів. Все просто працює.
суперлюмінація

2

Жоден підхід не ідеальний. ІМХО, ми повинні отримати найкращі частини кожної з методологій (BEM, SMACSS, OOCSS, DRY). Використовуйте SMACSS для організації структури папок у вашому CSS, спеціально для визначення логічного розбиття всього CSS. DRY для створення бібліотеки утиліт або може бути загальною бібліотекою модифікаторів, яку іноді використовувати разом із класами на основі BEM. OOCSS для компонентів. І BEM для невеликих компонентів або підкомпонентів. Там ви можете розподілити складності та отримати свободу працювати у великій команді.

Будь-який при використанні без розуміння суті цього призведе до поганого.

Хоча BEM є хорошим підходом для більших команд, він має і деякі недоліки. 1.Іноді це призводить до дуже довгих імен у великій структурі HTML. Отриманий великий розмір файлу CSS. 2. Для гніздування htmls, що перевищує 2-3 рівні, стає головним болем визначати імена.

Вирішення конфліктів може бути легко керовано, якщо ми думаємо про структуру компонентів разом з дуже базовим набором базового стилю. Це більше лише дворівневе успадкування. Кожен елемент всередині компонента матиме або глобальне правило стилю, або характерне для цього компонента. Це один із найпростіших варіантів.


Надзвичайно хороший аргумент. Розробники повинні мати можливість подумати про себе та проаналізувати масштаб проблеми. Просто сліпо слідування методологіям все ще призводить до неприємностей. У мене є колеги, які взагалі не розглядають наслідки своїх змін на сторінці і незалежно від того, за якою методологією у нас справи йдуть на південь. Я наполегливо наполягаю на підвищенні рівня обізнаності щодо CSS у колективі. Вкладеного SASS з локальними стилями та глобальними стилями достатньо, щоб проект був чистим.
Адріана Мойса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.