Можливо прийшов час перестати використовувати БЕМ ?

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Років 7 тому, коли я ще тільки починав ( а може і навіть раніше! ); усі стилі були в одному великому файлі, а класам давали будь-які назви без чіткої системи. У великих проєктах це неминуче призводило до конфліктів і переписування стилів. Щоб розв’язати цю проблему, хтось там придумав методологію BEM, яка чітко регламентувала іменування класів та структуру CSS.

Як взагалі це працює BEM?

  1. Блок (Block) — основна незалежна частина інтерфейсу, наприклад, кнопка (button) або меню (menu).
  2. Елемент (Element) — складова блоку, яка не може існувати окремо від нього, наприклад, іконка чи текст усередині кнопки. Їх пишуть у форматі block__element.
  3. Модифікатор (Modifier) — варіація блоку або елемента. Зазвичай використовується, щоб змінити стиль чи стан, наприклад колір кнопки. У записі має вигляд block--modifier

Приклад

<div class="button button--primary">
  <span class="button__icon">+</span>
  <span class="button__text">Додати</span>
</div>
  • button — це блок
  • button__icon, button__text — елементи
  • button—primary — модифікатор для стилю кнопки

BEM швидко набув популярності, тому що допомагав організувати CSS у масштабних проєктах. Але в міру зростання проєктів, методологія виявила кілька незручностей:

  1. Довгі та складні імена класів. Якщо є багато елементів або модифікаторів, назви можуть ставати довжелезними, що ускладнює читання коду.
  2. Складність у рефакторингу. Зміни в дизайні означають зміну безлічі класів у HTML, що доволі виснажливо.
  3. Глобальний простір імен. Хоча BEM іменує класи структуровано, зрештою все одно всі стилі зберігаються глобально, і можливі неочікувані конфлікти, якщо назви збігаються.
  4. Все вручну. Точне дотримання BEM вимагає уважності від кожного розробника в команді. Будь-яка дрібна помилка в іменуванні може викликати плутанину.

Чому сьогодні можна задуматись на тим щоб відмовитись від BEM ?

Я побачив нещодавно проект на Vue де якраз використовують BEM, і в мене одразу в голові виникло, а навіщо, якщо сучасні фреймворки (React, Vue, Svelte, Angular) орієнтовані на компонентний підхід. У них:

  • в React — CSS Modules чи Styled Components, автоматично створюють унікальні назви класів для компонентів.
  • Vue — в компоненті можна визначити стилі в <style scoped>, і вони діятимуть лише в межах цього компонента.
  • у Svelte — усі стилі в компоненті належать тільки цьому компоненту; унікальні класи додаються на етапі компіляції.
  • Angular — технологія ViewEncapsulation ізолює стилі кожного компонента від решти додатка.

Завдяки цим рішенням автоматичний неймспейсинг став звичною справою, і немає потреби керувати класами вручну, як це робить BEM. У результаті ми отримуємо код, який простіше підтримувати, а ризик конфліктів зводиться до мінімуму.

У підсумку виходить таке:

  • BEM свого часу дуже допоміг впорядкувати CSS, але зараз на зміну йому прийшли фреймворки та інструменти, що дають автоматичне групування й захист стилів.
  • Якщо ви тільки вчитеся верстати, корисно знати, що таке BEM, адже це чудовий спосіб організувати код.
  • В сучасних умовах компонентний підхід виконує роботу BEM автоматично, тому в багатьох проєктах від нього поступово відмовляються.
👍ПодобаєтьсяСподобалось11
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Здається років 7 тому я вперше зіткнувся з vue, якому вже 10 років. Там стилі аж ніяк не в одному файлі. Але 7 років тому багато українських конторок, що робили лендінги та сайти візитівки якраз таки й використовували підходи з reset.css, adaptive.css і main.css. На моє здивування в 20 році досі так робили прості лендінги та сайти візитівки, хоча можна ефективно налаштувати собі проєкт із pug/haml/mako і sass/less за допомогою webpack. Зробити собі якийсь бойлерплейт і тягати його всюди, економлячи свій час.

Цікаво, що ви там побачили на проєкті, що BEM до Vue не підходить? Спробуйте зробити на Vue компонент із використанням Pug, SASS, BEM і nesting, може подивитесь на BEM під іншим кутом.

А по темі статті, те що ви описали — лише один пункт із багатьох, які вирішує BEM або інший naming convention.

Оце нормально накинули :)

