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
2
Tailwind の哲学
STAR UP 社内LT会で発表した内容です。
Tailwind の哲学を理解し、正しいDRY原則を学びましょう!
kotek
July 04, 2025
Tweet
Share
Other Decks in Technology
See All in Technology
大規模組織にAIエージェントを迅速に導入するためのセキュリティの勘所 / AI agents for large-scale organizations
i35_267
6
340
LLM開発を支えるエヌビディアの生成AIエコシステム
acceleratedmu3n
0
340
alecthomas/kong はいいぞ
fujiwara3
6
1.2k
Railsの限界を超えろ!「家族アルバム みてね」の画像・動画の大規模アップロードを支えるアーキテクチャの変遷
ojima_h
4
530
Jitera Company Deck / JP
jitera
0
280
AI駆動開発 with MixLeap Study【大阪支部 #3】
lycorptech_jp
PRO
0
270
Vision Language Modelと自動運転AIの最前線_20250730
yuyamaguchi
2
800
手動からの解放!!Strands Agents で実現する総合テスト自動化
ideaws
3
400
増え続ける脆弱性に立ち向かう: 事前対策と優先度づけによる 持続可能な脆弱性管理 / Confronting the Rise of Vulnerabilities: Sustainable Management Through Proactive Measures and Prioritization
nttcom
1
220
「育てる」サーバーレス 〜チーム開発研修で学んだ、小さく始めて大きく拡張するAWS設計〜
yu_kod
1
200
2025-07-25 NOT A HOTEL TECH TALK ━ スマートホーム開発の最前線 ━ SOFTWARE
wakinchan
0
180
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
2.1k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Fireside Chat
paigeccino
37
3.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
GraphQLとの向き合い方2022年版
quramy
49
14k
Why Our Code Smells
bkeepers
PRO
337
57k
What's in a price? How to price your products and services
michaelherold
246
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
How to Ace a Technical Interview
jacobian
278
23k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
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へ戻ってしまうため、限定的な使用が推奨されている