Tailwind CSS for Rails
Tailwind CSSはユーティリティファーストのCSSフレームワークです。flex
やpt-4
やtext-center
やrotate-90
といったCSSクラスが同梱されており、マークアップ内で直接これらを組み合わせてあらゆるデザインを構築できます。
🔗 インストール
Rails 7では、新規アプリケーションの生成時に--css tailwind
を指定することでTailwind CSSを事前設定できます。Tailwindを後から追加する場合は以下を実行する必要があります。
./bin/bundle add tailwindcss-rails
を実行./bin/rails tailwindcss:install
を実行
このtailwindcss-rails gemは、Tailwind CLI実行可能ファイルをインストールするためにtailwindcss-ruby
gemに依存しています。
🔗 特定バージョンのtailwindcss
を選択する
tailwindcss-ruby
gemは、このtailwindcss-rails gemのフローティング依存関係として宣言されているため、デフォルトでは最新の安定バージョンが取得されます。ただし、アプリケーションのGemfile
で以下のようにそのgemを近いバージョンに固定することで、特定のバージョンのTailwind CSSを選択できます。
gem "tailwindcss-rails"
# tailwindcssバージョンを3.4.13に固定する
gem "tailwindcss-ruby", "3.4.13"
🔗 ローカルインストールされたtailwindcss
を使う
必要に応じて、npmベースのローカルインストールも利用できます。詳しくはtailwindcss-rubyを参照してください。
🔗 アプリケーションのTailwindをv3からv4にアップグレードする
このtailwindcss-rails gem v4.xは、アプリケーションのアップグレードに役立つ機能も含め、Tailwind v4で動作するように更新されています。
Tailwind CSS v4のアップグレードの完全な説明はこのREADMEの範囲外であるため、既存の大規模アプリのアップグレードに着手する前に、公式の Tailwind CSS v4 アップグレード ガイドを読んでおくことが強く推奨されます。
このtailwindcss-rails gemは、以下のような一部のアップグレード作業を支援します。
- このgemのv4における重大な変更に対応するために、生成されたファイルの一部を更新する。
- Tailwind CSS v4の規約を満たすために、ローカルプロジェクトファイルの一部を更新する。
- Tailwind本家のv4アップグレードツールの実行を試みる。
🔗 v4へのアップグレードは「必須ではありません」
v4へのアップグレードは必須ではない点にご注意ください。今すぐv4に移行したくない場合や、移行中に問題が発生した場合は、当分の間Tailwind CSS v3を引き続き利用できます。
アップグレードしたくない場合は、アプリケーションのtailwindcss-rails gemを以下のようにv3.3.1に固定します。
# Gemfile
gem "tailwindcss-rails", "~> 3.3.1" # tailwindcss-rubyをv3に推移的に固定する
使っているtailwindcss-rails gemのバージョンが3.3.0
以下の場合は、以下のようにtailwindcss-rails
とtailwindcss-ruby
を両方とも固定してください。
# Gemfile
gem "tailwindcss-rails", "~> 3.3"
gem "tailwindcss-ruby", "~> 3.4" # tailwindcss-rails <= 3.3.0の場合のみ必要
🔗 アップグレード手順
警告
TailwindプラグインをJavaScriptツールを経由せずに利用しているアプリケーションでは、以下に示すアップグレード手順を実行するとtailwind.config.js
ファイルの完全な移行に失敗する可能性があります。理由は、Tailwind本家のアップグレードツールでは、インストールされているTailwindプラグインがJavaScriptパッケージマネージャから利用できる必要があるためです。
Tailwind本家のアップグレードツールを実行中にエラーが発生した場合は、後述する追加手順「v4 CSSクラス名への更新」を試してください。これは、必要なパッケージを(一時的に)インストールして、作業終了後にクリーンアップするのに役立ちます。
最初に、tailwindcss-rails
をv4.0.0以上に更新します。これにより、tailwindcss-ruby
もv4に推移的に依存するようになります。
# Gemfile
gem "tailwindcss-rails", "~> 4.0" # tailwindcss-rubyを推移的にv4に固定する
app/assets/stylesheets/application.tailwind.css
にインポートされる既存のCSSファイルへのパス参照を以下のように更新して、ファイルがapp/assets/tailwind/application.css
に移動されたときに参照が解決されるようにします。
-@import "pagy.css";
+@import "../stylesheets/pagy.css";
(オプション)TailwindのCSSクラス名をv4に移行する場合は、後述の「v4 CSSクラス名への更新」を行ってから次に進んでください。
次に、bin/rails tailwindcss:upgrade
を実行します。
これにより、Tailwind公式のアップグレードツールの実行が試行されます。このツールを実行するにはnpx
が必要です。これは1回限りの操作ですが、アップグレードを成功させるために強く推奨されます。
▶詳細なアップグレードタスク(クリックで展開)
- 生成された
config/tailwind.config.js
ファイル内の一部の項目をクリーンアップする。 config/postcss.config.js
ファイルをrootディレクトリに移動する(存在する場合)。app/assets/stylesheets/application.tailwind.css
ファイルをapp/assets/tailwind/application.css
に移動・リネームする(存在する場合)。- アプリケーションレイアウトで不要になった
stylesheet_link_tag "tailwindcss"
タグを削除する。 - アプリケーションレイアウトからInter フォントへの参照を削除する。
- Tailwind公式のアップグレードツールを実行する
(注: このアップグレードは1回限りで、実行するにはnpx
が必要ですが、ツールの実行を強く推奨します)。
▶素のRailsアプリでアップグレードを実行した場合の実行結果(クリックで展開)
$ bin/rails tailwindcss:upgrade
apply /path/to/tailwindcss-rails/lib/install/upgrade_tailwindcss.rb
Removing references to 'defaultTheme' from /home/user/myapp/config/tailwind.config.js
gsub config/tailwind.config.js
Strip Inter font CSS from application layout
gsub app/views/layouts/application.html.erb
Remove unnecessary stylesheet_link_tag from application layout
gsub app/views/layouts/application.html.erb
Moving /home/user/myapp/app/assets/stylesheets/application.tailwind.css to /home/user/myapp/app/assets/tailwind/application.css
create app/assets/tailwind/application.css
remove app/assets/stylesheets/application.tailwind.css
10.9.0
Running the upstream Tailwind CSS upgrader
run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "."
≈ tailwindcss v4.0.0
│ Searching for CSS files in the current directory and its subdirectories…
│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.css`
│ Migrating JavaScript configuration files…
│ ↳ The configuration file at `./config/tailwind.config.js` could not be automatically migrated to the new CSS
│ configuration format, so your CSS has been updated to load your existing configuration file.
│ Migrating templates…
│ ↳ Migrated templates for configuration file: `./config/tailwind.config.js`
│ Migrating stylesheets…
│ ↳ Migrated stylesheet: `./app/assets/tailwind/application.css`
│ ↳ No PostCSS config found, skipping migration.
│ Updating dependencies…
│ Could not detect a package manager. Please manually update `tailwindcss` to v4.
│ Verify the changes and commit them to your repository.
Compile initial Tailwind build
run rails tailwindcss:build from "."
≈ tailwindcss v4.0.0
Done in 56ms
run bundle install --quiet
成功しない場合は、Tailwind設定がカスタマイズされている可能性があります。この場合、アプリケーションが確実にアップグレードされるように作業を行う必要があります。Tailwind公式のアップグレードガイドをよく読んでから、後述の追加手順「v4 CSSクラス名への更新」に沿って作業してみてください。
🔗 アップグレードのトラブルシューティング
アップグレードで問題が生じた場合は、以下のディスカッションを確認してください。
参考: TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450
アップグレードタスクで対処されていない既知のケースがいくつかあります。
- TailwindプラグインをJavaScriptツールを経由せずに利用しているアプリケーションでは、以下に示すアップグレード手順を実行すると
tailwind.config.js
ファイルの完全な移行に失敗する可能性があります。
理由は、Tailwind本家のアップグレードツールでは、インストールされているTailwindプラグインがJavaScriptパッケージマネージャから利用できる必要があるためです。
Tailwind本家のアップグレードツールを実行中にエラーが発生した場合は、後述する追加手順「v4 CSSクラス名への更新」を試してください。これは、必要なパッケージを(一時的に)インストールして、作業終了後にクリーンアップするのに役立ちます。
今後アップグレードプロセスについては追って改善を試みる予定ですが、現時点ではアップグレード中に何らかの手動作業が必要になる可能性があります。
🔗 Tailwind CSSクラスをv4向けに更新する
メモ
手順の改善に協力したい方は、以下のディスカッションでメンテナーまでお知らせください。
参考: TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450
いくつかの追加作業を手動で行っておくことで、Tailwind公式のアップグレードツールがアプリケーションのCSSクラス名をv4の規約に更新するようになります。このオプション手順を実行するには、JavaScriptツールチェインを利用可能にしておく必要があります。
Tailwind公式のアップグレードツールがnode_modules/
以下のファイルにアクセスしないようにするには、.gitignore
ファイルに以下の行を追加します。
/node_modules
プロジェクトのrootディレクトリにpackage.json
ファイルを以下の内容で作成します。
{
"name": "app_name",
"version": "1.0.0",
"dependencies": {
"tailwindcss": "^3.4.17", // Mandatory!!
// Install all plugins and modules that are referenced in tailwind.config.js
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/typography": "^0.5.16"
// And so on...
}
}
npm install
(yarn
を使っている場合はyarn install
)を実行します。
config/tailwind.config.js
を更新します。以下のようにcontent
部分を一時的に変更して、すべてのパスに.
を追加し、設定ファイルに対する相対パスが使われるようにします。
content: [
'../public/*.html',
'../app/helpers/**/*.rb',
'../app/javascript/**/*.js',
'../app/views/**/*.{erb,haml,html,slim}'
],
(参照するすべてのパスに.
を追加するだけです)
上記の指示に沿ってTailwind公式のアップグレードツールを実行します。
ツールが正常に実行されたら、一時設定をクリーンアップします。
- 以下を削除します。
.gitignore
の/node_modules
も削除します。package.json
ファイルnode_modules/
ディレクトリpackage-lock.json
(またはyarn.lock
)
- 自分たちのCSSファイルを開いて以下の行を削除します(存在する場合)。
@plugin '@tailwindcss/container-queries';
config/tailwind.config.js
への変更を元に戻します(パスが再びアプリケーションのrootに相対的になるようにします)。
🔗 Tailwindcssで開発する
🔗 設定とコマンド
🔗 入力ファイル: app/assets/tailwind/application.css
tailwindcss:install
タスクを実行すると、Tailwind入力ファイルをapp/assets/tailwind/application.css
に生成します。この入力ファイルでは、使いたいプラグインをインポートしたり、カスタム@apply
ルールを設定したりできます。
注意: v4では、このファイルは以下のように変更されました。tailwindcss:upgrade
タスクを実行するとこの変更・リネームが行われます。
- 変更前:
app/assets/stylesheets/application.tailwind.css
- 変更後:
app/assets/tailwind/application.css
🔗 出力ファイル: app/assets/builds/tailwind.css
rails tailwindcss:build
タスクを実行すると、入力ファイルを用いてapp/assets/builds/tailwind.css
ファイルに出力が生成されます。これが出力CSSとして最終的にアプリに含められます。
🔗 コマンド
このtailwindcss-rails gemでは、さまざまなRailsタスクが利用可能になります。オプションが複数使えるタスクもあり、タスクを組み合わせることも可能です。
概要:
bin/rails tailwindcss:install
- Tailwindの設定ファイルと出力ファイル、および
Procfile.dev
をインストールします。 bin/rails tailwindcss:build
- 出力ファイルを生成します。
bin/rails tailwindcss:build[debug]
- 最小化(minify)なしの出力を生成します。
bin/rails tailwindcss:watch
- 開発中のライブリビルドを開始し、ファイルが変更されると出力を生成します。
bin/rails tailwindcss:watch[debug]
- 最小化なしの出力を生成します。
bin/rails tailwindcss:watch[poll]
- ファイルシステムイベントが使えないシステム用
bin/rails tailwindcss:watch[always]
- TTYのないシステム用(一部のDockerコンテナなど)
上記タスクのオプションはrails tailwindcss:watch[debug,poll]
のように組み合わせも可能です。
このtailwindcss-rails gemは、rails server
コマンドを実行するときにライブ再構築プロセスを管理するためのPumaプラグインも提供します(後述の「ライブリビルド」を参照)。
また、rails server
コマンドとライブリビルドプロセスの両方を実行するProcfile.dev
ファイルも生成します(後述の「ライブリビルド」を参照)。
🔗 production向けビルド
tailwindcss:build
コマンドは自動的にassets:precompile
にアタッチされるので、Tailwind出力ファイルの生成が完了してからアセットパイプラインがファイルをダイジェスト化します。
🔗 テスト向けビルド
tailwindcss:build
コマンドは自動的にtest:prepare
rakeタスクにアタッチされます。このtest:prepare
タスクは、テストコマンドの前に実行されます。CI環境でbin/rails test
を実行すると、テスト実行前にTailwindの出力が生成されます。
🔗 最小化されていないアセットでビルドする
アセットを最小化したくない場合は、以下のようにrakeタスクにdebug
引数を渡します。
rails tailwindcss:build[debug]
、またはrails tailwindcss:watch[debug]
🔗 ライブリビルド
アプリケーションの開発中、Tailwindを「ウォッチ」モードで実行することで、ファイルの変更が生成されたCSS出力に自動的に反映されるようにできます。これは以下のようなさまざまな方法で実行できます。
- tailwindcss-rails gem用のPumaプラグインを使って
rails server
コマンドに「ウォッチ」モードを統合する rails tailwindcss:watch
を別プロセスとして実行するbin/dev
コマンドを実行する(この場合Foremanが使われます)
🔗 Pumaプラグイン
このtailwindcss-rails gemにはPumaプラグインが同梱されています。これを使うにはpuma.rb
設定ファイルに以下の行を追加します。
plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development"
これで、rails server
(またはpuma
)を実行すると、バックグラウンドでTailwindのウォッチプロセスが実行されます。
🔗 rails tailwindcss:watch
を実行する
このコマンドは柔軟で、いくつかの異なるオプションを指定して実行できます。
ファイルシステムイベントのサポートが完全でないシステムでrails tailwindcss:watch
を実行する場合は、以下のようにタスクにpoll
引数を渡すことで、tailwindcssにポーリングを使うよう指示します。
rails tailwindcss:watch[poll]
(bin/dev
コマンドを使う場合は、Procfile.dev
を変更してpoll
オプションを使うようにする必要があります)
rails tailwindcss:watch
コマンドをDockerコンテナ内のプロセスとして実行している場合は、適切なコンテナのdocker-compose.yml
ファイルでtty: true
を設定して、監視プロセスを実行し続けるようにします。
ttyのないDockerコンテナ内で rails tailwindcss:watch
を実行している場合は、rails tailwindcss:watch[always]
のようにタスクにalways
引数を渡します。これで、stdin
が閉じている場合でもファイルウォッチャーが閉じないようにtailwindcssに指示されます(bin/dev
コマンドを使う場合は、Procfile.dev
を変更する必要があります)。
🔗 Foreman
bin/dev
コマンドでRailsサーバーを実行すると、Foremanが呼び出され、developmenntモードでProcfile.dev
ファイルに基づいてTailwindの監視プロセスとRailsサーバーの両方が起動されます。
🔗 PostCSSを使う場合
PostCSSをプリプロセッサとして使う場合は、プロジェクトのrootディレクトリにカスタムのpostcss.config.js
を作成しておくと、Tailwindによって自動的に読み込まれます。
たとえば、ネストを有効にするには以下のようにします。
// postcss.config.js
export default {
plugins: {
"@tailwindcss/postcss": {},
}
}
注意: PostCSSは独自の前提条件を必要とするJavaScriptツールであることにご注意ください。tailwindcss-rails
は、デフォルトではJavaScriptツールを必要としないため、PostCSSを使うには、以下のようなプラグイン依存関係を含むpackage.json
と、パッケージマネージャ(yarn
やnpm
など)が必要です。
// package.json
{
"name": "my app",
"private": true,
"dependencies": {
"@tailwindcss/postcss": "^4.0.0",
"tailwindcss": "^4.0.0",
"postcss": "^8.5.1"
}
}
これでyarn
またはnpm
を実行して依存関係をインストールできるようになります。
🔗 入力ファイルや出力ファイルをカスタマイズする
入力ファイルや出力ファイルをカスタマイズする必要がある場合は、bundle exec tailwindcss
を実行してプラットフォーム固有の実行可能ファイルにアクセスすることで、独自のビルドオプションを指定できます。
🔗 トラブルシューティング
ユーザーがよく遭遇するいくつかの問題点を以下に記載します。
🔗 Pumaプラグインを使うとターミナルベースのデバッグツール(IRB、Pry、ruby/debug
など)でキー入力が失われたりハングしたりする
この問題は解決済みです。tailwindcss-rails
をv2.4.1以降のバージョンにアップグレードすることで問題を回避できます。
🔗 Dockerコンテナ内で実行すると途中で終了する
rails tailwindcss:watch
コマンドをDockerコンテナ内のプロセスとして実行している場合は、適切なコンテナのdocker-compose.yml
でtty: true
を設定して、監視プロセスが終了しないようにしてください。
ttyのないDockerコンテナ内でrails tailwindcss:watch
を実行している場合は、rails tailwindcss:watch[always]
のようにalways
引数をタスクに渡すことで、stdin
が閉じている場合でもウォッチャーを終了しないようtailwindcssに指示します(bin/dev
コマンドを使う場合は、Procfile.dev
を変更する必要があります)。
🔗 sassc-railsとコンフリクトする
Tailwindで用いられている最新のCSS機能は、Rails 6のGemfileにデフォルトでインクルードされているsassc-rails拡張では認識されません。SassC::SyntaxError
のようなエラーを回避するには、sassc-rails gemを削除する必要があります。
🔗 CSSクラス名は完全な形で書くこと
Tailwindが正常に動作するためには、CSSクラス名を完全な形で記述する必要があります。コンテンツファイルに存在しないクラス名や、プログラムで組み立てられたクラス名をTailwindで生成する必要がある場合は、Tailwindのsafelist
オプションをお使いください。
🔗 ERROR: Cannot find the tailwindcss executable for <サポート対象プラットフォーム>
詳しくはtailwindcss-rubyを参照してください。
🔗 アセットパイプラインのアセットを使うには
Railsを使っていると、アセットパイプラインのアセットからフィンガープリントを取得したくなることがあります(Railsガイド)が、Tailwindはアセットパイプラインのアセットについては関知しません。
アセットパイプラインのアセットを使いたい場合は以下のようにurl(image.svg)
をお使いください。Sprockets v3.3.0以降(#476)はurl(image.svg)
が/path/to/assets/image-7801e7538c6f1cc57aa75a5876ab0cac.svg
のように自動的に書き換えられ、出力CSSにそれらのアセットへの正しいパスが含まれるようになります。
module.exports = {
theme: {
extend: {
backgroundImage: {
'image': "url('image.svg')"
}
}
}
}
以下のようにインラインで書くこともできます。
<section class="bg-[url('image.svg')]">Has the image as it's background</section>
🔗 ライセンス
Tailwind for Rails is released under the MIT License.
概要
MITライセンスに基づいて翻訳・公開いたします。
Tailwind v4ではクラス名が変更され、tailwind.config.jsをデフォルトで使わなくなるなど多くの変更が行われています。
参考: Upgrade guide - Getting started - Tailwind CSS
参考: Tailwind CSS v4.0 - Tailwind CSS