Slide 1

Slide 1 text

CSS設計全盛期に学ぶフロントエンド設計 FROKAN x UIT #1 @Takepepe

Slide 2

Slide 2 text

About Me ■ Takefumi Yoshii / @Takepepe ■ DeNA / DeSC Healthcare ■ Frontend Engineer ■ TypeScript Meetup JP member

Slide 3

Slide 3 text

■ コンポーネント設計に悩んでいる方 ■ まだまだ現場でCSS設計が必要な方 ■ CSS設計 + VDOMライブラリ折衷設計をしたい方 ■ CSS設計を全く知らない・興味がない方 本日の対象聴講者 あらかじめお断り:CSS設計がオワコンという話では絶対ありません

Slide 4

Slide 4 text

もう不要?CSS設計

Slide 5

Slide 5 text

CSS設計をご存知でしょうか? CSS設計といえば、秩序をもたらすものとして、 今もなお現場で活用されているノウハウです。 もう不要?CSS設計 CSS設計を思い出す

Slide 6

Slide 6 text

メジャーなCSS設計はつぎの様なものがありました。 いずれも、それぞれ解決した課題がやや異なります。 MCSS SMACSS ITCSS BEM FLOCSS OOCSS もう不要?CSS設計 CSS設計を思い出す

Slide 7

Slide 7 text

複数のCSS設計の良いとこどりをした独自設計も、 多くの現場で採用されていたと聞きます。 MCSS SMACSS ITCSS BEM FLOCSS OOCSS もう不要?CSS設計 CSS設計を思い出す

Slide 8

Slide 8 text

CSS設計を知らず「Scoped CSS ネイティブ」としてフロン トエンド開発に参入される方も多い現在。CSS設計に関 する話題は減りました。 もう不要?CSS設計 Scoped CSS ネイティブな現在

Slide 9

Slide 9 text

しなしながらCSS設計には、 現在にも通じるコンポーネント設計の ノウハウが凝縮されていたことは、 あまり語られていません。 もう不要?CSS設計 Scoped CSS ネイティブな現在

Slide 10

Slide 10 text

「CSS設計全盛期・最新のソリューション」を 比較すると「設計の本質は変わっていない」 ということを、本日主張していきたいと思います。 もう不要?CSS設計 Scoped CSS ネイティブな現在

Slide 11

Slide 11 text

線を引く技術

Slide 12

Slide 12 text

これより紹介する「4つのCSS設計」 それぞれが解決した課題は、 どんな設計にも共通する本質を突いています。 線を引く技術 メジャーなCSS設計

Slide 13

Slide 13 text

線を引く技術 名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS)

Slide 14

Slide 14 text

名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術

Slide 15

Slide 15 text

Modifier Element Block 名前空間の担保(BEM) 線を引く技術 CSS設計でまず一番気にかけなければならないのは、 名前空間の担保です。とても冗長な命名規則は 初めは「正直キモイ」と私も思いました。

Slide 16

Slide 16 text

競合しない名前空間(Block)で「線引き」することにより、 外部から影響を受けない、安全性を担保しました。 (BEM は Block、Element、Modifierの略) Modifier Element Block 線を引く技術 名前空間の担保(BEM)

Slide 17

Slide 17 text

プライベートな名前空間に指定が閉じられるので、 外部に影響をおよぼす憂慮なく、 コンポーネントスタイルを書くことができます。 Modifier Element Block 線を引く技術 名前空間の担保(BEM)

Slide 18

Slide 18 text

最新のソリューションによる Scoped CSS の再現は、 モジュールバンドラーのハッシュ値付与により、 この名前空間を管理しているにすぎません。 線を引く技術 名前空間の担保(BEM)
Modifier Element Block

Slide 19

Slide 19 text

話が少しそれますが、Redux・Vuex などの状態管理ライブラリでも、 名前空間で影響範囲が閉じられています。 冗長な命名は、グロバールスコープにおける設計の基礎です。 線を引く技術 名前空間の担保(BEM)
Modifier Element Block

Slide 20

Slide 20 text

名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術

Slide 21

Slide 21 text

SMACSSでは、CSSのルールを 次の5つのカテゴリに分類しています。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 22

Slide 22 text

コンポーネント粒度に応じた「線引き」がなされました。 Layout の分離は、マルチデバイス対応に効果的でした。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 23

Slide 23 text

コンポーネントは、親要素・子要素の存在を知りません。 レイアウトの責務が明瞭に分断されました。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 24

Slide 24 text

特筆すべきなのは、BEM では許容していなかった 外部からの依存性注入です。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 25

Slide 25 text

(.is-)プレフィクスによる状態管理とテーマの注入で、 BEMよりも柔軟な指定を許容しました。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 26

Slide 26 text

