0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TailwindCSS のメイン CSS ファイルを分割する方法

Last updated at Posted at 2024-12-29

TailwindCSS のメイン CSS ファイルを分割する方法

TailwindCSS は設定する属性が多いため、globals.css のようなメイン CSS ファイルが大きくなりがちです。

その結果、大きくなったメイン CSS ファイルをカテゴリ別に分割したいというニーズが自然と生まれてきます。

ここでは、そのメイン CSS ファイルを分割する方法について解説します。

その前に - PostCSS モジュールの有無について

PostCSS モジュールを導入しているどうかで分割方法が若干が異なります。

ここでは postcss モジュールを導入しているパターンを「PostCSS パターン」、純粋に Tailwind CLI だけを使っているパターンを「Tailwind CLI パターン」とし、それぞれ必要な設定・手順を説明します。

追記: 当初「PostCSS パターン」で分割後ファイルの @layer base@layer components のブロックを削除する必要がある旨説明しておりましたが、その後の検証で削除せずとも問題無く解釈されることを確認したため、関連する記述を削除しました。

調査段階での各種バージョン情報

  • Next.js: 15.0.2
  • TailwindCSS: 3.4.1
  • PostCSS: 8.4.49

PostCSS パターン(Next.js)

公式のインストール方法で言うと “Install Tailwind CSS using PostCSS - Tailwind CSS” の手順で構築したパターンです。

また create-next-app で作った場合も現時点ではこのパターンになります。

このパターンでは Tailwind CLI は PostCSS のプラグインとして動作するようになっています。

※ この分割方法の公式解説は“Using with Preprocessors - Tailwind CSS”にあります。

1. postcss-import モジュールのインストール

まず @import ルールををインライン化する PostCSS プラグイン postcss-importを導入します。

$ npm install -D postcss-import

2. postcss.config.mjs の編集(または作成)

create-next-app で作ったプロジェクトであれば最初から作られているはずです。

postcss.config.mjs:

postcss.config.mjspluginspostcss-import を加えます。

/** @type {import('postcss-load-config').Config} */
const config = {
  plugins: {
    'postcss-import': {},
    tailwindcss: {},
  },
};

export default config;

公式ドキュメントによれば plugins の最初に加えることが重要 とのことです。

※ というか、PostCSS の公式サンプルでは plugins の型はリストなのですが、create-next-app で作られたコンフィグではなぜかオブジェクト定義になっているのが謎ですねぇ。

3. デフォルトの @tailwind による読み込みを @import に変更し、分割する

@tailwind xxxx 形式で記述されている TailwindCSS のベースコンポーネントの読み込み部分を、@import を使用した形式に書き換える必要があります。これは、@tailwind が TailwindCSS の独自拡張であり、postcss では解釈できないためです。

@import の順序が適切になるように注意してください。順序が正しくないと、スタイルが意図した通りに適用されない可能性があります。

具体例については、以下のサンプルコードを参照してください。

元の状態

app/globals.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  /* このブロックの定義は app/styles/basic.css に分割します */
  h1 {
    @apply text-3xl font-bold text-red-500 mt-6 mb-4;
  }
}

@layer components {
  /* このブロックの定義は app/styles/my-components.css に分割します */
  .slate-box {
    @apply border-solid border border-slate-200 bg-slate-100 bg-opacity-25;
  }
}

分割後

ファイル構成:

app
├── globals.css
└── styles
    ├── basic.css
    └── my-components.css

app/globals.css:

インポート順に解釈されるため順番には気をつける必要があります。

@import "tailwindcss/base";
@import "./styles/basic.css";

@import "tailwindcss/components";
@import "./styles/my-components.css";

@import "tailwindcss/utilities";

app/styles/basic.css:

@layer base {
  h1 {
    @apply text-3xl font-bold text-red-500 mt-6 mb-4;
  }
}

app/styles/my-components.css

@layer components {
  .slate-box {
    @apply border-solid border border-slate-200 bg-slate-100 bg-opacity-25;
  }
}

これで完了です。


Tailwind CLI パターン

※ こちらは公式ドキュメントに記載が見当たらなかったため、試行錯誤の結果をまとめたものです。

このパターンは、“Installation - Tailwind CSS” の手順に従って構築したものです。PostCSS を使用せず、Tailwind CLI が直接ビルドを行うため、手順がやや簡潔です。

ただし、この場合も @tailwind によるデフォルトインポートを廃止し、@import に置き換える必要があります。

※ Tailwind CLI は @tailwind を解釈できますが、@import で読み込んだ外部ファイルの定義が無視されます。

具体例を提示するほうがわかりやすいため、以下のサンプルコードをご参照ください。

元ファイル

docs/globals.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

/* この @layer base の定義は docs/styles/basic.css に分割します */
@layer base {
  h1 {
    @apply text-3xl font-bold text-red-500 mt-6 mb-4;
  }
}

/* この @layer components の定義は docs/styles/my-components.css に分割します */
@layer components {
  .slate-box {
    @apply border-solid border border-slate-200 bg-slate-100 bg-opacity-25;
  }
}

分割後

ファイル構成:

docs
├── globals.css
└── styles
    ├── basic.css
    └── my-components.css

app/globals.css:

基本的には PostCSS パターンの時と同じです。

インポート順に解釈されるため順番には気をつける必要があります。

@import "tailwindcss/base";
@import "./styles/basic.css";

@import "tailwindcss/components";
@import "./styles/my-components.css";

@import "tailwindcss/utilities";

app/styles/basic.css:

こちらも PostCSS パターンの時と同じです。

@layer base {
  h1 {
    @apply text-3xl font-bold text-red-500 mt-6 mb-4;
  }
}

app/styles/my-components.css

@layer components {
  .slate-box {
    @apply border-solid border border-slate-200 bg-slate-100 bg-opacity-25;
  }
}

これで完了です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?