Un colega mío está presionando fuertemente el método BEM (Modificador de elemento de bloque) para el CSS en un proyecto que está dirigiendo, y simplemente no puedo entender qué lo hace mejor que el MENOS CSS que hemos estado escribiendo durante años.
BEM es una metodología CSS. Otros incluyen OOCSS y SMACSS. Estas metodologías se utilizan para escribir código modular, extensible y reutilizable que funcione bien a escala.
LESS es un preprocesador de CSS. Otros incluyen Sass y Stylus. Estos preprocesadores se utilizan para convertir sus respectivas fuentes en CSS expandido.
BEM y LESS no son comparables como "mejores" entre sí, son herramientas que sirven para diferentes propósitos. No diría que un destornillador es mejor que un martillo, excepto cuando se considera la utilidad para resolver un problema específico.
Afirma "mayor rendimiento" ...
El rendimiento debería medirse entre un estilo CSS clásico de:
.widget .header
y estilo BEM de:
.widget__header
pero en general, el rendimiento del selector CSS no es un cuello de botella y no necesita ser optimizado.
El "rendimiento" BEM generalmente se refiere al código de escritura de rendimiento de un desarrollador. Si la metodología BEM se usa de manera consistente y correcta, es fácil para los grupos de desarrolladores crear simultáneamente módulos distintos sin colisiones de estilo.
Afirma "legibilidad" y "reutilización" ...
No sé si le diría a un nuevo desarrollador que BEM es más legible. Puedo decir que proporciona algunas pautas bien definidas en cuanto al significado y la estructura de las clases.
Ver una clase como
.foo--bar__baz
Me dice que hay un foo
bloque que está en el bar
estado y contiene un baz
elemento.
Absolutamente diría que BEM es más reutilizable que un modelo clásico.
Si dos desarrolladores crean bloques ( foo
y bar
), y ambos bloques tienen encabezados, pueden reutilizar sus bloques de manera segura en diferentes contextos sin preocuparse de una colisión de nombres.
Eso es porque, en un contexto clásico, .foo .heading
y .bar .heading
entraría en conflicto, e introducir un conflicto especificidad que tendría que ser resueltos, posiblemente sobre una base de caso por caso.
En un sitio BEM, las clases serían .foo__heading
y .bar__heading
, lo que nunca entraría en conflicto.
Afirma que "CSS anidado es un antipatrón". ¿Qué significa incluso "antipatrón" y por qué el CSS anidado es malo?
Un "antipatrón" es un patrón de codificación que es más fácil de aprender y usar para los desarrolladores sin experiencia que una alternativa más apropiada.
En cuanto a por qué el CSS anidado es malo: el anidamiento aumenta la especificidad de un selector. Cuanto mayor sea la especificidad, más esfuerzo se necesita para anular. Los desarrolladores sin experiencia a menudo se preocupan de que su CSS pueda afectar a varias páginas, por lo que usan selectores como:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
Cuando un desarrollador experimentado se preocuparía de que su CSS no afecte a varias páginas, entonces usa selectores como:
.more
Afirma que "todos se están moviendo hacia el uso de BEM, así que nosotros también deberíamos"
Esa es una falacia del carro , así que ignórela como un mal argumento. No caigas en la trampa de la falacia , porque un mal argumento en apoyo de BEM no es una razón para creer que BEM no puede ser bueno.
¿Podría alguien explicar en detalle qué hace que BEM sea mejor que LESS?
Cubrí esto antes, BEM y MENOS no son comparables. Manzanas y naranjas, etc.
Mi colega no logra convencerme por completo, pero no sé si tengo otra opción que seguir.
Recomiendo echar un vistazo a OOCSS, SMACSS y BEM, y sopesar los pros y los contras de cada metodología ... como equipo . Uso BEM porque me gusta su rigurosidad en el formato, y no me importan los selectores feos, pero no puedo decirte qué es lo correcto para ti o para tu equipo. No dejes que una persona abierta dirija el espectáculo. Si no se siente cómodo con BEM, tenga en cuenta que existen otras alternativas que podrían ser más fáciles de apoyar para su equipo. Es posible que deba defender su posición con su compañero de trabajo, pero a largo plazo probablemente tendrá un efecto positivo en el resultado de sus proyectos.
Realmente preferiría poder apreciar BEM, que aceptarlo a regañadientes.
Escribí una respuesta en StackOverflow que describe cómo funciona BEM . Lo importante que debe comprender es que sus selectores ideales deben tener una especificidad 0-0-1-0
para que sean fáciles de anular y ampliar.
¡Elegir usar BEM no significa que deba renunciar MENOS! Todavía puede usar variables, aún puede usar @imports, y ciertamente puede continuar usando la anidación. La diferencia es que desea que la salida representada se convierta en una sola clase, en lugar de una cadena descendiente.
Donde podrías haber tenido
.widget {
.heading {
...
}
}
Con BEM puedes usar:
.widget {
&__heading {
...
}
}
Además, debido a que BEM gira en torno a bloques individuales, puede separar fácilmente el código en archivos separados. widget.less
contendría estilos para el .widget
bloque, mientras component.less
que contendría estilos para el .component
bloque. Esto hace que sea mucho más fácil encontrar el origen de cualquier clase en particular, aunque es posible que aún desee utilizar mapas de origen.