Bir meslektaşım, yürüttüğü bir projede CSS için BEM (Blok Eleman Değiştirici) yöntemini çok zorluyor ve yıllardır yazdığımız LESS CSS'den daha iyi kılan şeyin ne olduğunu anlayamıyorum.
BEM bir CSS metodolojisidir. Diğerleri arasında OOCSS ve SMACSS bulunur. Bu metodolojiler, iyi performans gösteren modüler, genişletilebilir, tekrar kullanılabilir kodlar yazmak için kullanılır.
LESS bir CSS önişlemcisidir. Diğerleri Sass ve Stylus'tur. Bu önişlemciler, kendi kaynaklarını, genişletilmiş CSS'ye dönüştürmek için kullanılır.
BEM ve LESS birbirlerinden "daha iyi" oldukları için karşılaştırılamaz, farklı amaçlara hizmet eden araçlardır. Belirli bir sorunu çözmek için bir yardımcı program düşünmek dışında, bir tornavidanın çekiçten daha iyi olduğunu söyleyemezsiniz.
"Daha yüksek performans" iddia ediyor ...
Performansın klasik CSS stili arasında ölçülmesi gerekir:
.widget .header
ve BEM tarzı:
.widget__header
fakat genel olarak konuşursak, CSS seçici performansı bir tıkanıklık değildir ve optimize edilmesi gerekmez.
BEM "performans" genellikle bir geliştiricinin performans yazma kodu ile ilgilidir. BEM metodolojisi tutarlı ve doğru kullanılırsa, geliştirici gruplarının aynı anda stil çarpışmaları olmadan farklı modüller yazması kolaydır.
"Okunabilirlik" ve "yeniden kullanım" iddia ediyor ...
BEM'in daha okunaklı olduğunu yeni bir geliştiriciye söyleyeceğimi bilmiyorum. Sınıfların anlamı ve yapısı hakkında iyi tanımlanmış bazı kılavuzlar sağladığını söyleyebilirim.
Gibi bir sınıf görmek
.foo--bar__baz
Durumda olan ve bir element içeren bir foo
blok olduğunu söyler .bar
baz
BEM'in klasik bir modelden daha fazla tekrar kullanılabilir olduğunu kesinlikle söyleyebilirim.
İki geliştirici bloklar ( foo
ve bar
) oluşturursa ve bu blokların her ikisi de başlıklara sahipse , bloklarını adlandırma çakışması endişesi olmadan farklı bağlamlarda güvenle yeniden kullanabilir.
Bir klasik bir anlamda, en, çünkü .foo .heading
ve .bar .heading
çakışmaması ve muhtemelen bir vaka ile ayrı ayrı, çözülmesi gereken verecek bir özgüllük çatışma getirecek.
Bir BEM sitesinde, sınıflar olacaktır .foo__heading
ve .bar__heading
bunlar asla çatışmaz.
“İç içe CSS'nin bir anti-kalıp olduğunu” iddia ediyor. "Anti-patern" bile ne anlama geliyor ve iç içe CSS neden kötü?
Bir "anti-patern", deneyimsiz geliştiricilerin öğrenmesi ve kullanması için daha uygun bir alternatiften daha kolay bir kodlama paternidir.
Yuvalanmış CSS'nin neden kötü olduğu kadarıyla: Yuvalama, bir seçicinin özgünlüğünü artırır. Spesifiklik ne kadar yüksek olursa, geçersiz kılmak için o kadar fazla çaba harcar. Deneyimsiz geliştiriciler genellikle CSS'lerinin birden fazla sayfayı etkileyebileceğinden endişe ediyorlar, bu nedenle aşağıdaki gibi seçicileri kullanıyorlar:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
Deneyimli bir geliştirici, CSS'lerinin birden fazla sayfayı etkilemeyeceğinden endişe ederse, aşağıdaki gibi seçiciyi kullanırlar:
.more
“Herkes BEM kullanmaya doğru gidiyor, bu yüzden biz de yapmalıyız” diyor.
Bu bir çoğunluk yanlıştır , bu yüzden kötü bir argüman olarak görmezden gel . Yanıltıcı yanılsama tuzağına düşmeyin , çünkü BEM'in desteklenmesinde kötü bir tartışma, BEM'in iyi olamayacağına inanmak için bir neden değildir.
Birisi BEM'i LESS'ten daha iyi yapan şeyleri ayrıntılı olarak açıklayabilir mi?
Bunu daha önce ele aldım, BEM ve LESS karşılaştırılamaz. Elmalar ve portakallar vb.
Meslektaşım beni ikna edemedi, ancak takip etmekten başka seçeneğim olup olmadığını bilmiyorum.
OOCSS, SMACSS ve BEM'e göz atmanızı ve her metodolojinin artılarını ve eksilerini bir ekip olarak tartıyorum . BEM kullanıyorum, çünkü formatın kesinliğini seviyorum ve çirkin seçmenlere aldırış etmiyorum, ama size veya ekibinize neyin doğru olduğunu söyleyemem. Açık sözlü bireyin şovu yönetmesine izin verme. BEM konusunda rahat değilseniz, ekibinizin desteklemesi daha kolay olabilecek başka alternatifler olduğunu unutmayın. Konumunuzu iş arkadaşınızla savunmanız gerekebilir, ancak uzun vadede muhtemelen projelerin sonucunu olumlu yönde etkileyecektir.
İsteyerek kabullenmekten çok, BEM'i takdir etmeyi tercih ederim.
StackOverflow'a BEM'in nasıl çalıştığını açıklayan bir cevap yazdım . Anlaması gereken önemli şey, ideal seçicilerin 0-0-1-0
geçersiz kılmak ve genişletmek için kolay olmaları için belirli bir özelliğe sahip olmaları gerektiğidir .
BEM kullanmayı seçmeniz LESS'ten vazgeçmeniz gerektiği anlamına gelmez! Hala değişkenleri kullanabilir, yine de @portport kullanabilirsiniz ve kesinlikle yuvalamayı kullanmaya devam edebilirsiniz. Aradaki fark, oluşturulmuş çıktının soyundan gelen zincirden ziyade tek bir sınıf haline gelmesini istediğinizdir.
Nerede olabilirdi
.widget {
.heading {
...
}
}
BEM ile kullanabilirsiniz:
.widget {
&__heading {
...
}
}
Ek olarak, BEM tek tek blokların etrafında döndüğü için kodu kolayca ayrı dosyalara ayırabilirsiniz. widget.less
için stilleri içerecektir .widget
ederken, bloğun component.less
için stiller içerecektir .component
bloğun. Bu, herhangi bir sınıf için kaynak bulmayı çok kolaylaştırır, ancak yine de kaynak haritaları kullanmak isteyebilirsiniz.