Un de mes collègues pousse fortement la méthode BEM (Block Element Modifier) pour le CSS dans un projet qu'il dirige, et je ne peux tout simplement pas comprendre ce qui le rend meilleur que le moins CSS que nous écrivons depuis des années.
BEM est une méthodologie CSS. D'autres comprennent OOCSS et SMACSS. Ces méthodologies sont utilisées pour écrire du code modulaire, extensible et réutilisable qui fonctionne bien à l'échelle.
LESS est un préprocesseur CSS. D'autres incluent Sass et Stylus. Ces préprocesseurs sont utilisés pour convertir leurs sources respectives en CSS étendu.
BEM et LESS ne sont pas comparables comme étant «meilleurs» l'un par rapport à l'autre, ce sont des outils qui ont des objectifs différents. Vous ne diriez pas qu'un tournevis est meilleur qu'un marteau, sauf si l'on considère l'utilité pour résoudre un problème spécifique.
Il réclame "des performances supérieures" ...
Les performances devraient être mesurées entre un style CSS classique de:
.widget .header
et le style BEM de:
.widget__header
mais d'une manière générale, les performances du sélecteur CSS ne sont pas un goulot d'étranglement et n'ont pas besoin d'être optimisées.
La «performance» de BEM concerne généralement le code d'écriture des performances d'un développeur. Si la méthodologie BEM est utilisée de manière cohérente et correcte, il est facile pour des groupes de développeurs de créer simultanément des modules distincts sans conflits de style.
Il réclame "lisibilité" et "réutilisation" ...
Je ne sais pas si je dirais à un nouveau développeur que BEM est plus lisible. Je peux dire qu'il fournit des directives bien définies quant à la signification et à la structure des classes.
Voir une classe comme
.foo--bar__baz
Me dit qu'il y a un foo
bloc qui est en l' bar
état et contient un baz
élément.
Je dirais absolument que le BEM est plus réutilisable qu'un modèle classique.
Si deux développeurs créent des blocs ( foo
et bar
) et que ces deux blocs ont des en-têtes, ils peuvent réutiliser en toute sécurité leurs blocs dans différents contextes sans se soucier d'une collision de noms.
En effet, dans un contexte classique, .foo .heading
et .bar .heading
serait en conflit, et d' introduire un conflit de spécificité qui doivent être résolus, peut - être au cas par cas.
Dans un site BEM, les classes seraient .foo__heading
et .bar__heading
, ce qui ne serait jamais en conflit.
Il affirme que "le CSS imbriqué est un anti-modèle". Que signifie "anti-pattern", et pourquoi le CSS imbriqué est-il mauvais?
Un "anti-modèle" est un modèle de codage plus facile à apprendre et à utiliser pour les développeurs inexpérimentés qu'une alternative plus appropriée.
En ce qui concerne les raisons pour lesquelles le CSS imbriqué est mauvais: l'imbrication augmente la spécificité d'un sélecteur. Plus la spécificité est élevée, plus il faut d'effort pour passer outre. Les développeurs inexpérimentés craignent souvent que leur CSS puisse affecter plusieurs pages, ils utilisent donc des sélecteurs comme:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
Lorsqu'un développeur expérimenté craint que son CSS n'affecte pas plusieurs pages, il utilise donc des sélecteurs comme:
.more
Il affirme que "tout le monde s'oriente vers l'utilisation du BEM, nous devrions donc le faire aussi." ...
C'est une erreur de marche , alors ignorez cela comme un mauvais argument. Ne tombez pas dans le piège de l' erreur fallacieuse , car un mauvais argument en faveur du BEM n'est pas une raison de croire que le BEM ne peut pas être bon.
Quelqu'un pourrait-il expliquer en détail ce qui rend BEM meilleur que LESS?
J'ai couvert cela auparavant, BEM & LESS ne sont pas comparables. Pommes et oranges, etc.
Mon collègue ne parvient pas à me convaincre complètement, mais je ne sais pas si j'ai d'autre choix que de suivre.
Je recommande de jeter un œil à OOCSS, SMACSS et BEM, et de peser le pour et le contre de chaque méthodologie ... en équipe . J'utilise BEM parce que j'aime sa rigueur de format, et ne me dérange pas les sélecteurs laids, mais je ne peux pas vous dire ce qui est bon pour vous ou pour votre équipe. Ne laissez pas un franc-parler diriger le spectacle. Si vous n'êtes pas à l'aise avec BEM, sachez qu'il existe d'autres alternatives qui pourraient être plus faciles à prendre en charge par votre équipe. Vous devrez peut-être défendre votre position auprès de votre collègue, mais à long terme, cela aura probablement un effet positif sur le résultat de vos projets.
Je préférerais vraiment pouvoir apprécier le BEM plutôt que de l'accepter à contrecœur.
J'ai écrit une réponse sur StackOverflow qui décrit le fonctionnement de BEM . La chose importante à comprendre est que vos sélecteurs idéaux devraient avoir une spécificité de 0-0-1-0
sorte qu'ils soient faciles à remplacer et à étendre.
Choisir d'utiliser BEM ne signifie pas que vous devez abandonner MOINS! Vous pouvez toujours utiliser des variables, vous pouvez toujours utiliser @imports et vous pouvez certainement continuer à utiliser l'imbrication. La différence est que vous voulez que la sortie rendue devienne une seule classe, plutôt qu'une chaîne descendante.
Où vous auriez pu avoir
.widget {
.heading {
...
}
}
Avec BEM, vous pouvez utiliser:
.widget {
&__heading {
...
}
}
De plus, étant donné que BEM tourne autour de blocs individuels, vous pouvez facilement séparer le code en fichiers séparés. widget.less
contiendrait des styles pour le .widget
bloc, tandis component.less
que contiendrait des styles pour le .component
bloc. Cela facilite beaucoup la recherche de la source pour n'importe quelle classe particulière, bien que vous souhaitiez peut-être toujours utiliser des cartes sources.