Tailwind CSS v4の@tailwindcss/postcssで重複minifyを避ける設定方法

公開日: 更新日:

目次

1. はじめに

このブログでは、Tailwind CSS + PostCSSプラグインを使っています 。当初は、以下のドキュメントのように、シンプルなpostcss.config.mjsでした。

Installing Tailwind CSS with PostCSS - Tailwind CSS

しかし、このpostcss.config.mjsでは、Tailwind CSSとcssnanoの両方でminifyが実行され、予期しない重複処理が発生していることに気付きました。具体的には、production環境で@tailwindcss/postcssが自動的にoptimizeを有効にするため、その後のcssnanoと処理が重複してしまいます。

project/postcss.config.mjs

export default {
  plugins: {
    'postcss-import': {},
    '@tailwindcss/postcss': {},
    'postcss-discard-comments': {removeAll: true},
    ...(process.env.NODE_ENV === 'production' ? {
      'cssnano': {preset: 'default'},
    } : {}),
  },
};

2. PostCSSプラグインの引数について

コードを確認したら、以下のような実装になっていました。

@tailwindcss-postcss/src/index.ts

https://github.com/tailwindlabs/tailwindcss/blob/837e240b4d8474fae786cda8eaf9ae3f76a52a75/packages/%40tailwindcss-postcss/src/index.ts#L44-L50

export type PluginOptions = {
  // The base directory to scan for class candidates.
  base?: string

  // Optimize and minify the output CSS.
  optimize?: boolean | { minify?: boolean }
}

以下のコードを見ると、let optimize = opts.optimize ?? process.env.NODE_ENV === 'production'とあります。これは、明示的にoptimizeオプションが指定されていない場合、NODE_ENVproductionのときに自動的にoptimizeが有効になることを意味します。

@tailwindcss-postcss/src/index.ts

https://github.com/tailwindlabs/tailwindcss/blob/06007b1eecacacb3891821fa3d7b9b6c3e198de7/packages/%40tailwindcss-postcss/src/index.ts#L58-L60

function tailwindcss(opts: PluginOptions = {}): AcceptedPlugin {
  let base = opts.base ?? process.cwd()
  let optimize = opts.optimize ?? process.env.NODE_ENV === 'production'

たとえば、以下のようにスクリプトでNODE_ENV=productionとすると、optimizetrueになります。

project/package.json

{
  "scripts": {
    "build:11ty": "npx eleventy",
    "serve:11ty": "npx eleventy --serve",
    "build:postcss": "NODE_ENV=production postcss src/assets/css/main.css -o src/assets/css/main.min.css",
    "watch:postcss": "NODE_ENV=development postcss src/assets/css/main.css -o src/assets/css/main.min.css --watch",
    "build": "npm run build:postcss && npm run build:11ty"
  }
}

上記のpostcss.config.mjsの場合、Tailwind CSSでoptimizeし、その後cssnanoでもminifyする。ということになります。

3. 解決方法

私の現在の環境だと、Tailwind CSSのoptimizeは不要ですので、設定を変更し、無効にしました。

project/postcss.config.mjs

export default {
  plugins: {
    'postcss-import': {},
    '@tailwindcss/postcss': {
      minify: false,
      optimize: false,
    },
    'postcss-discard-comments': {removeAll: true},
    ...(process.env.NODE_ENV === 'production' ? {
      'cssnano': {preset: 'default'},
    } : {}),
  },
};

この設定でcssnanoがminifyを担当することになり、想定した通りのスクリプトになりました。

私は、Tailwind CSS v4から使い始めたので、今までのv3以前の挙動は分かっておりませんでしたが、v3から使っている開発者には既知のことかもしれません。

4. まとめ

リポジトリのコードを確認する方が確実ですね。

小巻旭洋のプロフィール写真

小巻 旭洋

2014年からフリーランスとして活動し、2016年に株式会社フルーデンスを設立する。FileMaker開発歴は約10年。多数の企業システム構築を手がけ、特にデータベース設計と、JavaScript連携、Web連携、パフォーマンス最適化を専門としています。2025年から、Web業務システム・アプリ開発をメインに開発をしています。