Skip to content

Use CSS Modules for Component Styling

Webアプリケーションにおいて、コンポーネントベースの開発を行う際、スタイリングソリューションの選択は開発効率とパフォーマンスに大きな影響を与える。従来のCSS-in-JSライブラリの多くはランタイムでスタイルを生成するため、パフォーマンスオーバーヘッドが発生する課題があった。

また、最新のCSSプロパティ(CSS Grid、Flexbox、カスタムプロパティなど)を活用したモダンなスタイリングを行いたいが、ランタイムライブラリでは対応が遅れる場合がある。

コンポーネントのスタイリングにはCSS Modulesを採用する。

  • 利点:

    • zero-runtime: ビルド時にスタイルが処理されるため、ランタイムオーバーヘッドがない
    • 最新のCSSプロパティをそのまま利用可能
    • スコープ分離により名前衝突を自動的に防止
    • 既存のCSSの知識をそのまま活用できる
    • バンドルサイズが小さい
  • 欠点:

    • 動的なスタイリング(テーマ切り替えなど)の実装が複雑
    • TypeScriptの型安全性がデフォルトでは提供されない
    • ビルド時の設定が必要

選択肢2: CSS-in-JS(styled-componentsやEmotionなど)

Section titled “選択肢2: CSS-in-JS(styled-componentsやEmotionなど)”
  • 利点:

    • JavaScriptの変数やpropsを直接スタイルに反映可能
    • 動的なスタイリングが簡単
    • TypeScriptとの統合が良い
  • 欠点:

    • ランタイムでスタイルを生成するためパフォーマンスオーバーヘッドがある
    • バンドルサイズが大きくなる
    • 最新のCSSプロパティの対応が遅れる場合がある
  • 利点:

    • ユーティリティファーストでクラス名を組み合わせるだけでスタイリング可能
    • 一貫したデザインシステムを構築しやすい
    • パフォーマンスが良い
  • 欠点:

    • 学習コストが高い
    • カスタムスタイルの実装が複雑
    • HTMLクラス名が長くなりがち
    • アプリケーションが大きくなるとCIのビルドタイムが長くなる

この決定による影響を記述する。

  • ポジティブな影響:

    • アプリケーションのパフォーマンスが向上する
    • 最新のCSSプロパティを即座に活用できる
    • 開発者がCSSの標準的な記法を使用できる
    • バンドルサイズの削減
  • ネガティブな影響:

    • 動的なスタイリングの実装コストが増加する
    • TypeScript型定義の追加設定が必要
  • リスク:

    • チーム内でCSS Modulesの使用方法を統一する必要がある
    • ビルド設定の複雑化