Theme Provider / Container Component で 依存性を注入する、最新のソリューションとも似ています。 Module Layout Base Theme State 線を引く技術 依存性の注入(SMACSS)

Slide 27

Slide 27 text

名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術

Slide 28

Slide 28 text

SMACSS より多くの線をもつ、FLOCSS。 関心(コンテキスト)の「線引き」がなされました。 Layout Foundation Utility Project Component 線を引く技術 関心の分離(FLOCSS)

Slide 29

Slide 29 text

大分類「Object」に含まれる「Component / Project / Utility」は 関心範囲の広さで区分されています。 Layout Foundation 線を引く技術 関心の分離(FLOCSS) Utility Project Component

Slide 30

Slide 30 text

「Project」に定義された指定は、プロダクトの成長に伴い 関心範囲が広がることがあります。 Layout Foundation 線を引く技術 関心の分離(FLOCSS) Utility Project Component

Slide 31

Slide 31 text

繰り返される指定は、汎用的なものとして線引きされ、 関心範囲の広い方へと移行します。 Layout Foundation 線を引く技術 関心の分離(FLOCSS) Utility Project Component

Slide 32

Slide 32 text

CSSプリプロセッサが支えた関心範囲の移行。 最新のソリューションでは Module システムが移行を支えます。 Foundation Utility Project Component Layout 線を引く技術 関心の分離(FLOCSS)

Slide 33

Slide 33 text

名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 線を引く技術

Slide 34

Slide 34 text

最も後発の ITCSS は、 最も「線引き」が多いCSS設計です。 Settings Trumps Components Objects Tools Generic Base 線を引く技術 責務の線引き(ITCSS)

Slide 35

Slide 35 text

このぐらいの線の量になると、 プロダクトによっては過剰、といえるレベルです。 Settings Trumps Components Objects Tools Generic Base 線を引く技術 責務の線引き(ITCSS)

Slide 36

Slide 36 text

このCSS設計は最後の課題である セレクター詳細度の管理を解決しました。 Settings Trumps Components Objects Tools Generic Base 線を引く技術 責務の線引き(ITCSS)

Slide 37

Slide 37 text

CSSプリプロセッサ を利用することが前提であり、 変数・mixin・function のみが定義されたレイヤーがあります。 Settings Trumps Components Objects Tools Generic Base 線を引く技術 責務の線引き(ITCSS)

Slide 38

Slide 38 text

これは最新のソリューションでいうユーテリティ関数です。 責務の線引きが色濃く現れた設計といえます。 Settings Trumps Components Objects Tools Generic Base 線を引く技術 責務の線引き(ITCSS)

Slide 39

Slide 39 text

名前空間の担保 (BEM) 依存性の注入 (SMACSS) 関心の分離 (FLOCSS) 責務の線引き (ITCSS) 4つのCSS設計が引いた線を確認しました。 線を引く技術 受け継がれるソリューション

Slide 40

Slide 40 text

名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System) 最新のソリューションと比較すると、本質は変わっていません 線を引く技術 受け継がれるソリューション

Slide 41

Slide 41 text

設計の基本となるのは 「線を引く技術」です。 線を引く技術

Slide 42

Slide 42 text

線の数はプロダクト毎に異なり、 成長過程で「増減」します。 線を引く技術

Slide 43

Slide 43 text

各設計が示した「線引き」を参考にしつつ プロダクト毎に判断が必要です。 線を引く技術

Slide 44

Slide 44 text

「規約」で線を引いていたCSS設計は、 JavaScript Module システムに移管することに。 線を引く技術

Slide 45

Slide 45 text

線を引き直す技術

Slide 46

Slide 46 text

最新のソリューションがもたらした、 CSS設計全盛期に叶わなかった課題解決は何でしょうか? VDOM ライブラリが救ったのは、 jQuery による混沌とした実装だけではありません。 線を引き直す技術 VDOM ライブラリの福音

Slide 47

Slide 47 text

ある機能追加を境目に、 特定範囲だけの関心ごとであった指定が、 広範囲に広がる事案が発生します。 「リファクタリング」です。 線を引き直す技術 VDOM ライブラリの福音

Slide 48

Slide 48 text

CSS設計により引かれた線は リファクタリングを容易にしました。 ただ、設計規約だけでは事故を防げず、 大量の browser e2e テストによる 担保が余儀なくされました。 線を引き直す技術 VDOM ライブラリの福音

Slide 49

Slide 49 text

VDOMライブラリがもたらした福音は、 単体テストの優位性です。 Unit Test をはじめ、 Visual Regression Testing まで、 必要なものを選べる時代です。 線を引き直す技術 VDOM ライブラリの福音

Slide 50

Slide 50 text

さらに、TypeScript による型安全で テストの守備範囲が大幅に削減。 リファクタリングがし易い足場が 整ってきました。 線を引き直す技術 VDOM ライブラリの福音

