Tailwind CSS for Rails
Tailwind CSSはユーティリティファーストのCSSフレームワークです。flex
やpt-4
やtext-center
やrotate-90
といったCSSクラスが同梱されており、マークアップ内で直接これらを組み合わせてあらゆるデザインを構築できます。
🔗 インストール
Rails 7では、新規アプリケーションの生成時に--css tailwind
を指定することでTailwindを事前設定できます。Tailwindを後から追加する場合は以下を実行する必要があります。
./bin/bundle add tailwindcss-rails
を実行./bin/rails tailwindcss:install
を実行
このtailwindcss-rails gemには、Tailwind CSS v3フレームワークのスタンドアロン実行可能ファイルが含まれています。これらの実行ファイルはプラットフォームに依存するため、実際にはプラットフォームごとに異なるgemが存在しますが、自分が使うプラットフォームに適したgemが自動的に選択されるようになっています。
サポートされているプラットフォームは以下です。
- arm64-darwin(macos-arm64)
- x64-mingw32(windows-x64)
- x64-mingw-ucr(windows-x64)
- x86_64-darwin(macos-x64)
- x86_64-linux(linux-x64)
- aarch64-linux(linux-arm64)
- arm-linux(linux-armv7)
🔗 ローカルインストールされたtailwindcss
を使う
ベンダー提供のスタンドアロン実行ファイルを利用できない事情がある場合(サポートされていないプラットフォームなど)、実行可能ファイルが含まれているディレクトリへのパスをTAILWINDCSS_INSTALL_DIR
環境変数 に設定することで、ローカルインストールしたtailwindcss
実行可能ファイルを利用できるようになります。
たとえば、実行可能ファイルを/node_modules/bin/tailwindcss
に配置する形でtailwindcss
をインストールする場合は、環境変数を以下のように設定してください。
TAILWINDCSS_INSTALL_DIR=/path/to/node_modules/bin
この設定は相対パスでも有効です。アプリの./node_modules/.bin/tailwindcss
ディレクトリにインストールした場合は、以下のように設定します。
TAILWINDCSS_INSTALL_DIR=node_modules/.bin
🔗 Tailwindcssで開発する
🔗 設定
Tailwindのビルドは、従来のnodeインストールでTailwindを実行する場合と同様にconfig/tailwind.config.jsファイルでカスタマイズできます。ファーストパーティのプラグインはすべてサポートされます。
インストーラは、Tailwindの入力ファイルをapp/assets/stylesheets/application.tailwind.cssに作成します。使いたいプラグインはこのファイルでインポートし、カスタムの@apply
ルールもこのファイルでセットアップできます。
rails tailwindcss:build
を実行すると、この入力ファイルを用いてapp/assets/builds/tailwind.cssという出力ファイルが生成されます。これがアプリにインクルードされる出力CSSです(インストーラはこれを自動で設定し、Interフォントも同様に設定します)。
🔗 production向けビルド
tailwindcss:build
コマンドは自動的にassets:precompile
にアタッチされるので、Tailwind出力ファイルの生成が完了してからアセットパイプラインがファイルをダイジェスト化します。
🔗 テスト向けビルド
tailwindcss:build
コマンドは自動的にtest:prepare
rakeタスクにアタッチされます。このtest:prepare
タスクは、テストコマンドの前に実行されます。CI環境でbin/rails test
を実行すると、テスト実行前にTailwindの出力が生成されます。
🔗 アセットの自動更新
アプリケーションの開発中にTailwindを"ウォッチ"モードで実行して、変更内容を生成されるCSS出力に自動的に反映したい場合は、以下のいずれかの方法で可能です。
rails tailwindcss:watch
を別プロセスとして実行する、または./bin/dev
を実行する(foremanを用いて、TailwindのウォッチプロセスとdevelopmentモードのRailsサーバーを両方起動します)
rails tailwindcss:watch
のサポートが不十分なシステムで実行する場合は、このタスクにrails tailwindcss:watch[poll]
のようにpoll
引数を渡して、tailwindcssが代わりにポーリングするように指示します。。 bin/dev
で実行する場合は、 Procfile.dev
を変更する必要があります。
rails tailwindcss:watch
をDockerコンテナ内のプロセスとして実行する場合は、適切なコンテナがウォッチプロセスを実行し続けるためにdocker-compose.ymlファイル内でtty: true
を指定してください。
ttyのないDockerコンテナ内でrails tailwindcss:watch
コマンドを実行する場合は、rails tailwindcss:watch[always]
のようにalways
引数を渡すことで、stdin
がクローズしたときもウォッチャーを動かし続けるようTailwindに指示します。ただしbin/dev
コマンドで実行する場合は、Procfile.dev
ファイルを変更する必要があります。
🔗 最小化されていないアセットでデバッグする
アセットを最小化したくない場合は、以下のようにrakeタスクにdebug
引数を渡します。
rails tailwindcss:build[debug]
、またはrails tailwindcss:watch[debug]
なお、タスクのオプションは以下のように複数指定できます。
rails tailwindcss:watch[debug,poll]
🔗 カスタムの入力ファイルや出力ファイル
独自の入力ファイルや出力ファイルを使う必要がある場合は、bundle exec tailwindcss
を実行して自分のプラットフォーム固有の実行ファイルにアクセスすることで独自のビルドオプションを指定できます。
🔗 トラブルシューティング
ユーザーがよく遭遇するいくつかの問題点を以下に記載します。
🔗 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 <サポート対象プラットフォーム>
一部のユーザーから、以下のサポート対象ネイティブプラットフォームのいずれかで実行した場合にこのエラーが発生することが報告されています。
arm64-darwin
x64-mingw32
x64-mingw-ucrt
x86_64-darwin
x86_64-linux
aarch64-linux
🔗 対応1: BundlerのPLATFORMS
をチェックする
考えられる原因のひとつは、Bundlerが現在のプラットフォーム用のネイティブgemを含める指示を受け取っていないというものです。Gemfile.lockファイルをチェックして、PLATFORMS
セクション内に現在のプラットフォームが含まれているかどうかを調べてください。含まれていない場合は、以下を実行してから再度Bundlerを実行します。
bundle lock --add-platform <プラットフォーム名>
🔗 対応2: BUNDLE_FORCE_RUBY_PLATFORM
をチェックする
よくあるもうひとつの原因は、BUNDLE_FORCE_RUBY_PLATFORM
設定パラメータがtrueに設定されていて、Bundlerが常にその設定を用いているというものです。その場合は、以下のいずれかを実行してこの設定を削除してから再度Bundlerを実行してください。
bundle config unset force_ruby_platform
# または
bundle config set --local force_ruby_platform false
詳しくは以下のBundlerドキュメントを参照してください。
🔗 Alpine(musl)環境でNo such file or directory
エラーが発生する
一部のユーザーが、Alpineシステム上で tailwindcss
を実行するとNo such file or directory
エラーが発生すると報告しています。
🔗 対応: GNU libc compatibility(gcompat)をインストールする
これは、本家のtailwindcss
バイナリ実行ファイルがGNU libcシステム上でビルドされているために、標準のmusi libcシステムと互換性がないことが原因です。
本家側の修正については#6785で提案されている状態ですが、それまでは以下のように互換ライブラリをインストールすることで回避できます。
apk add build-base gcompat
🔗 アセットパイプラインのアセットを使うには
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.
Tailwind CSS is released under the MIT License.
The Inter font is released under the SIL Open Font License, Version 1.1.
概要
MITライセンスに基づいて翻訳・公開いたします。