Давайте спробуємо зайти здаля. Коли БЕМ почався, то ніяких інструментів для оптимізації фронтенду (тоді такого слова ще не було, лол, воно з’явилось років тільки через 5 після появи БЕМу) на той момент не було від слова взагалі. SASS і той тільки з’явиться через пару років.

Відверто кажучи, експертизи в розробці дійсно масштабних проектів (аля янкедс) на той момент в нашому сегменті інтернету було дуже мало, ми елементарно вчились на своїх помилках в режимі реального часу, і виявилось, що та концепція, яку несе за собою БЕМ (а саме АНБ, абсолютно незалежні блоки), — це дійсно саме той правильний механізм, якщо хочете, міра ентропії. Бо багато в чому саме звідти і пішов згаданий в статті компонентний підхід.

Тут в коментах вже зачіпляли проблематику складності всього зоопарку інструментів, що пропонував БЕМ, бо в них стільки всього там було, що самі яндексоїди на конфах плутали деякі речі. Але в тому і суть, що весь стек (взяти хоча б BEM Tools або i-bem.js) за межами яндекса юзали всього декілька великих компаній, і мені пригадуються тільки компанії з рашки, в України не пам’ятаю жодної, хоча тут може хтось виправить. В маси пішов лише сам підхід, якраз та сама концепція, яка, нажаль, дуже багатьма (я би сказав, абсолютною більшістю) сприймалася повністю або частково невірно. І це, власне, я бачу в тезі обговорення в статті.

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

Спосіб розділення сутностей на блоки та елементи? Він умовний, настільки умовний, що при верстці якогось проекту на 10-15 сторінок вже можуть відбуватися конфлікти в розумінні саме цієї границі. І це нормально. Це привід зробити крок назад, передивитись, як і чому це було зроблено раніше саме так, і усвідомити, чи ця границя ок, чи варто її десь відсунути. Це привід зробити крок назад і передивитися та проаналізувати свій код, щоби переконатися, що все під контролем. І хоча комусь може здатися, що типу «та це всього лиш сраний html», це є така ж гармонія в написанні та компоновці коду, як будь де.

Спосіб форматування коду, розділення частини блоку та елементу? Та це така сама рекомендація, ви можете робити це як вам завгодно, головне донести необхідність цього своїй команді та всім дотримуватись цього в однаковий спосіб. Бо це працює лиш тоді, коли це роблять всі. Недарма вестернерам зайшов спосіб Гаррі Робертса (el—mod на відміну від канонічного el__mod). Нагадаю, лінтери з’явились десь лиш років через 8-10 після БЕМ.

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

Так, час змінився, вже нічого не залишилось від того, що було років 15-20 тому, з’явились нові стандарти, підходи, технології, і частина потреб (а може і всі) закриті новими інструментами в першу чергу з точки зору якості. Але питання не в тому, що вам раніше доводилося писати можливо більш складний та запутаніший код в угоду якомусь там іструментарію, або ще чомусь. Ви завжди пишете код в першу чергу для себе, для того, щоб коли ви через місяць, два, півроку знову сядете за проект, вашою першою думкою не було вийти з вікна після перегляду коду, а ви мали би змогу в ньому розібратись одразу на нормальному рівні.

Для верстки в кінці нульових та надалі цим інструментом був БЕМ.

Це самий довгий коментар в моєму житті )))
Але, було дуже цікаво почитати вашу думку!)

Никогда bem не использовал, как пришел SCSS (и куча других) + минификатор названий классов, вся эта технология наименования вымерла. На нормальном проде там вообще вместо названий классов все минифицировано

Согласен, и если используем фреймворки по типу React/Vue разбиваем все на компоненты и в компонентах пишем кастомные классы, и жизнь проще:)

Після того як почав юзати *.module.css (точніше *.module.scss), то не юзав вже БЕМ роки 2. Але якщо є кейси, коли може бути ок, то чому б і ні

Років 7 назад був 2017й рік і БЕМ(який придумали в Яндексі на початку 2010х) і smacss дуже активно використовувались в зв’язці з scss, або less, з grunt, або gulp, або webpack і купую різної фігні для мініфікації файлів і т.д. а ще були такі фреймворки як bootsrap і foundation які широко використовувалися... Не знаю де ви працювали в цей час, але все в одному файлі писали хіба в не дуже просунутих вебстудіях

На 100% впевнений що автор почав своє життя з умовного Реакту, і окрім js-фреймворків нічого в житті ще не бачив :)

