Мой коллега активно продвигает метод BEM ( Block Element Modifier ) для CSS в проекте, который он разрабатывает, и я просто не могу понять, что делает его лучше, чем LESS CSS, который мы писали годами.
Он заявляет о «более высокой производительности», но я не представляю, как производительность может иметь значение для тех веб-приложений, которые мы пишем в этом магазине. Мы не делаем Twitter или Facebook, здесь. Я был бы очень удивлен, если бы наши приложения с наибольшим использованием имели более 10000 посещений в месяц , а большинство из них - менее 1000.
Он утверждает, что «читабельность» и «повторное использование», но МЕНЬШЕ уже делает это намного лучше , по моему мнению. И я чувствую, что БЭМ так плохо справляется с разметкой с помощью десятков дополнительных символов, предназначенных для этих сверхдлинных имен классов, что радикально снижает читабельность.
Он утверждает, что «вложенный CSS - это анти-шаблон». Что означает «анти-модель» даже средний , и почему вложенная CSS плохо?
Он утверждает, что «все движутся к использованию БЭМ, поэтому мы тоже должны». Мой счетчик: «Если бы все прыгали с моста, вы бы пошли?» Но он все еще непреклонен в этом.
Может кто-нибудь объяснить, что делает БЭМ лучше, чем МЕНЬШЕ? Мой коллега совершенно не может убедить меня, но я не знаю, есть ли у меня выбор, кроме как следовать. Я бы скорее оценил БЭМ, чем неохотно принял это.
Ответы:
БЭМ - это методология CSS. Другие включают OOCSS и SMACSS. Эти методологии используются для написания модульного, расширяемого, многократно используемого кода, который хорошо работает в масштабе.
LESS - это препроцессор CSS. Другие включают Sass и Stylus. Эти препроцессоры используются для преобразования их соответствующих источников в расширенный CSS.
БЭМ и МЕНЬШЕ не сопоставимы, поскольку они «лучше» друг друга, они являются инструментами, которые служат различным целям. Вы бы не сказали, что отвертка лучше, чем молоток, за исключением случаев, когда вы рассматриваете утилиту для решения конкретной проблемы.
Производительность должна измеряться между классическим стилем CSS:
и стиль БЭМ:
но, вообще говоря, производительность CSS-селектора не является узким местом и не нуждается в оптимизации.
БЭМ "производительность" обычно относится к написанию кода производительности разработчика. Если методология БЭМ используется последовательно и правильно, группам разработчиков легко одновременно создавать отдельные модули без стилевых коллизий.
Я не знаю, что скажу новому разработчику, что БЭМ более читабелен. Я могу сказать, что он предоставляет некоторые четко определенные рекомендации относительно значения и структуры классов.
Видя класс как
Сообщает мне, что есть
foo
блок, который находится вbar
состоянии, и содержитbaz
элемент.Я бы сказал, что БЭМ более пригоден для повторного использования, чем классическая модель.
Если два разработчика создают блоки (
foo
иbar
), и оба этих блока имеют заголовки, они могут безопасно повторно использовать свои блоки в разных контекстах, не беспокоясь о конфликте имен.Это потому, что в классическом контексте
.foo .heading
и.bar .heading
будет конфликтовать, и вводить конфликт специфики, который необходимо будет решить, возможно, на индивидуальной основе.На сайте БЭМ классы были бы
.foo__heading
и.bar__heading
, что никогда не будет конфликтовать.«Анти-паттерн» - это паттерн кодирования, который неопытным разработчикам легче изучить и использовать, чем более подходящую альтернативу.
Что касается того, почему вложенный CSS - это плохо: вложение увеличивает специфичность селектора. Чем выше специфичность, тем больше усилий требуется для переопределения. Неопытные разработчики часто беспокоятся, что их CSS может повлиять на несколько страниц, поэтому они используют селекторы, такие как:
Когда опытный разработчик будет беспокоиться о том, что его CSS может не повлиять на несколько страниц, он использует такие селекторы, как:
Это заблуждение , так что игнорируйте это как плохой аргумент. Не попадайтесь в ловушку ошибочной ошибки , потому что плохой аргумент в поддержку БЭМ не является основанием полагать, что БЭМ не может быть хорошим.
Я рассмотрел это раньше, BEM & LESS не сопоставимы. Яблоки и апельсины и др.
Я рекомендую взглянуть на OOCSS, SMACSS и BEM и взвесить все за и против каждой методологии ... как команда . Я использую БЭМ, потому что мне нравится его строгость в формате, и я не против уродливых селекторов, но я не могу сказать вам, что подходит вам или вашей команде. Не позволяйте одному откровенному человеку управлять шоу. Если вам не нравится BEM, помните, что есть и другие альтернативы, которые вашей команде будет проще поддержать. Возможно, вам придется защищать свою позицию с коллегой, но в долгосрочной перспективе это, вероятно, окажет положительное влияние на результаты ваших проектов.
Я написал ответ на StackOverflow, который описывает, как работает БЭМ . Важно понимать, что ваши идеальные селекторы должны иметь специфику
0-0-1-0
чтобы их было легко переопределять и расширять.Выбор использования БЭМ не означает, что вам нужно отказаться от МЕНЬШЕ! Вы все еще можете использовать переменные, вы все еще можете использовать @imports, и вы, конечно, можете продолжать использовать вложение. Разница в том, что вы хотите, чтобы отображаемый вывод стал единым классом, а не цепочкой-потомком.
Где вы могли иметь
С BEM вы можете использовать:
Кроме того, поскольку БЭМ вращается вокруг отдельных блоков, вы можете легко разделить код на отдельные файлы.
widget.less
будет содержать стили для.widget
блока, в то время какcomponent.less
будет содержать стили для.component
блока. Это значительно упрощает поиск источника для любого конкретного класса, хотя вы все еще можете использовать исходные карты.источник
Редактировать 2017
Если вы читаете это в 2017 году, теневые DOM и теневые DOM полифилы, а также компоненты решают все эти проблемы, сохраняя при этом ваш код небольшим, компактным и модульным. Не используйте БЭМ в новом проекте IMO.
Вместо BEM у нас есть такие инструменты, как ViewEncapsulation, Polymer, StyledJSX, SASS, Styled Components и т. Д.
Рассмотрите возможность использования BEM, если у вас нет компонентно-ориентированной архитектуры; если у вас есть устаревший код для поддержки; или если вы просто мертвы на все вручную, без инструментов.
БЭМ делает ваш стиль независимым от вложенности DOM. Это достигается путем предоставления каждому элементу, который вы можете захотеть стилизовать атрибут класса с большой задницей, который, вероятно, будет уникальным на вашей странице. Большая часть стиля тогда сделана на классах.
Это делает ваш код более модульным, потому что вложение больше не учитывается, за счет значительной детализации.
Без БЭМ
Без БЭМ мы могли бы написать это:
Стандартный стиль CSS может выглядеть следующим образом:
То же самое с SASS будет выглядеть так:
Если вы небольшая команда, где каждый может кодировать CSS в соответствии с высокими стандартами, а проект достаточно мал, чтобы вы могли полностью его осознать, это хорошее и разумное решение.
С БЭМ
Однако, если ваш код становится больше, и у вас большая команда со смешанными способностями, это может быть не таким простым решением. Что делать, если вы хотите зеленые якоря в другом виджете, например. Таким образом, мы сделаем привязку модульной и исключим потомки селекторов.
Теперь наш HTML гораздо более многословен:
Наш CSS не имеет потомков селекторов:
Но теперь мы можем сделать это:
Виджет __anchor является модульным. Маловероятно, что на странице будет другое определение .widget__anchor.
компромиссные:
BEM:
Стандартный CSS (который основан на использовании селекторов-потомков):
Третий путь - реальные компоненты.
Если вы используете что-то вроде React, Angular 2 или любого другого из современных интерфейсных фреймвордов, у вас есть другое решение. Вы можете использовать инструменты для обеспечения инкапсуляции.
В этом примере используются React и StyledJSX, но есть много вариантов. Вот виджет:
Затем вы бы использовали новый виджет следующим образом:
Все стили, объявленные в виджете, будут инкапсулированы и не будут применяться к элементам вне компонента. Мы можем просто стилизовать
div
иa
напрямую, не беспокоясь о том, чтобы случайно стилизовать что-либо еще на странице.источник
Ни один подход не идеален. ИМХО, мы должны получить лучшие части каждой из методологий (BEM, SMACSS, OOCSS, DRY). Используйте SMACSS для организации структуры папок в вашем CSS, особенно для определения логического уровня всего CSS. СУХОЙ для создания вашей служебной библиотеки или может быть общей библиотекой модификаторов, которая иногда используется в сочетании с классами, основанными на БЭМ. OOCSS для компонентов. И БЭМ для небольших компонентов или субкомпонентов. Там вы можете распределить сложность и получить свободу для работы в большой команде.
Все, что используется, не понимая сути этого, будет плохо.
Хотя БЭМ является хорошим подходом для больших команд, у него есть и недостатки. 1. Иногда это приводит к очень длинным именам в большой структуре HTML. В результате большой размер файла CSS. 2. Для вложения htmls, состоящих более чем из 2-3 уровней, определение имен становится головной болью.
Разрешение конфликтов может легко управляться, если мы думаем о структуре компонентов вместе с очень простым набором базовых стилей. Это скорее только двухуровневое наследование. Каждый элемент внутри компонента будет иметь либо глобальное правило стиля, либо определенное для этого компонента. Это один из самых простых вариантов.
источник