Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Kuma UI が提唱する Hybrid Approach CSS-in-JS の仕組み @yukukotani 2023/12/13 - Nihonbashi.js #8
Slide 2
Slide 2 text
小谷 優空 - @yukukotani ・Software Engineer @ Ubie, Inc. (2019/05~) ・Head of System Platform ・Maintainer of Kuma UI ・Student @ Univ. Tsukuba (2019/04~) ・情報科学類 自己紹介
Slide 3
Slide 3 text
Kuma UI?
Slide 4
Slide 4 text
Kuma UI とは ・和製の CSS-in-JS ライブラリ ・ という手法によるパフォーマンス最適化を売りにしている Hybrid Approach
Slide 5
Slide 5 text
Hybrid Approach?
Slide 6
Slide 6 text
Hybrid Approach とは EmotionやChakra UIのような を完全に保ちながら、 できる限り に変換する ランタイムCSS-in-JSの書き味 ゼロランタイム
Slide 7
Slide 7 text
Hybrid Approach とは ・Linariaなど、従来のゼロランタイムCSS-in-JSでは 動的なスタイルの扱いに制限がある ・Kuma UI ではそういった制限がない
Slide 8
Slide 8 text
Kuma UI をみてみよう
Slide 9
Slide 9 text
Kuma UI をみてみよう Dynamic! Runtime! Static! ZeroRuntime!
Slide 10
Slide 10 text
Hybrid Approach の仕組み 変換の過程を見ていく
Slide 11
Slide 11 text
Hybrid Approach の仕組み ビルド時 静的なスタイル にts-morph で TypeScript AST を探索 まずは を探す
Slide 12
Slide 12 text
Hybrid Approach の仕組み 静的なスタイル
Slide 13
Slide 13 text
Hybrid Approach の仕組み 静的なスタイル ブラウザで実行しなくても値がわかるスタイル
Slide 14
Slide 14 text
Hybrid Approach の仕組み Static! ZeroRuntime!
Slide 15
Slide 15 text
Hybrid Approach の仕組み Static! ZeroRuntime! Why static ?
Slide 16
Slide 16 text
Hybrid Approach の仕組み 値がただの文字列リテラル
Slide 17
Slide 17 text
Hybrid Approach の仕組み 現在の Kuma UI ではこれらを静的なスタイルとして抽出できる ・文字列や数値などのリテラル ・単純な数値計算
Slide 18
Slide 18 text
Hybrid Approach の仕組み 抽出したスタイルはCSSとして出力される
Slide 19
Slide 19 text
Hybrid Approach の仕組み 抽出できたスタイルのプロパティは削除し、代わりに出力したクラスを参照
Slide 20
Slide 20 text
Hybrid Approach の仕組み 抽出できたスタイルのプロパティは削除し、代わりに出力したクラスを参照 Missing something...?
Slide 21
Slide 21 text
Hybrid Approach の仕組み 生成したCSSをlinkタグやstyleタグで読み込む必要がある このクラスの参照先がない
Slide 22
Slide 22 text
Hybrid Approach の仕組み ts-morphじゃHTMLは触れない。どうしよう・・・
Slide 23
Slide 23 text
Hybrid Approach の仕組み ts-morphじゃHTMLは触れない。どうしよう・・・ CSSの差し込みはバンドラ(Vite/webpack)に委譲!
Slide 24
Slide 24 text
Hybrid Approach の仕組み 生成したCSSをインポートするコードを差し込む
Slide 25
Slide 25 text
Hybrid Approach の仕組み ・ViteやwebpackはCSSをサポートしている ・普通にアプリケーションコードでCSSをインポートするのと同じように 機械的に差し込んだCSSも解決してくれる
Slide 26
Slide 26 text
Hybrid Approach の仕組み ここまでで静的なスタイルは反映できた
Slide 27
Slide 27 text
Hybrid Approach の仕組み ランタイム 動的なスタイル で を計算する
Slide 28
Slide 28 text
Hybrid Approach の仕組み Dynamic! Runtime!
Slide 29
Slide 29 text
Hybrid Approach の仕組み ランタイムでコンポーネントを レンダリングすれば “black” に確定する!
Slide 30
Slide 30 text
Hybrid Approach の仕組み ビルド時と同様にCSSとして出力する
Slide 31
Slide 31 text
Hybrid Approach の仕組み asプロパティを展開 ビルド時と同じように 生成したクラスを参照 ※概念コード
Slide 32
Slide 32 text
Hybrid Approach の仕組み ビルド時と同じようにCSSを差し込むぞ!
Slide 33
Slide 33 text
Hybrid Approach の仕組み ビルド時と同じようにCSSを差し込むぞ! Wait
Slide 34
Slide 34 text
Hybrid Approach の仕組み バンドラはビルド時の処理 もちろんランタイムでは使えない
Slide 35
Slide 35 text
Hybrid Approach の仕組み バンドラはビルド時の処理 もちろんランタイムでは使えない useInsertionEffect でDOM APIを叩いて styleタグを差し込む
Slide 36
Slide 36 text
Hybrid Approach の仕組み useInsertionEffect とは ・React 組み込みの CSS-in-JS のためだけの Hooks ・useEffect とほぼ同じだが、実行タイミングだけが違う ・コンポーネントのレンダリング結果をDOMに反映する前に実行 ・→ チラ付き(FOUC)を回避できる Boxコンポーネントの 実行(レンダリング) useIntersectionEffectで styleタグ差し込み レンダリング結果を 画面(DOM)に反映 useEffectの実行
Slide 37
Slide 37 text
Hybrid Approach の仕組み これで動的なスタイルも反映できた
Slide 38
Slide 38 text
Hybrid Approach イケてるな〜
Slide 39
Slide 39 text
Hybrid Approach イケてるな〜 まだ伸び代だらけ
Slide 40
Slide 40 text
Hybrid Approach のこれから これは静的なスタイル?
Slide 41
Slide 41 text
Hybrid Approach のこれから これは静的なスタイル? →理論的には静的だが、現在のKuma UIではまだ動的扱いでランタイム処理
Slide 42
Slide 42 text
Hybrid Approach のこれから 静的な値をより厳密に検出できるようにする
Slide 43
Slide 43 text
Hybrid Approach のこれから この動的なスタイルは本当にビルド時に抽出できないのだろうか? asプロパティを展開
Slide 44
Slide 44 text
Hybrid Approach のこれから この動的なスタイルは本当にビルド時に抽出できないのだろうか? asプロパティを展開 値は動的だが、colorプロパティがあることはわかる
Slide 45
Slide 45 text
Hybrid Approach のこれから 動的な値はCSS変数にしておくことで、静的なCSSを出力できる
Slide 46
Slide 46 text
Hybrid Approach のこれから CSS変数はインラインのstyle属性で動的に埋め込める
Slide 47
Slide 47 text
Hybrid Approach のこれから 動的なスタイルをランタイムCSSなしで実現する
Slide 48
Slide 48 text
Hybrid Approach のこれから すでに見えている改善施策がたくさん! ・静的な値をより厳密に検出できるようにする ・動的なスタイルをランタイムCSSなしで実現する 当面はEmotion完全互換を目標に
Slide 49
Slide 49 text
No content
Slide 50
Slide 50 text
ありがとうございました! 使ってみてね