それぞれのクラス名の規則が曖昧だったのでこの際整理してみました。
BEM
お馴染みのBlock__element--modifier
です。
ReactならBlock=コンポーネントの単位ですかね?
CSS Modules
CSSが書いてあるファイル名_クラス名__Hash
になります。
Button.module.css
.primary{/* ... */}
Button.jsx
importstyledfrom'./Button.module.css'exportconstButton=props=>{return<buttonclassName={styles.primary}{...props}/>}
Styled components (Babelプラグイン前提)
上2つと比べて暗黙的な処理があります。
CSSが書いてあるファイル名とコンポーネント名が同じ場合、CSSが書いてあるファイル名(コンポーネント名)-Hash
になります。
Button.jsx
exportconstButton=styled.button` /* ... */ `
CSSが書いてあるファイル名とコンポーネント名が違う場合は、CSSが書いてあるファイル名__コンポーネント名-Hash
になります。
Butter.jsx
exportconstBtn=styled.button` /* ... */ `
おわりに
BEMとCSS ModulesとStyled-components、ブロックスコープと名前空間という点では似た設計思想ですが
細かい実装となると1対1で対応してはいないのでそれぞれ見極めて使いたいですね。