Cosa rende BEM migliore dell'uso di un linguaggio fogli di stile annidabile come LESS?


27

Un mio collega sta spingendo pesantemente il metodo BEM ( Block Element Modifier ) per il CSS in un progetto che sta guidando, e non riesco proprio a capire cosa lo rende migliore del MENO CSS che scriviamo da anni.

Afferma "prestazioni più elevate", ma non riesco a immaginare come le prestazioni possano anche importare per i tipi di app Web che scriviamo in questo negozio di codici. Non stiamo realizzando Twitter o Facebook, qui. Sarei molto sorpreso se le nostre app di massimo utilizzo hanno più di 10000 accessi al mese e la maggior parte sono meno di 1000.

Afferma "leggibilità" e "riutilizzo", ma MENO fa già molto meglio , secondo me. E sento che BEM manipola il markup così male con dozzine di personaggi extra dedicati a questi nomi di classe super-lunghi che riduce radicalmente la leggibilità.

Afferma che "il CSS nidificato è un anti-pattern". Che cosa significa "anti-modello", anche media , e perché è annidato male CSS?

Afferma che "tutti si stanno muovendo verso l'uso del BEM, quindi anche noi dovremmo". Il mio contatore è "Se tutti saltassero da un ponte, seguiresti?" Ma è ancora totalmente irremovibile a riguardo.

Qualcuno potrebbe spiegare in dettaglio cosa rende BEM migliore di MENO? Il mio collega non riesce a convincermi completamente, ma non so se ho altra scelta che seguire. Preferirei davvero poter apprezzare il BEM, piuttosto che accettarlo a malincuore.


1
BEM e LESS hanno scopi diversi. Uso sia BEM che LESS.
zzzzBov,

4
Nota che BEM non riguarda principalmente i CSS: si tratta di identificare modelli incapsulati ricorrenti nel tuo progetto e di raccogliere tutto il necessario per quel blocco (comportamento, modello, stili) in un posto centrale. Anche se limitato ai soli CSS, BEM è ancora un ottimo modo per organizzare i tuoi stili e prevenire in modo affidabile gli scontri con i nomi. Questo è totalmente indipendente dai preprocessori come LESS o SASS, che sono solo linguaggi di stile più produttivi rispetto ai semplici CSS perché offrono macro e variabili e notazione abbreviata e tutti i tipi di belle caratteristiche. MENO = vittoria, BEM = vittoria, ma MENO × BEM = vittoria²!
amon

Risposte:


29

Un mio collega sta spingendo pesantemente il metodo BEM (Block Element Modifier) ​​per il CSS in un progetto che sta guidando, e non riesco proprio a capire cosa lo rende migliore del MENO CSS che scriviamo da anni.

BEM è una metodologia CSS. Altri includono OOCSS e SMACSS. Queste metodologie sono utilizzate per scrivere codice modulare, estensibile e riutilizzabile che funziona bene su scala.

MENO è un preprocessore CSS. Altri includono Sass e Stilo. Questi preprocessori vengono utilizzati per convertire le rispettive fonti in CSS espanso.

BEM e LESS non sono comparabili in quanto "migliori" l'uno dell'altro, sono strumenti che servono a scopi diversi. Non diresti che un cacciavite è meglio di un martello, tranne quando si considera l'utilità per risolvere un problema specifico.

Afferma "prestazioni più elevate" ...

Le prestazioni dovrebbero essere misurate tra uno stile CSS classico di:

.widget .header

e stile BEM di:

.widget__header

ma in generale, le prestazioni del selettore CSS non sono un collo di bottiglia e non devono essere ottimizzate.

La "performance" di BEM è in genere relativa al codice di scrittura delle performance di uno sviluppatore. Se la metodologia BEM viene utilizzata in modo coerente e corretto, è facile per gruppi di sviluppatori creare simultaneamente moduli distinti senza collisioni di stile.

Afferma "leggibilità" e "riutilizzo" ...

Non so che direi a un nuovo sviluppatore che BEM è più leggibile. Posso dire che fornisce alcune linee guida ben definite sul significato e sulla struttura delle classi.

Vedere una classe come

.foo--bar__baz

Mi dice che c'è un fooblocco che si trova nello barstato e contiene un bazelemento.

Direi assolutamente che BEM è più riutilizzabile di un modello classico.

Se due sviluppatori creano blocchi ( fooe bar), ed entrambi i blocchi hanno intestazioni, possono riutilizzare in sicurezza i loro blocchi in contesti diversi senza preoccuparsi di una collisione dei nomi.

