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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
usermode linux without MMU - fosdem2026 kernel devroom
thehajime
0
240
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
620
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
470
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
1
450
Greatest Disaster Hits in Web Performance
guaca
0
260
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
200
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
470
ランサムウェア対策としてのpnpm導入のススメ
ishikawa_satoru
0
180
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
120
コミュニティが変えるキャリアの地平線:コロナ禍新卒入社のエンジニアがAWSコミュニティで見つけた成長の羅針盤
kentosuzuki
0
120
Claude_CodeでSEOを最適化する_AI_Ops_Community_Vol.2__マーケティングx_AIはここまで進化した.pdf
riku_423
2
590
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
440
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
320
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
910
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
210
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
240
Prompt Engineering for Job Search
mfonobong
0
160
Designing for Performance
lara
610
70k
Amusing Abliteration
ianozsvald
0
100
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へ戻ってしまうため、限定的な使用が推奨されている