Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Tailwind の哲学
Search
kotek
July 04, 2025
Technology
0
14
Tailwind の哲学
STAR UP 社内LT会で発表した内容です。
Tailwind の哲学を理解し、正しいDRY原則を学びましょう!
kotek
July 04, 2025
Tweet
Share
Other Decks in Technology
See All in Technology
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
470
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
SRE Enabling戦記 - 急成長する組織にSREを浸透させる戦いの歴史
markie1009
0
130
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
プロダクト成長を支える開発基盤とスケールに伴う課題
yuu26
4
1.3k
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
190
配列に見る bash と zsh の違い
kazzpapa3
3
160
AWS Network Firewall Proxyを触ってみた
nagisa53
1
240
OpenShiftでllm-dを動かそう!
jpishikawa
0
130
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
今日から始めるAmazon Bedrock AgentCore
har1101
4
410
Greatest Disaster Hits in Web Performance
guaca
0
260
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Bash Introduction
62gerente
615
210k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Designing Experiences People Love
moore
144
24k
WCS-LA-2024
lcolladotor
0
450
Navigating Team Friction
lara
192
16k
We Are The Robots
honzajavorek
0
160
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
Ethics towards AI in product and experience design
skipperchong
2
200
Claude Code のすすめ
schroneko
67
210k
Navigating Weather and Climate Data
rabernat
0
110
Transcript
Tailwind CSSの哲学 なぜ今 Tailwind CSS が流行なのか? Tailwindで学ぶ DDD と DRY原則
Tailwindについて話します Tailwind のコード
そもそもTailwindを使うメリットは? - 見た目を素早く記述できる - 変更が安全 (変更が他の箇所に波及しないため) - 古いコードでも分かりやすい (書き方が一通りのため) -
移植性が高い (構造の宣言と見た目の記述が凝集しているため)
Tailwindのブレークスルーと 広まった背景
Tailwind が登場する以前 構造はHTML、見た目はCSS Tailwind 登場前の関心の分離のベストプラクティス: → HTML と CSS は別のファイルに記述
Tailwind CSSが広まった背景 ドメイン駆動設計 (DDD) と強く結びつくプラクティスを 持つ React が登場
ドメイン駆動設計 (DDD) とは? ドメイン: 取り組んでいるビジネス領域のこと ドメイン駆動設計: ビジネス領域の世界とソフトウェアの設計を対応させ、ビジネス領域の拡大をそのまま ソフトウェアに適用できるように設計する開発手法
Reactのドメイン分割の例: features ディレクトリ src/ ├── features/ │ ├── catalog/ #
商品カタログ │ │ ├── components/ │ │ │ └── Catalog.tsx │ │ └── hooks/ │ ├── order/ # 注文管理 │ │ ├── components/ │ │ │ └── OrderPage.tsx │ │ └── hooks/ │ └── account/ # 顧客アカウント │ ├── components/ │ │ └── UserList.tsx │ └── hooks/ └── lib/ # 共有ライブラリ 商品カタログのコンテクスト に関心のある部分 注文管理のコンテクストに関 心のある部分 顧客アカウントのコンテクスト に関心のある部分 DDDについては 「同じ関心を持つものをまとめる」 という認識でとりあえずOK
ドメインで分けられていなかった場合 src/ ├── components/ # (種類) 全てのUIコンポーネントを集約 │ ├── catalog/
│ │ └── Catalog.tsx │ ├── order/ │ │ └── OrderPage.tsx │ └── account/ │ └── UserList.tsx │ ├── hooks/ # (種類) 全てのカスタムフックを集約 │ ├── useProductSearch.ts # 商品カタログ関連のフック │ ├── useOrderPlacement.ts # 注文管理関連のフック │ └── useAuthentication.ts # 顧客アカウント関連のフック │ └── lib/ # (共有) プロジェクト全体で使う共通ライブラリ ファイルの種類ごとに分けるパターン (アーキテクチャによっては現役)
Tailwind CSSが広まった背景 ドメイン駆動設計 (DDD) と強く結びつくプラクティスを 持つ React が登場
ノーマルCSS と React の悪い相性 ノーマルCSS では、同じページの構造と見た目が HTML と CSS の2つのファイルに書かれる。
同じ関心をもつ2つのリソースが 低凝集 となっており、DDD のプラクティスに反する。
Tailwindが起こしたブレイクスルー 同じ関心をもつ構造と見た目がまとまって 凝集度UP 見た目をコンポーネント (構造) に直接書く Reactなどがコンポーネントを関心の境界で分割する
ちなみに - 「構造はHTML、見た目はCSS」 の原則をやぶるTailwind を好まない開発者は多い - Tailwind がここまで流行っているのは、Vercel (Next.js の開発元)
が Tailwind をデファクトスタンダードとして推 し進めてるのも大きい
Tailwind と DRY原則
DRY原則とは? Don’t Repeat Yourself 同じコードの繰り返しは避けろ、という意味
Tailwind の哲学 Utility-First Utility とは、w-8, flex, font-bold といった、 Tailwind の中核をなす
小さなクラス のこと → 小さなutilityクラスをまず使おう!という意味
Tailwind あるある 共通化したい!
重複を無くすオススメの方法 by 公式ドキュメント 1. マルチカーソルを使え! 2. 繰り返し (list.map() など) を使え!
3. コンポーネント単位で共通化しろ! いずれもTailwind自体 の機能ではない…?
Tailwind の提供する @apply 機能 スタイルを共通化する方法として @apply などはある しかし、公式ドキュメントでは使用は推奨されていない
実は… 理由 Tailwind ではある程度の重複は許容される! 安易な共通化には 罠 があるため。
つまり この程度の重複はこ のままでOK!
Utility-First と DRY原則の矛盾 Tailwindでは、HTML内でのスタイルの繰り返しは必ずしも悪 ではない 真の悪は、 安易な共通化 によって、 異なるコンテクスト内の似ているスタイルが共通化されてしまう ことである。
ショートストーリー: 「その共通化、早すぎない?」 ある日、新人のタロウ君がチームに入ってきました。 タロウ君 「あれ?この 『商品購入ボタン』 と 『友達招待ボタン』 って、全 く同じデザインじゃないですか!共通化しましょう!」
そこで、タロウ君は CommonButton コンポーネントを作って 共通化しました。
タロウ君の作った CommonButton コンポーネント
1ヶ月後: 「購入ボタンだけローディング状態を表示したい」 → if (type === 'purchase') { ... }
しかし、時は流れて… 2ヶ月後: 「招待ボタンだけアイコンを付けたい」 → if (type === 'invite') { ... } 3ヶ月後: 「購入ボタンは在庫切れ時にグレーアウトしたい」 → if (type === 'purchase' && isOutOfStock) { ... }
結果… CommonButton コン ポーネントは大量の責任を 抱え込み、データの流れも 追えない YOU DIED 最終的に保守不能なコード へ…
何がまずかったのか? ⚠ 一番始めから間違っていた! あれ?この 『商品購入ボタン』 と 『友達招待ボタン』 って、全 く同じデザインじゃないですか!共通化しましょう! 商品購入・友達招待という、
異なるコンテクスト のUIを性急にも共通化してしまったこと が間違い
そもそも DRY原則 1. 同じコードを繰り返し書くのが面倒になったときに そもそも DRY原則は、 消極的に、心の片隅に置いておけばよい 2. 対象が確かに同じコンテクストに存在し、対象が未来永劫かつ本 質的に同じ関心をもつことを確認してから
3. 共通化しよう!
Tailwind で繰り返しが許容されるもう一つの理由 理由: React、Vue のようなコンポーネントベースのUIシステム の登場 スタイル単位で共通化しなくても、コンポ―ネント単位で共通化 すればよい! コンポーネント単位で共通化できない場合は、そもそもコンテ クストが違うので、スタイルを共通化するべきではない
現在のTailwind Tailwind の哲学は、Tailwind v3 までの公式ドキュメントに は記載が充実しているが、 Tailwind v4 の公式ドキュメントではそうした思想に関する記 述がすっかり消えてしまっている。
これからはスタイルの共通化も含めて、様々な書き方を許容して いくという姿勢なのかもしれない
資料 Tailwind v3 公式ドキュメント (https://v3.tailwindcss.com/docs/installation) Tailwind v4 公式ドキュメント (https://tailwindcss.com/docs/installation)
ご清聴ありがとうございました!
再利用性における CSS vs Tailwind CSS class にスタイルがまとまっている ため再利用性が高い! ノーマル CSS
構造にスタイルが直書きされている ので再利用性が低い… Tailwind CSS → 再利用性の高いノーマルCSSの方が DRY原則にかなって いる?
@apply はなぜ非推奨なのか? 複数のutilityクラスをまとめて再利用する@apply機能 → Utility-First に反し、使いすぎによって結局ノーマル CSSへ戻ってしまうため、限定的な使用が推奨されている