Cosa rende BEM migliore rispetto all'utilizzo di un linguaggio di fogli di stile annidabile come MENO?

24

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

Sostiene "prestazioni più elevate", ma non posso immaginare come le prestazioni possano avere importanza per il tipo di app web che scriviamo in questo negozio di codice. Non stiamo facendo Twitter o Facebook, qui. Sarei molto sorpreso se le nostre app di utilizzo più elevato abbiano più di 10000 accessi a mese e la maggior parte di loro è inferiore a 1000.

Sostiene "leggibilità" e "riuso", ma MENO lo fa già molto meglio , secondo me. E sento che BEM manipola il markup così male con dozzine di caratteri extra dedicati a questi nomi di classi super-lunghi che riduce riduce la leggibilità.

Afferma che "CSS annidato è un anti-modello". Che cosa significa "anti-pattern" anche significa e perché CSS annidato è sbagliato?

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

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

    
posta CoreDumpError 15.04.2015 - 19:57
fonte

3 risposte

26

A colleague of mine is heavily pushing the BEM (Block Element Modifier) method for the CSS in a project he's helming, and I just cannot comprehend what makes it better than the LESS CSS we've been writing for years.

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

LESS è un preprocessore CSS. Altri includono Sass e Stilo. Questi preprocessori sono usati per convertire le rispettive fonti in CSS espansi.

BEM e LESS non sono paragonabili come "migliori" degli altri, sono strumenti che servono a scopi diversi. Non diresti che un cacciavite è meglio di un martello, tranne quando consideri l'utilità per risolvere un problema specifico.

He claims "higher performance"...

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

.widget .header

e lo 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 "prestazione" BEM è solitamente in relazione al codice di scrittura delle prestazioni di uno sviluppatore. Se la metodologia BEM viene utilizzata in modo coerente e corretto, è facile per gruppi di sviluppatori creare simultaneamente moduli distinti senza conflitti di stile.

He claims "readability" and "re-use"...

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.

Vedendo una classe come

.foo--bar__baz

Mi dice che esiste un blocco foo che si trova nello stato bar e contiene un elemento baz .

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

Se due sviluppatori creano blocchi ( foo e bar ), e entrambi i blocchi hanno intestazioni, possono riutilizzare i blocchi in modo sicuro in diversi contesti senza preoccuparsi di una collisione di nomi.

Questo perché, in un contesto classico, .foo .heading e .bar .heading entrerebbero in conflitto e introdurrebbe un conflitto di specificità che dovrebbe essere risolto, eventualmente caso per caso.

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

He claims "nested CSS is an anti-pattern." What does "anti-pattern" even mean, and why is nested CSS bad?

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

Per quanto riguarda il motivo per cui CSS annidato è sbagliato: l'annidamento aumenta la specificità di un selettore. Maggiore è la specificità, maggiore è lo sforzo necessario per eseguire l'override. Gli sviluppatori inesperti temono spesso che il loro CSS possa influenzare più pagine, quindi usano selettori come:

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

Quando uno sviluppatore esperto si preoccupa che i suoi CSS non possano influenzare più pagine, quindi usano selettori come:

.more

He claims that "everyone is moving toward using BEM, so we should too."...

Questa è una fallacia del carro da guerra , quindi ignorala come una brutta discussione. Non cadere nella trappola della fallacia fallacia , perché un argomento non valido a sostegno del BEM non è un motivo per credere che BEM non può essere buono.

Could someone please explain in detail what makes BEM better than LESS?

Ne ho parlato prima, BEM & MENO non sono paragonabili. Mele e arance, ecc.

My colleague is completely failing to convince me, but I don't know if I have a choice but to follow.

Raccomando di dare un'occhiata a OOCSS, SMACSS e BEM e a valutare i pro e i contro di ogni metodologia ... come una squadra . Uso BEM perché mi piace il suo rigore nel formato e non mi importa dei brutti selezionatori, ma non posso dirti cosa è giusto per te o per la tua squadra. Non lasciare che un individuo schietto faccia 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.

I'd really rather be able to appreciate BEM, than to grudgingly accept it.

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

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

Dove potresti aver avuto

.widget {
    .heading {
        ...
    }
}

Con BEM puoi usare:

.widget {
    &__heading {
        ...
    }
}