Questo perché, in un contesto classico, .foo .headinge .bar .headingsarebbe in contrasto, e introdurre un conflitto specificità che avrebbe bisogno di essere risolto, possibilmente su una base caso per caso.

In un sito BEM, le classi sarebbero .foo__headinge .bar__heading, che non sarebbero mai in conflitto.

Afferma che "il CSS nidificato è un anti-pattern". Cosa significa "anti-pattern", e perché CSS nidificato è dannoso?

Un "anti-pattern" è un modello di codifica che è più facile da imparare e usare per gli sviluppatori inesperti rispetto a un'alternativa più appropriata.

Per quanto riguarda il motivo per cui il CSS nidificato è negativo: l'annidamento aumenta la specificità di un selettore. Maggiore è la specificità, maggiore è lo sforzo necessario per scavalcare. Gli sviluppatori inesperti spesso temono che i loro CSS possano interessare più pagine, quindi usano selettori come:

#something .lorem .ipsum .dolor ul.sit li.amet a.more

Quando uno sviluppatore esperto si preoccuperebbe che il suo CSS non influisse su più pagine, quindi utilizzava selettori come:

.more

Afferma che "tutti si stanno muovendo verso l'uso del BEM, quindi dovremmo anche noi." ...

Questo è un errore del carrozzone , quindi ignoralo come un cattivo argomento. Non cadere nella trappola dell'errore fallace , perché una cattiva discussione a sostegno di BEM non è un motivo per credere che BEM non possa essere buono.

Qualcuno potrebbe spiegare in dettaglio cosa rende BEM migliore di MENO?

Ho già parlato di questo, BEM & LESS non sono comparabili. Mele e arance, ecc.

Il mio collega non riesce a convincermi completamente, ma non so se ho altra scelta che seguire.

Consiglio di dare un'occhiata a OOCSS, SMACSS e BEM e valutare i pro ei contro di ogni metodologia ... come una squadra . Uso BEM perché mi piace la sua rigidità nel formato e non mi dispiace per i brutti selettori, ma non posso dirti cosa è giusto per te o per la tua squadra. Non lasciare che un individuo schietto esegua lo spettacolo. Se non ti senti a tuo agio con BEM, tieni presente che esistono altre alternative che potrebbero essere più facili da supportare per il tuo team. Potrebbe essere necessario difendere la tua posizione con il tuo collega, ma a lungo termine avrà probabilmente un effetto positivo sul risultato dei tuoi progetti.

Preferirei davvero poter apprezzare il BEM, piuttosto che accettarlo a malincuore.

Ho scritto una risposta su StackOverflow che descrive come funziona BEM . La cosa importante da capire è che i selettori ideali dovrebbero avere una specificità in 0-0-1-0modo che siano facili da sostituire ed estendere.

Scegliere di usare BEM non significa che devi rinunciare a MENO! Puoi ancora usare le variabili, puoi ancora usare @imports e puoi sicuramente continuare a usare l'annidamento. La differenza è che vuoi che l'output renderizzato diventi una singola classe, piuttosto che una catena discendente.

Dove avresti potuto avere

.widget {
    .heading {
        ...
    }
}

Con BEM puoi usare:

.widget {
    &__heading {
        ...
    }
}

Inoltre, poiché BEM ruota attorno a singoli blocchi, puoi facilmente separare il codice in file separati. widget.lessconterrebbe gli stili per il .widgetblocco, mentre component.lessconterrebbe gli stili per il .componentblocco. Questo rende molto più facile trovare l'origine per una particolare classe, anche se potresti comunque voler utilizzare le mappe di origine.


4
@CoreDumpError, il problema è quando si avvia la nidificazione dei moduli all'interno dei moduli. "ogni sviluppatore può semplicemente annidare il codice del proprio widget specifico a un livello più profondo" non è del tutto corretto, ogni sviluppatore deve annidare il codice del loro widget specifico sempre più a fondo, altrimenti i nomi delle collisioni si sovrappongono in modo generalmente non intenzionale. L'unico modo per evitare le collisioni di denominazione è con una sorta di spazio dei nomi e BEM offre un modo semplice per classi di spazi dei nomi coerenti.
zzzzBov,

