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 foo
bloco que está no bar
estado e contém um baz
elemento.
Eu diria absolutamente que o BEM é mais reutilizável que um modelo clássico.
Se dois desenvolvedores criam blocos ( foo
e 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 .heading
e .bar .heading
entraria 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__heading
e .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-0
modo 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.less
conteria estilos para o .widget
bloco, enquanto component.less
que conteria estilos para o .component
bloco. Isso torna muito mais fácil encontrar a fonte para qualquer classe em particular, embora você ainda deseje usar os mapas de origem.