Коли я бачу framework-agnostic бібліотеки, котрі надають свій css-файл окремо, і там всередині класи аля .h1-abracadabra (хеш для любителів ізолювання) — я тепер буду згадувати автора топіка.

Тут впевненість вас підвела!

Є й зараз проекти, де все пишуть умовно в одному файлі.
Те, що ви не стикаєтесь із такими проектами, не означає, що їх не існує, на жаль.
На основній роботі і я з таким не стикаюсь, але з цим стикаюсь на проектах з якими працюю інколи на фрілансі

Оце маю бажання трохи подушнити тут, але не маю вільного часу наразі :(
Єдине, що не можу не запитати, це щодо глобальної ідеї статті. Висновок «час перестати використовувати БЕМ» бо «В сучасних умовах компонентний підхід виконує роботу BEM автоматично» не дає відповіді, що пропонується на виході, бо методологія не дорівнює компонентному підходу. Чи ви пропонуєте робити CSS-анархію на рівні компонентів, не дотримучись жодної методології, змішуючи стилі, що відповідають за різні рівні абстракції, бо автоматичні тулзі це якось порішають самі? Чи пропонується якась інша методологія типу SMACSS, OOCSS, Atomic , rscss чи щось кастомне? А що робити, коли на проекті не використовується JS фреймворк?

Це не душніння з вашої сторони, це адекватні питання. Відчуття що автор просто відчув себе дартаньяном, хоча навіть в топіку не розібрався.

Хммм
До мене прийшов замовник з тим, щоб я зробив мінорні правки на його проекті на Vue, і там побачив, що для написання стилів використовують БЕМ, хоча, на мою думку, це зайве. Тому ось так і народився пост.
Взагалі посил в тому що БЕМ в фреймворках і бібліотеках тіпа реакт — це зайве.

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

QA automation вас будут сильно ругать за отказ от БЕМ

Ви чекали відповіді від мене, і ось вона.

Довгі та складні імена класів. Якщо є багато елементів або модифікаторів, назви можуть ставати довжелезними, що ускладнює читання коду.

В BEM немає ніякіх довжелезних імен класів.
Якщо ви пишете діч накштакл `wrapper-container-block__element-subelement-item` - то «астанавитесь», це не BEM і ніколи їм не було.

Складність у рефакторингу. Зміни в дизайні означають зміну безлічі класів у HTML, що доволі виснажливо.

лол, што?
Ще на початку нульових був сайт ZenGarden де люди міняли дизайн повністю не змінюючи HTML. Невже це знання «древніх» втрачено для нас? Звісно ні. Якщо це вміли робити без BEM (з яким це робити значно простіше, так як є класи на усі елементи), то звісно з ним це взагалі не проблема.
Тут постає питання «які саме проблеми автор не може вирішити і які варіанти пропонує».

Глобальний простір імен. Хоча BEM іменує класи структуровано, зрештою все одно всі стилі зберігаються глобально, і можливі неочікувані конфлікти, якщо назви збігаються.

BEM це не про ізоляцію стилей, а про декомпозицію. Для ізоляції стилей є безліч рішень навіть у натівному css.

Все вручну. Точне дотримання BEM вимагає уважності від кожного розробника в команді. Будь-яка дрібна помилка в іменуванні може викликати плутанину.

Років 10+ як існують автоматичні тулзи.
Але дивно взагалі бачити пойт про «вручну». Код ми поки ще пишемо вручну. Але ці усі речі давно мають тулзи для автоматизації.

в React — CSS Modules чи Styled Components, автоматично створюють унікальні назви класів для компонентів.

Щє раз — BEM — це про декомпозицію, а не про ізоляцію стилей.

Vue — в компоненті можна визначити стилі в , і вони діятимуть лише в межах цього компонента.

Для цього не потрібно Vue, це працює натівно в css.

у Svelte — усі стилі в компоненті належать тільки цьому компоненту; унікальні класи додаються на етапі компіляції.
Angular — технологія ViewEncapsulation ізолює стилі кожного компонента від решти додатка.

А як ви будете писати стилі у цих компонентах? Там також треба включати мізки та писати логічні назви які ми робимо на основі декомпозиції. Як ви будете іх називати? Вам потрібна методологія.

Завдяки цим рішенням автоматичний неймспейсинг став звичною справою...

неймспейсінг існує натівно у css вже давно.

У підсумку виходить таке

що автор плутає ізоляцію стилей та декомпозицію.

Хех, ні, не чекав відповіді від вас)))

