CSS-in-JS
'CSS-in-JS'はstyled-componentsから始まるフローで、StylingをJavascript内部で定義します。
styled-component、Emotion、Mantineなどがあります。
利点
- 適用されるスコープが小さい。
- css moduleを使用すると、cssもスコープを減らすことができます
- コンポーネントと同じ場所で定義されます。 (colocation)
- Javascript Variable を使用可能。
欠点
- ランタイムオーバーヘッドがある
- Css in JS libraryファイルをダウンロードする必要があります。
- Emotionは7.9KBです。
- Mantineは134KB!
大きな欠点
- CSSルールを頻繁に入れると、多くの計算作業が発生します。
- Emotion と Css を比較したところ
- Css使用時約50パー程度の性能増加があった。
SSRを書くと、さまざまな問題が発生する
-
Emotionレポが見ると問題が多い。-
実際のパフォーマンス比較
プロダクションで実際に使用するコードを使ってCSS-in-JSとTailwindを比較してパフォーマンスを測定してみた。
セットアップ
CSS-in-JSはMantine(Emotionベース)を使用しています。
- パフォーマンス測定はReact dev toolを使用します。
- 性能測定対象は30 * 5のTable(コンポーネント名:SheetTable)である。
-
画面
実験の進行
ボタンを押すと上記の画面がレンダリングされます。
React Profilerの録画を押してボタンを押して画面のレンダリングを録画します。
- SheetTableのレンダリング時間を測定します。
- 合計5回ずつ実行して平均を求める。
-
CSS-in-JS (Mantine)
-
Tailwind
結果
約36人のレンダリング時間が減少しました。
セルコードひとつ変えたのに性能向上が大きかった。 (もちろんセルがほとんど勝つ)
60Hzモニターで1フレームが16msなのに3frame -> 2frameになったもの-
-
結論
スタティックに生成されるCSSを使用するのはパフォーマンスの面でかなり良いです。
JS変数を使用する必要がない場合は、Tailwindを書きましょう。
(追加)SSRを導入するにはCSS-in-JSを捨てるのが楽だ。
-
Ref
-
[1] https://dev.to/srmagura/why-were-breaking-up-wiht-css-in-js-4g9b-