StyleX の紹介
StyleX は、ウェブアプリのスタイル設定のためのシンプルで使いやすい JavaScript 構文とコンパイラです。
StyleX は、インラインスタイルと静的 CSS の両方の長所を組み合わせ、短所を回避します。スタイルの定義と使用には、コンポーネント内のローカルな知識のみが必要であり、特異性の問題を回避しながら、メディアクエリなどの機能を保持します。StyleX は、手作業で作成および維持できるものよりも優れた、衝突のないアトミック CSS を使用して最適化されたスタイルを構築します。
概要
スケーラビリティ
- アトミック CSS で CSS 出力を最小限に抑えます。
- コンポーネントの数が増えても、CSS のサイズは頭打ちになります。
- 成長するコードベース内でも、スタイルは可読性と保守性を維持します。
予測可能性
- 要素のクラス名は、その要素自体のみを直接スタイル設定できます。
- 特異性の問題はありません。
- 「最後に適用されたスタイルが常に優先されます!」
コンポーザビリティ
- 条件付きでスタイルを適用します。
- コンポーネントとファイルの境界を越えて、任意のスタイルをマージおよび合成します。
- ローカル定数と式を使用して、スタイルを DRY に保ちます。または、パフォーマンスを気にすることなくスタイルを繰り返します。
高速性
- ランタイムでのスタイルの挿入はありません。
- すべてのスタイルは、コンパイル時に静的 CSS ファイルにバンドルされます。
- クラス名のマージのための最適化されたランタイム。
型安全性
- 型安全な API。
- 型安全なスタイル。
- 型安全なテーマ。
StyleX の使用方法
コンパイラの構成
import plugin from '@stylexjs/rollup-plugin';
const config = () => ({
plugins: [
plugin({ ...options })
]
})
export default config;
スタイルの定義
スタイルはオブジェクト構文と `create()` API を使用して定義されます。
import * as stylex from '@stylexjs/stylex';
const styles = stylex.create({
root: {
width: '100%',
maxWidth: 800,
minHeight: 40,
},
});
追加のキーと `create()` の追加呼び出しを使用することで、任意の数のルールを作成できます。
import * as stylex from '@stylexjs/stylex';
const styles = stylex.create({
root: {
width: '100%',
maxWidth: 800,
minHeight: 40,
},
child: {
backgroundColor: 'black',
marginBlock: '1rem',
},
});
const colorStyles = stylex.create({
red: {
backgroundColor: 'red',
borderColor: 'darkred',
},
green: {
backgroundColor: 'lightgreen',
borderColor: 'darkgreen',
},
});
function ReactDiv({ color, isActive, style }) { /* ... */ }
スタイルの使用
スタイルを使用するには、`props()` 関数に渡す必要があります。標準的な JavaScript 式を使用して、スタイルを組み合わせたり、条件付きで適用したりできます。
import * as React from 'react';
import * as stylex from '@stylexjs/stylex';
const styles = stylex.create({ ... });
const colorStyles = stylex.create({ ... });
function ReactDiv({ color, isActive, style }) {
return <div {...stylex.props(
styles.main,
// apply styles conditionally
isActive && styles.active,
// choose a style variant based on a prop
colorStyles[color],
// styles passed as props
style,
)} />;
}
上記の例では JSX を使用しています。StyleX 自体はフレームワークに依存しません。同じコードは、`className` 文字列と `style` オブジェクトを受け入れる他のフレームワーク(`SolidJS`、`Preact`、`Qwik` など)でも機能します。
理想的なユースケース
StyleX は、幅広いプロジェクトでうまく機能します。ただし、特定のユースケースの課題を解決するために設計されました。
JavaScript での UI 作成
StyleX は CSS-in-JS ライブラリであるため、アプリの UI が JavaScript で作成されている場合に最も役立ちます。React、Preact、Solid、lit-html、または Angular などのフレームワークを使用するアプリケーションの場合、StyleX の使用は適切です。
Svelte や Vue などの一部のフレームワークは、ビルド時に JavaScript にコンパイルされるカスタムファイル形式を使用します。StyleX はこれらのフレームワークでも使用できますが、カスタム設定が必要になる場合があります。
大規模または成長しているプロジェクト
StyleX はあらゆる規模のプロジェクトでうまく機能しますが、大規模なアプリケーションで真価を発揮します。
StyleX はアトミックなクラス名にコンパイルされるため、プロジェクトの成長に伴って CSS バンドルのサイズが頭打ちになるという大きなパフォーマンス上の利点があります。
再利用可能なコンポーネント
StyleX の利点は、再利用可能な UI コンポーネントと併用した場合に最も大きくなります。
長年にわたり、スタイルが組み込まれているがカスタマイズが難しい「デザインシステム」コンポーネントと、完全にスタイルのない「ヘッドレス」コンポーネントのどちらかを選択する必要がありました。
StyleX は、開発者がデフォルトのスタイルを持ちながらカスタマイズ可能な UI コンポーネントを構築できるようにします。
さらに、この一貫性により、これらのコンポーネントを NPM に公開して共有できます。コンポーネントの利用者が StyleX も使用している限り、追加の設定なしでスタイルが正しくマージおよび合成されます。