styled-componentsがReactの便利な選択肢であり続ける理由
7年前のReactでのレイアウトがどのようなものだったか、振り返ってみましょう。CSSクラスを分離しようとBEMを試みましたが無駄に終わり、その後CSS Modulesに移行し、そしてstyled-componentsが登場しました。当時はJSファイルに直接スタイルを書くというアイデアは奇妙に思えましたが、JavaScriptのテンプレートリテラルにより、このアプローチはすぐにWeb開発の標準の1つとなりました。
現在ではTailwind CSSやアトミックCSSフレームワークが人気ですが、一方でstyled-componentsのリポジトリはGitHubで41,000以上のスターを獲得し、継続的にアップデートされています。開発者はレイアウトに активно 使用しており、プロジェクトのメンテナーはReact Server Components(RSC)を含む現在のReact機能向けにコードを適応させています。
おなじみのCSSをタグ付きテンプレートに置き換える理由
このライブラリのコンセプトはシンプルです。必要なスタイルをすべて含むReactコンポーネントを作成します。複雑なクラス階層を考える必要もなく、別の場所にあるモーダルのベースボタンスタイルが誤って壊れる心配もありません。
構文はクリーンなCSSのままです。各行の後に引用符やカンマは不要です:
import styled from 'styled-components';
const Button = styled.button`
background: ${props => props.$primary ? "#0070f3" : "#ffffff"};
color: ${props => props.$primary ? "#ffffff" : "#0070f3"};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid #0070f3;
border-radius: 3px;
`;
export default function App() {
return (
<div>
<Button>Обычная кнопка</Button>
<Button $primary>Акцентная кнопка</Button>
</div>
);
}
スタイルはコンポーネントに密結合しています。プロジェクトからButtonを削除すると、そのスタイルも一緒に消えます。未使用のコードが最終ビルドに残ることはありません。
プロパティ、テーマ、動的な外観
CSS-in-JSの強みは、ビジュアルなプレゼンテーションがデータやアプリケーションの状態に直接依存する場合に明らかになります。CSS Modulesでは、classnamesユーティリティを通じてクラスを延々と切り替える必要がありました。ここでは、プロパティが直接スタイルブロックに渡されます。
DOMとの競合なしでのパラメータの受け渡し
上記の例の$primary構文に注目してください。ドル記号はトランジェントプロパティを示します。この方法でマークされた変数はスタイル内部で使用されますが、ライブラリがそれらをフィルタリングして最終的なHTMLタグには渡しません。ブラウザコンソールには不明な属性に関する警告が表示されず、清洁に保たれます。
組み込みのテーマ対応
ライトテーマとダークテーマの操作には、ThemeProviderコンポーネントがあります。これはReact Contextを使用して設定オブジェクトをコンポーネントツリーの下に渡します。
import styled, { ThemeProvider } from 'styled-components';
const theme = {
colors: {
main: '#0070f3',
background: '#f4f4f4',
}
};
const Container = styled.div`
color: ${props => props.theme.colors.main};
background: ${props => props.theme.colors.background};
`;
themeオブジェクトの色を入れ替えると、インターフェースが即座に更新されます。これにより、独自のデザインシステムを構築することが大幅に簡素化されます。
パフォーマンスとサーバーサイドレンダリング
ライブラリは常にどのコンポーネントがページに表示されているかを自動的に追跡し、そのコンポーネントのスタイルのみを読み込みます。ユーザーは余分なコードをダウンロードする必要がありません。
以前、CSS-イン-JSソリューションはハイドレーション時の余分な負荷とSSRの問題で批判されていました。最近のバージョンでは、チームが内部ロジックを書き換えました。ライブラリはストリーミングSSRと連携でき、React Server Componentsとも適切に動作します。スタイルは遅延なしでHTMLストリームに直接埋め込まれます。
styled-componentsを使用するタイミング
このライブラリが最も得意な4つのシナリオがあります:
- 柔軟なカスタマイズが可能な内部UIコンポーネントライブラリやデザインシステムを構築している場合。
- プロジェクトに多くの複雑なインタラクティブ要素があり、入力データに基づいてビジュアル状態が変化する場合。
- チームがクラシックなCSS構文に慣れているが、ビルドツールの設定なしで信頼できるスタイルの分離を必要としている場合。
- ReactとReact Nativeを使用したクロスプラットフォームプロジェクトを書いており、スタイル用の単一APIを使用することを期待している場合。
優先事項が最小限のJSバンドルを持つ低性能デバイスでのアプリ起動である場合は、Tailwind CSSやLinariaやPigment CSSなどのゼロランタイムソリューションを検討することをお勧めします。
styled-componentsは明確で予測可能なソリューションであり続けています。このライブラリはクラス命名の頭を悩ませることなく、コンポーネント本体に直接クリーンなCSSを提供します。ほとんどのフロントエンドタスクにとって、このツールの力は十分すぎるものです。
関連プロジェクト