3
@CoreDumpError, considera questo esempio . Un autore che scrive senza BEM deve impegnarsi ulteriormente per verificare ogni combinazione di ogni modulo che potrebbe essere aggiunta all'interno del proprio modulo. Un autore che utilizza BEM non lo fa.
zzzzBov,

1
@CoreDumpError, certamente potrebbe essere. Trovo che BEM sia facile da addestrare per i nuovi sviluppatori e facilita la revisione del codice, ma SMACSS e OOCSS sono buone alternative. Consiglio vivamente di esaminare queste opzioni come alternativa. Dirò che uso BEM per il mio stesso sviluppo in modo da non essere in conflitto con me stesso, specialmente con me stesso futuro, che è stupido e dimentica le cose.
zzzzBov,

1
Trovo che BEM sia eccellente su qualsiasi progetto che implichi qualsiasi tipo di complessità sia CSS. Puoi avere un sito che si trova su WordPress e utilizza solo Javascript per attivare le cose sullo scorrimento, ma è ancora complesso come un'app Web nel CSS. È importante non cadere nella trappola di pensare "il mio sito non è complesso" solo perché fa la maggior parte delle sue cose puramente nel regno visivo (come fanno molti siti di marketing)
Toni Leigh,

1
@CoreDumpError la maggior parte dei miei progetti precedenti sono stati sforzi solitari, e sono arrivato a gran parte del BEM per conto mio: specificità e selettori unici. Mantenere una base di codice è un grosso problema che diventa estremamente chiaro con BEM. Il codice è manutenzione. Costruire cose è facile. Mantenere schemi perfetti è difficile, specialmente dopo alcuni mesi di distanza dalla base di codice. Problemi di specificità aggravati nel tempo. I vantaggi si applicano al team IMO di qualsiasi dimensione!
Yuji Tomita

8

Modifica 2017

Se stai leggendo questo nel 2017, i polyfill shadow DOM e shadow DOM, oltre ai componenti risolvono tutti questi problemi, mantenendo il tuo codice piccolo, compatto e modulare. Non utilizzare BEM su un progetto IMO greenfield.

Invece di BEM, abbiamo strumenti come ViewEncapsulation, Polymer, StyledJSX, Moduli SASS, Componenti stilizzati, ecc.

Prendi in considerazione l'utilizzo di BEM se non hai un'architettura orientata ai componenti; se hai un codice legacy da supportare; o se sei appena pronto a fare tutto manualmente senza attrezzi.


BEM rende il tuo stile indipendente dalla tua nidificazione DOM. Lo fa dando ad ogni elemento che si potrebbe desiderare di definire un attributo di classe big ass che è probabilmente unico nella tua pagina. La maggior parte dello styling viene quindi svolto durante le lezioni.

Questo rende il tuo codice più modulare, perché l'annidamento non viene più preso in considerazione, a scapito di una grande verbosità.

Senza BEM

Senza BEM, potremmo scrivere questo:

<div class="widget">
  <a>Hello!</a>
  <ul>...</ul>
</div>

Lo stile CSS standard potrebbe essere simile al seguente:

.widget {
  border: 1px solid red;
}

.widget a {
  color: green;
}

La stessa cosa con SASS sarebbe simile a questa:

.widget {
  border: 1px solid red;
  a {
    color: green;
  }
}

Se sei un piccolo team in cui tutti possono codificare CSS secondo uno standard elevato e il progetto è abbastanza piccolo da consentirne la piena conoscenza, questa è una soluzione valida e ragionevole.

Con BEM

Tuttavia, se il tuo codice diventa più grande e hai un grande team di abilità miste, questa potrebbe non essere una soluzione così semplice. Che cosa succede se si desidera ad esempio ancore verdi in un altro widget. Quindi rendiamo l'ancoraggio modulare ed eliminiamo i selettori discendenti.

Ora il nostro HTML è molto più dettagliato:

<div class="widget">
  <a class="widget__anchor">Hello!</a>
  <ul class="widget__ul">...</ul>
</div>

Il nostro CSS non ha selettori discendenti:

.widget {
  border: 1px solid red;
}

.widget__anchor {
  color: green;
}

Ma ora possiamo fare questo:

<div class="widget__2">
  <a class="widget__anchor">Hello!</a>
</div>

Il widget__anchor è modulare. È improbabile che sulla pagina esista un'altra definizione di .widget__anchor.

compromessi:

BEM:

  • Ti dà un codice più modulare. Puoi prendere qualsiasi pezzo in isolamento.
  • Consente a chiunque di scrivere CSS. Non è necessario conoscere lo stile principale e le sostituzioni personalizzate. In una grande squadra, questo è carino.
  • Rimuove eventuali problemi di specificità.
  • È significativamente più dettagliato.

CSS standard (che si basa sull'uso di selettori discendenti):

  • Significa che il tuo stile dipende dal contesto.
  • Richiede una consapevolezza della cascata. Il codice in una sola posizione può influire sul codice altrove. In una piccola squadra questa è una buona cosa.
  • Può soffrire di problemi di specificità che potrebbero essere difficili da debug per uno sviluppatore alle prime armi.
  • È significativamente più stretto.

Il terzo modo - Componenti reali.

Se stai usando qualcosa come React, Angular 2 o una qualsiasi delle altre moderne cornici front-end, hai un'altra soluzione. È possibile utilizzare gli strumenti per imporre l'incapsulamento.

Questo esempio usa React e StyledJSX, ma ci sono molte opzioni. Ecco un widget:

const Widget = () => 
  <div>
    <a>Hello</a>
  </div>
  <style jsx>
    div {border:red }
    a { background: pink }
  </style>

Dovresti quindi utilizzare il nuovo widget in questo modo:

<Widget />

Tutti gli stili dichiarati nel widget sarebbero incapsulati e non si applicherebbero agli elementi esterni al componente. Siamo liberi di modellare semplicemente il dive adirettamente senza preoccuparci di dare uno stile accidentale a qualsiasi altra cosa sulla pagina.


1
Pro e contro senza favorire alcun lato, mi piace.
Adrian Moisa,

Penso che ci sia qualcosa di veramente triste nel dire "scrivi il tuo codice in questo modo in modo che le persone che non capiscono il collegamento in cascata possano capirlo". È come dire "Scrivo il mio codice senza array perché uno dei membri più giovani del team non capisce come funzionano gli array". Personalmente preferisco il metodo più succinto che privilegia il lato a cascata naturale dei fogli di stile a cascata.
Matt Fletcher,

@MattFletcher - Penso che sia una questione di dimensioni del progetto. La cascata è intrinsecamente globale. Si impostano i valori, quindi si esegue l'override e l'override attraverso l'albero. Se hai un progetto più piccolo con piena visibilità, va bene, ma su un progetto più grande, diventa fragile. Le persone hanno paura di cambiare le cose perché un cambiamento più in alto nella cascata rompe cose casuali in altri luoghi. L'incapsulamento dei componenti è davvero bello su progetti più grandi. Tutto funziona e basta.
superluminario,

2

Nessun approccio è perfetto. IMHO, dovremmo ottenere le parti migliori di ciascuna delle metodologie (BEM, SMACSS, OOCSS, DRY). Utilizzare SMACSS per organizzare la struttura delle cartelle nel CSS, in particolare per definire la suddivisione a livello logico dell'intero CSS. DRY per creare la libreria di utilità o può essere una libreria di modifica comune da utilizzare a volte in combinazione con classi basate su BEM. OOCSS per componenti. E BEM per piccoli componenti o sottocomponenti. Lì puoi distribuire la complessità e ottenere la libertà di lavorare all'interno di una grande squadra.

Tutto ciò che viene usato senza averne compreso l'essenza risulterà negativo.

Mentre BEM è un buon approccio per i team più grandi, ha anche alcuni aspetti negativi. A volte risulta in nomi molto lunghi in una grande struttura HTML. Dimensione file CSS grande risultante. 2. Per nidificare htmls di oltre 2-3 livelli, diventa un mal di testa per definire i nomi.

La risoluzione dei conflitti può essere facilmente gestita se pensiamo alla struttura dei componenti insieme a un set molto semplice di stile base. È solo un'eredità a due livelli. Ogni elemento all'interno di un componente avrebbe una regola di stile globale o specifica per quel componente. Questa è una delle opzioni più semplici.


Discussione estremamente valida. Gli sviluppatori dovrebbero essere in grado di pensare da soli e analizzare la portata del problema. Il solo seguire ciecamente metodologie ti porta ancora nei guai. Ho colleghi che non considerano affatto gli effetti dei loro cambiamenti sulla pagina e non importa quale metodologia abbiamo le cose vanno a sud nel tempo. Sto spingendo molto per aumentare il livello di consapevolezza CSS nel team. SASS nidificato con stili locali e stili globali è sufficiente per mantenere pulito il progetto, è facile da leggere.
Adrian Moisa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.