Um colega meu está pressionando fortemente o método BEM (Modificador de elemento de bloco) para o CSS em um projeto que ele está dirigindo, e eu simplesmente não consigo entender o que o torna melhor do que o MENOS CSS que escrevemos há anos.
BEM é uma metodologia CSS. Outros incluem OOCSS e SMACSS. Essas metodologias são usadas para escrever código modular, extensível e reutilizável, com bom desempenho em escala.
LESS é um pré-processador CSS. Outros incluem Sass e Stylus. Esses pré-processadores são usados para converter suas respectivas fontes em CSS expandido.
O BEM e o MENOS não são comparáveis por serem "melhores" do que o outro, são ferramentas que servem a propósitos diferentes. Você não diria que uma chave de fenda é melhor que um martelo, exceto quando considera a utilidade para resolver um problema específico.
Ele afirma "maior desempenho" ...
O desempenho precisaria ser medido entre um estilo CSS clássico de:
.widget .header
e estilo BEM de:
.widget__header
mas, de um modo geral, o desempenho do seletor de CSS não é um gargalo e não precisa ser otimizado.
O "desempenho" do BEM geralmente é referente ao código de gravação de desempenho de um desenvolvedor. Se a metodologia BEM for usada de forma consistente e correta, é fácil para grupos de desenvolvedores criarem simultaneamente módulos distintos sem colisões de estilo.
Ele afirma "legibilidade" e "reutilização" ...
Não sei se diria a um novo desenvolvedor que o BEM é mais legível. Posso dizer que ele fornece algumas diretrizes bem definidas quanto ao significado e estrutura das classes.
Vendo uma classe como
.foo--bar__baz
Diz-me que existe um foobloco que está no barestado e contém um bazelemento.
Eu diria absolutamente que o BEM é mais reutilizável que um modelo clássico.
Se dois desenvolvedores criam blocos ( fooe bar) e ambos têm títulos, eles podem reutilizar seus blocos com segurança em diferentes contextos sem se preocupar com uma colisão de nomes.
Isso porque, em um contexto clássico, .foo .headinge .bar .headingentraria em conflito, e introduzir um conflito especificidade que precisa ser resolvido, possivelmente numa base caso-a-caso.
Em um site do BEM, as classes seriam .foo__headinge .bar__heading, que nunca entrariam em conflito.
Ele afirma que "CSS aninhado é um anti-padrão". O que significa "antipadrão" e por que o CSS aninhado é ruim?
Um "antipadrão" é um padrão de codificação mais fácil para os desenvolvedores inexperientes aprenderem e usarem do que uma alternativa mais apropriada.
Quanto ao motivo pelo qual CSS aninhado é ruim: o aninhamento aumenta a especificidade de um seletor. Quanto maior a especificidade, mais esforço é necessário para substituir. Os desenvolvedores inexperientes geralmente se preocupam com o fato de o CSS afetar várias páginas, então eles usam seletores como:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
Quando um desenvolvedor experiente teme que seu CSS não afete várias páginas, ele usa seletores como:
.more
Ele afirma que "todo mundo está se movendo para usar o BEM, então devemos também".
Isso é uma falácia do movimento , então ignore isso como um argumento ruim. Não caia na armadilha da falácia da falácia , porque um argumento ruim em apoio ao BEM não é uma razão para acreditar que o BEM não pode ser bom.
Alguém poderia explicar em detalhes o que torna o BEM melhor que o MENOS?
Eu cobri isso antes, BEM & LESS não são comparáveis. Maçãs e laranjas, etc.
Meu colega não conseguiu me convencer completamente, mas não sei se tenho outra opção a não ser segui-lo.
Eu recomendo dar uma olhada em OOCSS, SMACSS e BEM, e pesar os prós e contras de cada metodologia ... como uma equipe . Uso o BEM porque gosto do rigor no formato e não me importo com os seletores feios, mas não posso dizer o que é certo para você ou sua equipe. Não deixe que um indivíduo franco faça o show. Se você não estiver familiarizado com o BEM, saiba que existem outras alternativas que podem ser mais fáceis para sua equipe apoiar. Pode ser necessário defender sua posição com seu colega de trabalho, mas a longo prazo provavelmente terá um efeito positivo no resultado de seus projetos.
Eu realmente preferiria apreciar o BEM do que aceitá-lo de má vontade.
Eu escrevi uma resposta no StackOverflow que descreve como o BEM funciona . O importante é entender que seus seletores ideais devem ter uma especificidade de 0-0-1-0modo que sejam fáceis de substituir e estender.
Escolher usar o BEM não significa que você precisa desistir de MENOS! Você ainda pode usar variáveis, ainda pode usar @imports e certamente pode continuar usando o aninhamento. A diferença é que você deseja que a saída renderizada se torne uma classe única, em vez de uma cadeia descendente.
Onde você poderia ter
.widget {
.heading {
...
}
}
Com o BEM você pode usar:
.widget {
&__heading {
...
}
}
Além disso, como o BEM gira em torno de blocos individuais, é possível separar facilmente o código em arquivos separados. widget.lessconteria estilos para o .widgetbloco, enquanto component.lessque conteria estilos para o .componentbloco. Isso torna muito mais fácil encontrar a fonte para qualquer classe em particular, embora você ainda deseje usar os mapas de origem.