迷うことが多いので一度情報を整理してみます。もし誤りがあれば教えていただけますと助かります!
目次
フォルダ構成の一例↓↓
/src
  /components
    /Navigation
      Navigation.jsx
      Navigation.css
    /Search
      Search.jsx
      Search.css
    /Filter
      Filter.jsx
      Filter.css
    /CountryFlag
      CountryFlag.jsx
      CountryFlag.css
  /pages
    Home.jsx
    Home.css
    CountryDetail.jsx
    CountryDetail.css
  /services
    ApiService.js
  /utils
    HelperFunctions.js
  App.jsx
  App.css
  index.jsx
各フォルダと構成についての説明
- components:
コンポーネントを格納する場所。各コンポーネントに対応するCSSファイルもこの中に配置する。例えば、Navigation.jsxに対応するスタイルはNavigation.cssに記述する。
- pages:
アプリケーションのページごとにコンポーネントを分類する場所。各ページに対応するCSSファイルもこの中に配置する。例えば、Home.jsxに対応するスタイルはHome.cssに記述する。
- services:
APIとの通信やデータの取得など、ビジネスロジックを担当するサービスファイルを格納する。
- utils:
アプリケーション全体で使用するユーティリティ関数やヘルパー関数を格納する。
- App.jsx:
アプリケーションのルートコンポーネントであり、全体のレイアウトやルーティングを設定しする。通常、このファイルには直接CSSを書くことは少なく、グローバルなスタイルやフォントの設定などを含むことがある。
- index.jsx:
アプリケーションのエントリーポイントで、ReactDOM.render()を使用してAppコンポーネントをDOMにマウントする。
CSSの適用方法
- ローカルスコープCSS:
Reactでは、CSS Modulesやstyled-componentsなどを使って、コンポーネントごとにスタイルをカプセル化する方法が一般的。これにより、異なるコンポーネントのスタイルが衝突するのを防ぐ。
衝突の一例
異なるコンポーネントが同じ名前のクラスを持つと、通常のCSSではスタイルが衝突する可能性がある。下記の例の場合、ComponentAのボタンにもComponentBのボタンにも二番目のスタイルが適用されることになる (CSSは後に書いてあるスタイルによって上書きされるため)
/* ComponentA.css */
.button {
 background-color: blue;
 color: white;
}
/* ComponentB.css */
.button {
 background-color: red;
 color: black;
}
解決策としては主に二つ。ひとつは、コンポーネントごとのCSSを定義する方法。次はコンポーネントの中にスタイルを定義する方法である。
- CSS Modules:
// ComponentA.jsx
import styles from './ComponentA.module.css';
function ComponentA() {
  return <button className={styles.button}>Click me</button>;
}
/* ComponentA.module.css */
.button {
  background-color: blue;
  color: white;
}
// ComponentB.jsx
import styles from './ComponentB.module.css';
function ComponentB() {
  return <button className={styles.button}>Click me</button>;
}
/* ComponentB.module.css */
.button {
  background-color: red;
  color: black;
}
- styled-components:
// ComponentA.jsx
import styled from 'styled-components';
const Button = styled.button`
  background-color: blue;
  color: white;
`;
function ComponentA() {
  return <Button>Click me</Button>;
}
// ComponentB.jsx
import styled from 'styled-components';
const Button = styled.button`
  background-color: red;
  color: black;
`;
function ComponentB() {
  return <Button>Click me</Button>;
}
- グローバルCSS:
App.cssやindex.cssなどのグローバルなCSSファイルを作成し、アプリケーション全体のスタイルを設定することができる。(ただし、ローカルスコープのCSSを使用が推奨されている。)
- CSSフレームワーク:
必要に応じて、BootstrapやTailwind CSSなどのCSSフレームワークを導入して、スタイルの設計や効率化ができる。
ポイント
コンポーネントごとにCSSを管理: 各コンポーネントに対応するCSSファイルを作成し、コンポーネントごとにスタイルを分離して管理することで、可読性とメンテナンス性を向上できる。
スタイルの継承とオーバーライド: Reactでは、CSS Modulesやstyled-componentsを使用することで、スタイルの継承やオーバーライドを柔軟に行うことができる。