このルールは "className"
に直接文字列で Tailwind クラスを記述している場合に有効です。
例:
<div className="btn-primary text-heading" />
eslint-plugin-tailwindcss
をインストールnpm install --save-dev eslint-plugin-tailwindcss
または
yarn add -D eslint-plugin-tailwindcss
.eslintrc.js
に設定を追加以下のように ESLint 設定に tailwindcss
プラグインと no-custom-classname
を追加します。
// .eslintrc.js
module.exports = {
plugins: ['tailwindcss'],
extends: ['plugin:tailwindcss/recommended'],
rules: {
'tailwindcss/no-custom-classname': [
'error',
{
whitelist: [
// ✅ デザインシステムで許可されたカスタムユーティリティ
'btn-primary',
'btn-secondary',
'text-heading',
'bg-surface',
'text-error',
'container',
'mx-auto',
'px-4',
'py-2',
// Tailwindの公式ユーティリティはデフォルトで許可されます
],
},
],
},
}
whitelist
に書いたクラスだけが許可されます。btn-*
や text-*
などのカスタムクラスを制御したいときに有効です。以下のようなコードで ESLint が検知してくれるか確認してください。
// ✅ OK
<div className="btn-primary text-heading" />
// ❌ NG(whitelistにない)
<div className="text-red-500 custom-class" />
clsx()
や classnames()
などでクラスを組み立てている場合には一部しか検出できません。クラス名をまとめて tailwind.config.js
に記述して require()
で読み込むこともできます:
// allowedTailwindClasses.js
module.exports = [
'btn-primary',
'btn-secondary',
'text-heading',
'bg-surface',
// ...
]
// .eslintrc.js
const whitelist = require('./allowedTailwindClasses.js')
module.exports = {
rules: {
'tailwindcss/no-custom-classname': ['error', { whitelist }],
},
}
この仕組みで、
.eslintrc.json
に追記する内容まず、プラグインをインストールしてください:
npm install --save-dev eslint-plugin-regexp
そして .eslintrc.json
に以下のように設定を追加します:
{
"plugins": ["regexp"],
"rules": {
"regexp/match": [
"error",
{
"files": {
"include": ["src/**/*.{js,jsx,ts,tsx}"]
},
"regex": [
{
"pattern": "\\b(text|bg|border|ring)-(red|gray|blue|green|yellow|pink|indigo|purple|emerald|cyan)-(100|200|300|400|500|600|700|800|900)\\b",
"message": "カラーの直接指定は禁止です。デザインシステムのユーティリティ(例: text-error)を使ってください。"
},
{
"pattern": "\\b(p[trblxy]?|m[trblxy]?)-[3-9]\\b",
"message": "自由な余白指定は禁止です。デザインシステムのspacingユーティリティを使ってください(例: px-4)。"
}
]
}
]
}
}
.eslintrc.json package.json src/ └ components/ └ Button.tsx
この状態で text-red-500
や px-7
を使うと ESLint が以下のようなエラーを出してくれます。
[eslint] カラーの直接指定は禁止です。デザインシステムのユーティリティ(例: text-error)を使ってください。
以下のコマンドで ESLint を実行できます:
npx eslint "src/**/*.{ts,tsx,js,jsx}"
regex
配列にさらにパターンを追加すれば、例えば shadow-*
なども制限可能require()
で読み込むのは .js
設定でのみ可能ですが、.json
に変換した形式でも読み込ませる工夫は可能です(要ビルドスクリプト)必要なら、よく使う 禁止パターンの正規表現集
や 他チームでも使える共有JSONテンプレート
も作成できます。お気軽にどうぞ!