Slide 51

Slide 51 text

あらためてCSS設計が担っていたことを確認します。 線を引き直す技術 VDOM ライブラリの福音 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System)

Slide 52

Slide 52 text

コンテキストの拡大・責務の委譲という「境界線」は CSS設計全盛期に見出されていました。 線を引き直す技術 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System) VDOM ライブラリの福音

Slide 53

Slide 53 text

「線を引き・引き直す」ことを繰り返すことで、 そのときの最適な設計を導くことができます。 線を引き直す技術 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System) VDOM ライブラリの福音

Slide 54

Slide 54 text

現在のフロンエンド開発現場は、エコシステムの拡充により、 圧倒的なリファクタリング優位性を手に入れました。 線を引き直す技術 VDOM ライブラリの福音 名前空間の担保 (Scoped CSS) 依存性の注入 (Dependency Injection) 関心の分離 (Atomic Design) 責務の線引き (Module System)

Slide 55

Slide 55 text

線を引き直す技術 設計で最も重要なのは 「線を引き直す技術」です。

Slide 56

Slide 56 text

CSS設計全盛期に確立されなかった 「線を引き直す技術」は、 エコシステムの拡充により進化しました。 線を引き直す技術

Slide 57

Slide 57 text

プロダクトと向き合う設計

Slide 58

Slide 58 text

結合度が低く・粒度が小さいほど、 リファクタリングはしやすくなります。 「技術面」で可能なことは、ここまでです。 プロダクトと向き合う設計 壁を壊すディレクション

Slide 59

Slide 59 text

「継続的リファクタリングが設計の解」としても、 リファクタリングを阻む要因は「技術面」以外に。 BIZ都合であったり、 人員リソース都合であったり… 残されたリファクタリングの障壁 プロダクトと向き合う設計

Slide 60

Slide 60 text

リファクタリングを行いリリースに至るためには、 QAが必要になることもあるでしょう。 そのため、リファクタリング意義を言語化し チームで共有しなければいけません。 壁を壊すコミュニケーション プロダクトと向き合う設計

Slide 61

Slide 61 text

技術的に良い設計であっても、言語化することで、 不要なリファクタリングであることに 気がつくかもしれません。 外部要因も、設計の一部です。 壁を壊すコミュニケーション プロダクトと向き合う設計

Slide 62

Slide 62 text

新しいソリューションの導入にしても、 作り変えにしても、常日頃からその必要性を訴え 実現可能なタイミングを狙っていきましょう。 機会は与えられるものではなく作るものです。 壁を壊すディレクション プロダクトと向き合う設計

Slide 63

Slide 63 text

まとめ

Slide 64

Slide 64 text

コンポーネント設計に悩んでいる方へ まとめ コンポーネントの粒度がまちまちなのは結構なことです。 境界線を見つけた時にリファクタリングしましょう。 はじめから汎用化するのは、 オーバーエンジニアリングかもしれません。

Slide 65

Slide 65 text

まだまだ現場でCSS設計が必要な方へ まとめ jQuery + CSS設計でも設計の本質を見抜いていれば、 きちんとした設計は可能だと思います。 JavaScript Module System に頼れない分不利ですが、 そのぶん設計力が試されます。頑張ってください。

Slide 66

Slide 66 text

CSS設計 + VDOMライブラリ折衷設計をしたい方へ まとめ Scoped CSS と CSS設計が折衷になると厄介かもしれません。 思い切って「より枯れている」CSS設計のみで 実現可能か検討してみてください(Scoped CSS だけ使わない) コンポーネント指向とCSS設計はとても相性が良いです。

Slide 67

Slide 67 text

CSS設計を全く知らない・興味がない方へ まとめ CSS設計が CSS のためだけではなかったことが お分かり頂けたかと思います(そもそも呼称が悪い)。 CSS設計に後戻りすることはこの先ないでしょうが、 設計に悩んだ時、今日の話が役に立つかもしれません。

Slide 68

Slide 68 text

設計をこれから担当する皆さんへ まとめ 基本的に最新のソリューションを選びましょう。 もしそれが叶わないのなら、CSS設計全盛期を思い出しましょう。 今後訪れるフレームワーク移管は、 線引きがしっかりされていれば、乗り越えられると思います。

Slide 69

Slide 69 text

設計をこれから担当する皆さんへ まとめ 設計は技術要因だけでは成り立ちません。 議論を重ね・プロダクトの現状と向き合い、 各々の最適解を見つけましょう。

Slide 70

Slide 70 text

議論に根をおろし…

Slide 71

Slide 71 text

Slackと共に生きよう…

Slide 72

Slide 72 text

CIと共にリリースを越え…

Slide 73

Slide 73 text

型と共にリファクタをうたおう

Slide 74

Slide 74 text

ご静聴ありがとうございました