Inoltre, poiché BEM ruota intorno a singoli blocchi, puoi facilmente separare il codice in file separati. widget.less conterrebbe gli stili per il blocco .widget , mentre component.less conterrà gli stili per il blocco .component . Questo rende molto più facile trovare la fonte per ogni particolare classe, sebbene tu possa ancora voler utilizzare le mappe sorgente.

    
risposta data 15.04.2015 - 20:57
fonte
7

Modifica 2017

Se stai leggendo questo nel 2017, i domini ombra 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 di campo verde IMO.

Al posto di BEM, abbiamo strumenti come ViewEncapsulation, Polymer, StyledJSX, Moduli SASS, Styled Components, ecc.

Considerare l'utilizzo di BEM se non si dispone di un'architettura orientata ai componenti; se hai il codice legacy da supportare; o se sei morto, imposta tutto manualmente senza strumenti.

BEM rende il tuo stile indipendente dal tuo annidamento DOM. Lo fa dando a ogni elemento che si potrebbe desiderare di stilare un attributo di classe big-ass che è probabilmente unico nella tua pagina. La maggior parte dello styling viene quindi eseguita sulle classi.

Questo rende il tuo codice più modulare, perché il nesting non viene più preso in considerazione, a spese di una grande quantità di verbosità.

Senza BEM

Senza BEM, potremmo scrivere questo:

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

Lo stile CSS standard potrebbe essere simile a questo:

.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 i CSS ad un livello elevato, e il progetto è abbastanza piccolo da poterne mantenere la completa cognizione, questa è una soluzione buona e ragionevole.

Con BEM

Tuttavia, se il tuo codice diventa più grande e disponi di un grande team misto, questa potrebbe non essere una soluzione così semplice. Che cosa succede se vuoi ancore verdi in un altro widget, per esempio. 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 nella pagina esista un'altra definizione di .widget__anchor.

compromessi:

BEM:

  • Ti dà più codice modulare. Puoi prendere qualsiasi pezzo in isolamento.
  • Consente a chiunque di scrivere CSS. Non è necessario essere a conoscenza dello stile principale e delle sostituzioni personalizzate. In una squadra numerosa, questo è bello.
  • Rimuove eventuali problemi di specificità.
  • È significativamente più dettagliato.

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

  • Indica che lo stile dipende dal contesto.
  • Richiede una consapevolezza della cascata. Il codice in una volta può influenzare il codice altrove. In una piccola squadra questa è una buona cosa.
  • Può soffrire di problemi di specificità che potrebbero risultare difficili per il debug di uno sviluppatore principiante.
  • È significativamente più stretto.

Il terzo modo: Componenti reali.

Se stai usando qualcosa come React, Angular 2 o qualsiasi altra moderna frameword front-end, hai un'altra soluzione. È possibile utilizzare gli strumenti per rafforzare 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>

Utilizzerai quindi il nuovo widget in questo modo:

<Widget />

Tutti gli stili dichiarati nel widget verrebbero incapsulati e non si applicherebbero agli elementi esterni al componente. Siamo liberi di definire semplicemente div e a direttamente senza preoccuparci di aggiungere accidentalmente altri elementi alla pagina.

    
risposta data 09.04.2016 - 14:20
fonte
2

Nessun approccio è perfetto. IMHO, dovremmo ottenere le parti migliori di ciascuna delle metodologie (BEM, SMACSS, OOCSS, DRY). Usa SMACSS per organizzare la struttura delle cartelle nel tuo CSS, specialmente 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. Da lì puoi distribuire la complessità e ottenere la libertà di lavorare all'interno di una grande squadra.

Qualsiasi cosa, se usata senza comprenderne l'essenza, risulterà negativa.

Mentre il BEM è un buon approccio per i team più grandi, ha anche alcuni aspetti negativi. 1. A volte porta nomi molto lunghi in una struttura HTML di grandi dimensioni. Grande dimensione del file CSS risultante. 2. Per la nidificazione di html che è più di 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 di base dello stile di base. È solo un'eredità a due livelli. Ogni elemento all'interno di un componente dovrebbe avere una regola di stile globale o specifica per quel componente. Questa è una delle opzioni più facili.

    
risposta data 14.04.2016 - 14:36
fonte

Leggi altre domande sui tag