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
CSS設計全盛期に学ぶフロントエンド設計
Search
Takepepe
September 27, 2019
Technology
20
13k
CSS設計全盛期に学ぶフロントエンド設計
FROKAN x UIT #1 登壇資料
Takepepe
September 27, 2019
Tweet
Share
More Decks by Takepepe
See All by Takepepe
ServerAction で Progressive Enhancement はどこまで頑張れるか? / progressive-enhancement-with-server-action
takefumiyoshii
7
910
App Router への移行は「改善」となり得るのか?/ Can migration to App Router be an improvement
takefumiyoshii
8
3.2k
フロントエンドの書くべきだったテスト、書かなくてよかったテスト
takefumiyoshii
39
15k
Webフロントエンドのための実践「テスト」手法 CodeZine Night #1
takefumiyoshii
24
8.5k
Next.js でリアーキテクトした話 / story-of-re-architect-with-nextjs
takefumiyoshii
12
8.7k
より速い WEB を目指す Next.js / nextjs-make-the-web-faster
takefumiyoshii
54
20k
フロントエンドの複雑さに耐えるため実践したこと / readyfor-nextjs-first
takefumiyoshii
25
11k
Redux の利点を振り返る
takefumiyoshii
26
8.7k
Type-only Migrate by AST
takefumiyoshii
1
650
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
270
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
160
Work as an App Engineer
lycorp_recruit_jp
0
360
メンタル面でもつよつよエンジニアになる/登壇資料(井田 献一朗)
hacobu
0
120
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
190
クレカ・銀行連携機能における “状態”との向き合い方 / SmartBank Engineer LT Event
smartbank
2
100
組み込みアプリパフォーマンス格闘記 検索画面編
wataruhigasi
1
140
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
140
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
180
Server-Side Engineer of LINE Sukimani
lycorp_recruit_jp
0
360
3年でバックエンドエンジニアが5倍に増えても破綻しなかったアーキテクチャ そして、これから / Software architecture that scales even with a 5x increase in backend engineers in 3 years
euglena1215
9
3.6k
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
280
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
A Philosophy of Restraint
colly
203
16k
Code Reviewing Like a Champion
maltzj
521
39k
Scaling GitHub
holman
459
140k
Producing Creativity
orderedlist
PRO
342
39k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
GraphQLとの向き合い方2022年版
quramy
44
13k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Done Done
chrislema
182
16k
What's in a price? How to price your products and services
michaelherold
244
12k
Transcript
CSS設計全盛期に学ぶフロントエンド設計 FROKAN x UIT #1 @Takepepe
About Me ▪ Takefumi Yoshii / @Takepepe ▪ DeNA /
DeSC Healthcare ▪ Frontend Engineer ▪ TypeScript Meetup JP member
▪ コンポーネント設計に悩んでいる方 ▪ まだまだ現場でCSS設計が必要な方 ▪ CSS設計 + VDOMライブラリ折衷設計をしたい方 ▪ CSS設計を全く知らない・興味がない方
本日の対象聴講者 あらかじめお断り:CSS設計がオワコンという話では絶対ありません
もう不要?CSS設計
CSS設計をご存知でしょうか? CSS設計といえば、秩序をもたらすものとして、 今もなお現場で活用されているノウハウです。 もう不要?CSS設計 CSS設計を思い出す
メジャーなCSS設計はつぎの様なものがありました。 いずれも、それぞれ解決した課題がやや異なります。 MCSS SMACSS ITCSS BEM FLOCSS OOCSS もう不要?CSS設計 CSS設計を思い出す
複数のCSS設計の良いとこどりをした独自設計も、 多くの現場で採用されていたと聞きます。 MCSS SMACSS ITCSS BEM FLOCSS OOCSS もう不要?CSS設計 CSS設計を思い出す
CSS設計を知らず「Scoped CSS ネイティブ」としてフロン トエンド開発に参入される方も多い現在。CSS設計に関 する話題は減りました。 もう不要?CSS設計 Scoped CSS ネイティブな現在
しなしながらCSS設計には、 現在にも通じるコンポーネント設計の ノウハウが凝縮されていたことは、 あまり語られていません。 もう不要?CSS設計 Scoped CSS ネイティブな現在
「CSS設計全盛期・最新のソリューション」を 比較すると「設計の本質は変わっていない」 ということを、本日主張していきたいと思います。 もう不要?CSS設計 Scoped CSS ネイティブな現在
線を引く技術
これより紹介する「4つのCSS設計」 それぞれが解決した課題は、 どんな設計にも共通する本質を突いています。 線を引く技術 メジャーなCSS設計
線を引く技術 名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS)
名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術
Modifier Element Block 名前空間の担保(BEM) 線を引く技術 CSS設計でまず一番気にかけなければならないのは、 名前空間の担保です。とても冗長な命名規則は 初めは「正直キモイ」と私も思いました。 <div class="p-namespace__element--blue"></div>
競合しない名前空間(Block)で「線引き」することにより、 外部から影響を受けない、安全性を担保しました。 (BEM は Block、Element、Modifierの略) Modifier Element Block 線を引く技術 名前空間の担保(BEM)
<div class="p-namespace__element--blue"></div>
プライベートな名前空間に指定が閉じられるので、 外部に影響をおよぼす憂慮なく、 コンポーネントスタイルを書くことができます。 Modifier Element Block 線を引く技術 名前空間の担保(BEM) <div class="p-namespace__element--blue"></div>
最新のソリューションによる Scoped CSS の再現は、 モジュールバンドラーのハッシュ値付与により、 この名前空間を管理しているにすぎません。 線を引く技術 名前空間の担保(BEM) <div class="namespace-sc-1ph8hpw-0
gljtvd"></div> Modifier Element Block
話が少しそれますが、Redux・Vuex などの状態管理ライブラリでも、 名前空間で影響範囲が閉じられています。 冗長な命名は、グロバールスコープにおける設計の基礎です。 線を引く技術 名前空間の担保(BEM) <div class="namespace-sc-1ph8hpw-0 gljtvd"></div> Modifier
Element Block
名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術
SMACSSでは、CSSのルールを 次の5つのカテゴリに分類しています。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)
コンポーネント粒度に応じた「線引き」がなされました。 Layout の分離は、マルチデバイス対応に効果的でした。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)
コンポーネントは、親要素・子要素の存在を知りません。 レイアウトの責務が明瞭に分断されました。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)
特筆すべきなのは、BEM では許容していなかった 外部からの依存性注入です。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)
(.is-)プレフィクスによる状態管理とテーマの注入で、 BEMよりも柔軟な指定を許容しました。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)
Theme Provider / Container Component で 依存性を注入する、最新のソリューションとも似ています。 Module Layout Base
Theme State 線を引く技術 依存性の注入(SMACSS)
名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術
SMACSS より多くの線をもつ、FLOCSS。 関心(コンテキスト)の「線引き」がなされました。 Layout Foundation Utility Project Component 線を引く技術 関心の分離(FLOCSS)
大分類「Object」に含まれる「Component / Project / Utility」は 関心範囲の広さで区分されています。 Layout Foundation 線を引く技術 関心の分離(FLOCSS)
Utility Project Component
「Project」に定義された指定は、プロダクトの成長に伴い 関心範囲が広がることがあります。 Layout Foundation 線を引く技術 関心の分離(FLOCSS) Utility Project Component
繰り返される指定は、汎用的なものとして線引きされ、 関心範囲の広い方へと移行します。 Layout Foundation 線を引く技術 関心の分離(FLOCSS) Utility Project Component
CSSプリプロセッサが支えた関心範囲の移行。 最新のソリューションでは Module システムが移行を支えます。 Foundation Utility Project Component Layout 線を引く技術
関心の分離(FLOCSS)
名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術
最も後発の ITCSS は、 最も「線引き」が多いCSS設計です。 Settings Trumps Components Objects Tools Generic
Base 線を引く技術 責務の線引き(ITCSS)
このぐらいの線の量になると、 プロダクトによっては過剰、といえるレベルです。 Settings Trumps Components Objects Tools Generic Base 線を引く技術
責務の線引き(ITCSS)
このCSS設計は最後の課題である セレクター詳細度の管理を解決しました。 Settings Trumps Components Objects Tools Generic Base 線を引く技術
責務の線引き(ITCSS)
CSSプリプロセッサ を利用することが前提であり、 変数・mixin・function のみが定義されたレイヤーがあります。 Settings Trumps Components Objects Tools Generic
Base 線を引く技術 責務の線引き(ITCSS)
これは最新のソリューションでいうユーテリティ関数です。 責務の線引きが色濃く現れた設計といえます。 Settings Trumps Components Objects Tools Generic Base 線を引く技術
責務の線引き(ITCSS)
名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 4つのCSS設計が引いた線を確認しました。 線を引く技術
受け継がれるソリューション
名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き
(Module System) 最新のソリューションと比較すると、本質は変わっていません 線を引く技術 受け継がれるソリューション
設計の基本となるのは 「線を引く技術」です。 線を引く技術
線の数はプロダクト毎に異なり、 成長過程で「増減」します。 線を引く技術
各設計が示した「線引き」を参考にしつつ プロダクト毎に判断が必要です。 線を引く技術
「規約」で線を引いていたCSS設計は、 JavaScript Module システムに移管することに。 線を引く技術
線を引き直す技術
最新のソリューションがもたらした、 CSS設計全盛期に叶わなかった課題解決は何でしょうか? VDOM ライブラリが救ったのは、 jQuery による混沌とした実装だけではありません。 線を引き直す技術 VDOM ライブラリの福音
ある機能追加を境目に、 特定範囲だけの関心ごとであった指定が、 広範囲に広がる事案が発生します。 「リファクタリング」です。 線を引き直す技術 VDOM ライブラリの福音
CSS設計により引かれた線は リファクタリングを容易にしました。 ただ、設計規約だけでは事故を防げず、 大量の browser e2e テストによる 担保が余儀なくされました。 線を引き直す技術 VDOM
ライブラリの福音
VDOMライブラリがもたらした福音は、 単体テストの優位性です。 Unit Test をはじめ、 Visual Regression Testing まで、 必要なものを選べる時代です。
線を引き直す技術 VDOM ライブラリの福音
さらに、TypeScript による型安全で テストの守備範囲が大幅に削減。 リファクタリングがし易い足場が 整ってきました。 線を引き直す技術 VDOM ライブラリの福音
あらためてCSS設計が担っていたことを確認します。 線を引き直す技術 VDOM ライブラリの福音 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection)
関心の分離 (Atomic Design) 責務の線引き (Module System)
コンテキストの拡大・責務の委譲という「境界線」は CSS設計全盛期に見出されていました。 線を引き直す技術 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離
(Atomic Design) 責務の線引き (Module System) VDOM ライブラリの福音
「線を引き・引き直す」ことを繰り返すことで、 そのときの最適な設計を導くことができます。 線を引き直す技術 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離
(Atomic Design) 責務の線引き (Module System) VDOM ライブラリの福音
現在のフロンエンド開発現場は、エコシステムの拡充により、 圧倒的なリファクタリング優位性を手に入れました。 線を引き直す技術 VDOM ライブラリの福音 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency
Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System)
線を引き直す技術 設計で最も重要なのは 「線を引き直す技術」です。
CSS設計全盛期に確立されなかった 「線を引き直す技術」は、 エコシステムの拡充により進化しました。 線を引き直す技術
プロダクトと向き合う設計
結合度が低く・粒度が小さいほど、 リファクタリングはしやすくなります。 「技術面」で可能なことは、ここまでです。 プロダクトと向き合う設計 壁を壊すディレクション
「継続的リファクタリングが設計の解」としても、 リファクタリングを阻む要因は「技術面」以外に。 BIZ都合であったり、 人員リソース都合であったり… 残されたリファクタリングの障壁 プロダクトと向き合う設計
リファクタリングを行いリリースに至るためには、 QAが必要になることもあるでしょう。 そのため、リファクタリング意義を言語化し チームで共有しなければいけません。 壁を壊すコミュニケーション プロダクトと向き合う設計
技術的に良い設計であっても、言語化することで、 不要なリファクタリングであることに 気がつくかもしれません。 外部要因も、設計の一部です。 壁を壊すコミュニケーション プロダクトと向き合う設計
新しいソリューションの導入にしても、 作り変えにしても、常日頃からその必要性を訴え 実現可能なタイミングを狙っていきましょう。 機会は与えられるものではなく作るものです。 壁を壊すディレクション プロダクトと向き合う設計
まとめ
コンポーネント設計に悩んでいる方へ まとめ コンポーネントの粒度がまちまちなのは結構なことです。 境界線を見つけた時にリファクタリングしましょう。 はじめから汎用化するのは、 オーバーエンジニアリングかもしれません。
まだまだ現場でCSS設計が必要な方へ まとめ jQuery + CSS設計でも設計の本質を見抜いていれば、 きちんとした設計は可能だと思います。 JavaScript Module System に頼れない分不利ですが、
そのぶん設計力が試されます。頑張ってください。
CSS設計 + VDOMライブラリ折衷設計をしたい方へ まとめ Scoped CSS と CSS設計が折衷になると厄介かもしれません。 思い切って「より枯れている」CSS設計のみで 実現可能か検討してみてください(Scoped
CSS だけ使わない) コンポーネント指向とCSS設計はとても相性が良いです。
CSS設計を全く知らない・興味がない方へ まとめ CSS設計が CSS のためだけではなかったことが お分かり頂けたかと思います(そもそも呼称が悪い)。 CSS設計に後戻りすることはこの先ないでしょうが、 設計に悩んだ時、今日の話が役に立つかもしれません。
設計をこれから担当する皆さんへ まとめ 基本的に最新のソリューションを選びましょう。 もしそれが叶わないのなら、CSS設計全盛期を思い出しましょう。 今後訪れるフレームワーク移管は、 線引きがしっかりされていれば、乗り越えられると思います。
設計をこれから担当する皆さんへ まとめ 設計は技術要因だけでは成り立ちません。 議論を重ね・プロダクトの現状と向き合い、 各々の最適解を見つけましょう。
議論に根をおろし…
Slackと共に生きよう…
CIと共にリリースを越え…
型と共にリファクタをうたおう
ご静聴ありがとうございました