В BEM немає ніякіх довжелезних імен класів.
Якщо ви пишете діч накштакл `wrapper-container-block__element-subelement-item` - то «астанавитесь», це не BEM і ніколи їм не було.

Цікаво як на вашу думку створювати класи для глибоко вкладенних єлементів за допомогою БЕМ, як ви це робите?

Ви не повірите — декомпозиція! Якщо ви відчуваєте, що ваш компонент стає занадто складним, то саме час розбити його на менші.

як на вашу думку створювати класи для глибоко вкладенних єлементів за допомогою БЕМ, як ви це робите?

youtu.be/hTmxbJF2Tts

Подушнив так подушнив :)

> BEM це не про ізоляцію стилей, а про декомпозицію. Для ізоляції стилей є безліч рішень навіть у натівному css.

А можна детальніше про це? Яка саме це безліч рішень в чистому css є для ізоляції стилей?

Я хіба що shadow dom знаю..

Власне, десь років 10 тому як драфт заводили <style scoped>, але від нього відмовилися якраз на користь Web Components, тож вони і є наразі єдиним нормальним способом ізолювати стилі.

Нуу, не веб-компонентами єдиними. Тим більше це не стільки про стилі, скільки про глобальний підхід. Якщо ж говоримо за CSS, то як мінімум css @layers — один з нативних варіантів менеджити скоуп стилів. Це не класична ізоляція, але штука корисна і дає потужний інструмент розрулювати стилізацію на рівні компонентів та лейаутів. Ще один варіант ізоляції (який я останні роки практикую) — менеджмент стилів через CSS custom properties, коли при консистентній компонентній структурі html в селектори передаються тільки динамічні values. Також, SASS/ SCSS після переходу на dart почали міграцію в сторону більш грамотної та більш ізольованої організації sass-компонентів, забанивши @import на користь @use та @forward

Яка саме це безліч рішень в чистому css є для ізоляції стилей?

native CSS:
1. CSS containment
2. CSS scope
3. CSS cascade layers
3. all:initial
4. Inline styles (Tailwind та інші atomic-рішення)
5. shadow dom
6. високо-спецефічні селектори (копіювання dom)
7. BEM в реалізації АНБ

SASS:
8. sass namespace

Angular:
9. Custom Elements

Tools:
10. CSS Modules

Насправді нічого з цього списку окрім shadow dom не є нейтівним механізмом ізоляції в css.

Модулі є механізмом ізоляції але вони не нейтівні.

Може ви якось не так як я розумієте що таке ізоляція?

Модулі є механізмом ізоляції але вони не нейтівні.

Якщо у вас є бажання спору заради спору, то:
1. Базово ізоляції не існує взагалі тк є каскад
2. CSS Modules не дають ізоляції так як дивись вище (каскад).

Був би час та натхнення, можна ізі спростувати що завгодно.

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

Ізоляція може існувати у двох напрямках — окремого модуля від глобального скоупа і навпаки — глобального скоупа від впливу окремих модулів.

Ізоляція може існувати у двох напрямках — окремого модуля від глобального скоупа і навпаки — глобального скоупа від впливу окремих модулів.

Ну і чим наведені мною варіанти не покривають це?
Бо «із коробки» справжня «всамделишная» ізоляція це тількі iframe :)

> неймспейсінг існує натівно у css вже давно.

А може поділитесь посиланням на спеку? Я щось спробував знайти, але там про неймспейси у xml сенсі мова йде, тобто це не про ізоляцію.

А може поділитесь посиланням на спеку?

www.w3.org/TR/css-cascade-5

Яким чином це пов’язано з ізоляцією стилей?

Закопав Бем одразу як на vue почав працювати

Закопав одразу як про нього почув

Відмовився від бем ще коли це набирало популярність по причині що це був просто маніфест який не надавав реальних інструментів, а ще не забезпечував ізольованість модулів

не надавав реальних інструментів
а ще не забезпечував ізольованість модулів

А могли б просто розібратись як то працює, і не розраховувати на ізольованість :) БЕМ якраз про можливіть не ізолювати, а мати глобальний доступ через адекватну декомпозицію.

то б я вам рекомендував би розібратись в питанні, а мені ця шляпа не потрібна

