私の同僚は、彼が手がけているプロジェクトでCSSのBEM(Block Element Modifier)メソッドを強く推し進めており、何年も書いてきたLESS CSSよりも優れていることを理解できません。
BEMはCSSの方法論です。その他には、OOCSSおよびSMACSSが含まれます。これらの方法論は、大規模で優れたパフォーマンスを発揮するモジュール式の拡張可能な再利用可能なコードを記述するために使用されます。
LESSはCSSプリプロセッサです。その他には、SassおよびStylusが含まれます。これらのプリプロセッサは、それぞれのソースを拡張されたCSSに変換するために使用されます。
BEMとLESSはお互いに「優れている」とは比較できず、異なる目的に役立つツールです。特定の問題を解決するためのユーティリティを検討する場合を除き、ドライバーはハンマーよりも優れているとは言いません。
彼は「より高いパフォーマンス」を主張しています...
次の古典的なCSSスタイルの間でパフォーマンスを測定する必要があります。
.widget .header
およびBEMスタイル:
.widget__header
しかし、一般的に言えば、CSSセレクターのパフォーマンスはボトルネックではなく、最適化する必要はありません。
BEMの「パフォーマンス」は、通常、開発者のパフォーマンス記述コードに関するものです。BEM方法論が一貫して正しく使用されている場合、開発者のグループはスタイルの衝突なしに個別のモジュールを同時に簡単に作成できます。
彼は「読みやすさ」と「再利用」を主張しています...
新しい開発者に、BEMの方が読みやすいと伝えるかどうかはわかりません。クラスの意味と構造に関して明確に定義されたガイドラインを提供していると言えます。
のようなクラスを見る
.foo--bar__baz
状態にあり、要素を含むfoo
ブロックがあることを教えてくれます。bar
baz
私は絶対に、BEMは古典的なモデルよりも再利用可能であると言います。
2人の開発者がブロック(foo
およびbar
)を作成し、それらのブロックの両方に見出しがある場合、命名の衝突を心配することなく、異なるコンテキストでブロックを安全に再利用できます。
これは、古典的な文脈で、あるためだ、.foo .heading
と.bar .heading
競合する、そしておそらく、ケースバイケースで、解決される必要があるであろう特異性の競合を紹介します。
BEMサイトでは、クラスはとに.foo__heading
なり.bar__heading
、競合することはありません。
彼は「ネストされたCSSはアンチパターンだ」と主張しています。「アンチパターン」とはどういう意味で、ネストされたCSSが悪いのはなぜですか?
「アンチパターン」は、経験の浅い開発者がより適切な代替手段よりも簡単に学習して使用できるコーディングパターンです。
ネストされたCSSが悪い理由に関しては、ネストはセレクターの特異性を高めます。特異性が高いほど、オーバーライドするのに多くの労力がかかります。経験の浅い開発者はしばしば、CSSが複数のページに影響を与えるのではないかと心配するため、次のようなセレクターを使用します。
#something .lorem .ipsum .dolor ul.sit li.amet a.more
経験豊富な開発者がCSS が複数のページに影響を与えないかもしれないと心配する場合、次のようなセレクタを使用します
.more
彼は「誰もがBEMを使用する方向に動いているので、私たちもそうすべきだ」と主張しています。...
それは時流の誤りであるので、それを悪い議論として無視してください。BEMを支持する悪い議論は、BEMが良くないと信じる理由ではないので、誤acyの fallに陥らないでください。
誰かがBEMをLESSより良くする理由を詳細に説明してもらえますか?
これについては前に説明しましたが、BEMとLESSは比較できません。リンゴとオレンジなど
私の同僚は完全に私を説得することに失敗しているが、私は選択肢に従うかどうかはわからない。
OOCSS、SMACSS、およびBEMを見て、各方法論の長所と短所をチームとして検討することをお勧めします。私はBEMを使用していますが、それは形式が厳密であることを好み、selectorいセレクターを気にしないからです。率直な人にショーを実行させないでください。BEMに慣れていない場合は、チームがサポートしやすい他の代替手段があることに注意してください。同僚との立場を守る必要があるかもしれませんが、長期的にはプロジェクトの成果にプラスの影響を与える可能性があります。
私は、BEMを不承不承に受け入れるよりも、むしろむしろBEMに感謝することができます。
StackOverflowで、BEMの仕組みを説明した回答を書きました。理解しておくべき重要なことは、理想的なセレクターは、0-0-1-0
オーバーライドおよび拡張しやすいように特定性を持つ必要があるということです。
BEMを使用することを選択しても、LESSを放棄する必要があるわけではありません。引き続き変数を使用でき、@ importsを使用でき、ネストを引き続き使用できます。違いは、レンダリングされた出力を、子孫チェーンではなく単一のクラスにすることです。
あなたがいたかもしれない場所
.widget {
.heading {
...
}
}
BEMでは次を使用できます。
.widget {
&__heading {
...
}
}
さらに、BEMは個々のブロックを中心に展開するため、コードを個別のファイルに簡単に分離できます。ブロックのwidget.less
スタイルが含まれる.widget
一方component.less
で、.component
ブロックのスタイルが含まれます。これにより、特定のクラスのソースを簡単に見つけることができますが、ソースマップを使用したい場合もあります。