А що мені розбиратись, не я його скіпнув бо не зрозумів плюсів використання :) Зараз інші часи, він і справді рідко потрібен в поточних реаліях, але в конкретних ситуаціях кращих альтернатив я ще не бачив.

окей, давайте розберем мою першу тезу
які інструменти надавав бем в 2016-17 роках, +/- рік ? Мова не про маніфест

Ну давайте спочатку розберемось що ви під «інструмент» розумієте. Бо у БЕМа був і інструмент, котрий вони в Яндексі і юзали, котрий робив компіляцію і всяке таке. Але там прям дроч була, то я згоден) А маніфест (ідея, правила використання) для мене вже є гарним інструментом — бо однакові правила для вирішування проблем сильно економлять час як при розробці, так і при ревью, так і при подальшому сапорту проекту.
Я так розумію, я можу бути і не правий, вам хотілось на той момент мати інструмент для автоматичної ізоляції стилів. Так — це взагалі не про БЕМ.

я вже туди не полізу, але якраз то бемовці і заявляли про ізоляцію модулів чи щось ще, а на рахунок компілятора, то я вже ці казки про вундрвафлю чув))

Ну те що там вундервафля в бем-і була то я не сперечаюсь, тому її майже ніхто і не юзав, окрім любителів садомазо :) Але саме правила найменування і декомпозиції, коли на той момент інших норм правил не було — в цьому і була цінність

Ви пропонували мені розібратись в питанні, але я бачу що у вас якесь недорозуміння. В ті часи коли бем порпонував маніфест, були вже дорослі css фреймворки котрі вирішували ті ж питання краще, деякі навіть зараз популярні

css-фреймворки то типу бутстрапу? От якраз від нього я більше ригати хотів, і завжди писав стилі руками — це було тупо швидше в моєму випадку :)
Але досвід у всіх різний. Під «розібратись в питанні» я мав на увазі розібратись що пропонував бем. Він ніколи css-фреймворком і не був.

я не казав що бем це фреймворк, я сказав що були фреймоврк виключно щоб підмітити що були потужнійші засоби для вирішиня подібних задач пор котрі заявляв маніфест бему

Цікавий хід думок. БІльшість з описаних технік існувала і 7 років тому... Колись на одній конфі мій мозок відмовлявся сприймати atomic css, а зараз же tailwind чомусь дуже популярний, судячи з вакансій. Я, чесно кажучи, давно не верстав, але думаю як і раніше в БЕМ технології є своя ніша і ще буде довго.

100% що буде довго. Бо як не крути, комусь БЕМ зручний. Просто не треба «пхати» всюди його, а тільки там де реально він вирішить біль.

Можливо прийшов час перестати використовувати БЕМ ?
Просто не треба «пхати» всюди його, а тільки там де реально він вирішить біль.

Щось з назвою статті ваші слова дуже сильно різняться.

Як я зараз використовую BEM:

Якщо ловлю себе на думці використати BEM в неймінгу класів — то це означає, що час цей код виносити в окремий компонент.

Ось і все використання BEM на сьогодні.

Як же круто жити у світі де CSS пишеться тільки в компонентах фреймворків -_-

А як ви вирішуєте проблему стану та модифікаторів компонентів? Наприклад, у вас є карточка товару яка може бути акційною та звичайною, а також може бути розгорнутою та згорнутою. Різні naming convention по різному відповідають на це питання, тож я можу звернутись до умовного BEM і одразу мати підказку на те, як мені вирішувати поставлену задачу. А розробник, який прийде після мене швидше зрозуміє що я тут писав надцять років тому.

Не стикався взагалі за декілька років роботи . Зато на деяких вайтішних курсах досі вчать.

Тому що його пушив виключно яндекс та його послідовники, ніде більше до такого маразму не додумалися :))

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

От тіки всюди де не було БЕМ років 5-10 тому, були або scoped-css з всратими назвами й жопоболью в вебпаку, або styled components з компіляцією стилів в сраному рантаймі, або лаконічний БЕМ :) Якщо у вас не було перших двох, і не було БЕМу — от тоді вже починався маразм

А SMACSS от Jonathan Snook, це що по-вашему? Це і є той самий BEM.

І це стало базой в усьому світі, звідти потім ITCSS от Harry Roberts виріс (з синтаксисом від Nicolas Gallagher) і так далі.

Я просто от побачив його на проекті на Vue, і він ну там взагалі не потрібен був.

Власне, так і зʼявилась ця стаття ))

Підписатись на коментарі