毎年 10 月に、インドのゴアで最大の国際反応会議が開催されます。はい、私は React India について話しています。今年(2024 年)は、この素晴らしいカンファレンスで講演する機会を得たので、私にとってさらに特別でした。ライブを見逃した方のために、私の講演の録画をここに載せておきます。動画を見るよりも読む方が好きなら、このブログはまさにあなたにぴったりです!それでは、詳しく見ていきましょう。
StyleX は Meta の新しいスケーラブルなスタイリング ライブラリで、現在 Facebook、Instagram、WhatsApp などのプラットフォームの背後にある主要システムとして使用されています。これは、CSS-in-JS アプローチ、特に大規模な React アプリケーションで経験する問題点に対処します。 StyleX は、アトミック CSS と静的 CSS の両方の最高の機能を組み合わせたハイブリッド ソリューションを提供することで、効率的でモジュール式でスケーラブルな代替手段を提供します。
アトミック CSS 生成: StyleX はアトミック CSS 生成を採用しています。これは、スタイル ルールごとに小さな再利用可能なクラスを作成することを意味します。このアプローチにより、最終的な CSS バンドルの冗長性が最小限に抑えられるだけでなく、スタイルシート全体のサイズが削減されてパフォーマンスも向上します。
CSS 重複排除: 各スタイルに一意のクラス識別子を生成することで、StyleX は重複したスタイルを効果的に排除します。この重複排除プロセスにより、各プロパティと値のペアが 1 回だけレンダリングされるようになり、CSS 出力のスリム化にさらに貢献します。
「最後に適用されたスタイルが常に優先されます!」: StyleX は、最後に適用されたスタイルが優先される予測可能なスタイル ルールに従います。この機能により、スタイル ルールの競合に関する懸念が軽減されるため、デバッグが簡素化され、開発者の信頼が高まります。
React 用に最適化: React アプリケーション専用に設計された StyleX は、React エコシステムにシームレスに統合されます。これにより、開発者はコンポーネント内で直接スタイルを定義できるようになり、より一貫した開発ワークフローが促進されます。
Flow と TypeScript のサポート: StyleX は「Flow」(Meta によって作成) で書かれており、TypeScript の強力なサポートも提供し、スタイルとテーマのタイプセーフ API を有効にします。この型安全性により、コードの信頼性と保守性が向上し、複雑なスタイル設定シナリオの管理が容易になります。
柔軟な条件付きスタイル: StyleX を使用すると、開発者はコンポーネントの状態やプロパティに基づいて条件付きでスタイルを適用できます。この柔軟性により、ユーザーの操作やアプリケーションの状態の変化に適応する動的なスタイル設定が可能になります。
スコープ付きスタイリング: StyleX のスコープ付きスタイル機能により、スタイルが目的のコンポーネントにのみ適用されます。これにより、大規模なコードベースでよく発生する、意図しない副作用や特異性の問題が防止されます。
ランタイム計算の削減: StyleX は、コンパイル時にすべてのスタイルを静的 CSS ファイルにバンドルすることで、ランタイム計算を最小限に抑えます。この最適化により、特に大規模なアプリケーションで、レンダリング時間が短縮され、パフォーマンスが向上します。
コードの保守性の向上: スタイルをそれぞれのコンポーネントと同じ場所に配置し、アトミック クラスを利用することにより、StyleX はコードの保守性を向上させます。開発者は、広範なスタイルシートを調べなくても、スタイルを簡単に理解して変更できます。
最小限の CSS 出力: アトミック CSS を使用すると、最小限の CSS 出力が得られ、パフォーマンスにとって特に有益です。プロジェクトのサイズと複雑さが増大しても、StyleX は機能を犠牲にすることなく CSS バンドルを管理しやすい状態に保ちます。
あらゆる規模のプロジェクトに適しています: StyleX はあらゆる規模のプロジェクトに適していますが、大規模なアプリケーションで真の威力を発揮します。そのアーキテクチャは、パフォーマンスや保守性を損なうことなく、広範なスタイルのニーズの複雑さを処理できるように設計されています。
この記事のコード例は React で書かれており、主に App.jsx と Button.jsx の 2 つのコンポーネントを使用して作業します。スタイルを追加する前に、これらのコンポーネントの基本構造を見てみましょう。
import Button from "./components/Button"; const App = () => { return ( <div> <h1>StyleX by Meta</h1> <Button text="Get Started" /> </div> ); }; export default App;
// Button.jsx import PropTypes from "prop-types"; const Button = ({ text }) => { return <button>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: "black", color: "white", }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
これらのスタイルを使用するには、styleX パッケージからスタイルをインポートし、オブジェクトをパラメータとして受け取る stylex.create メソッドを使用してスタイルを定義する必要があります。次に、stylex.props メソッドを使用して、コンポーネントにスタイルを適用できます。
この例では、base は適用するスタイルの名前です。 StyleX では、これらを 名前空間 と呼びます。現在のボタン コンポーネントは次のようになります。
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: { default: "black", ":hover": "blue", }, color: "white", }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
StyleX を使用すると、疑似クラスにスタイルを追加するのが非常に簡単になります。前の例では、backgroundColor は文字列でした。ここでは、デフォルト値と疑似クラスを持つオブジェクトに変換します。
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: { default: "black", ":hover": "blue", }, color: "white", width: { default: "100px", "@media (max-width: 476px)": "100%", }, }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
他のスタイル ライブラリと比較して、StyleX で異なる方法を実行する 1 つはメディア クエリです。ここでは、要件に基づいてメディア クエリをすべての名前空間に適用します。この例では、ボタンの幅を大きな画面では 100 ピクセル、小さな画面またはモバイル デバイスでは 100% の幅に定義しています。
前の例を拡張して、このボタンのさまざまなバリアントを作成する方法を見てみましょう。
const styles = stylex.create({ base: { fontSize: 18, backgroundColor: { default: "teal", ":hover": "blue", }, color: "white", width: { default: "100px", "@media (max-width: 476px)": "100%", }, }, highlighted: { backgroundColor: "orange", }, danger: { backgroundColor: "red", }, primary: { backgroundColor: "green", }, }); const Button = ({ text, isHighlighted, variant }) => { return ( <button {...stylex.props( styles.base, isHighlighted && styles.highlighted, // conditional styling styles[variant] )} > {text} </button> ); }; Button.propTypes = { text: PropTypes.string.isRequired, isHighlighted: PropTypes.bool, variant: PropTypes.oneOf(["danger", "primary"]), };
stylex.create メソッドにさらにいくつかの名前空間を追加し、異なる背景色を提供してみましょう。さらに、Button コンポーネント内で 2 つの新しいプロップを受け入れます。 isHighlighted は、強調表示された名前空間を適用するために使用するブール型プロパティです。そして、variant は、プライマリ、危険、または強調表示された名前空間を適用するために使用する小道具です。
// App.jsx import Button from "./components/Button"; const App = () => { return ( <div> <h1>StyleX by Meta</h1> <div {...stylex.props(styles.main)}> <Button text="Base Button" /> <Button text="Highlighted Button" isHighlighted /> <Button text="Danger Button" isHighlighted variant="danger" /> <Button text="Primary Button" variant="primary" /> </div> </div> ); }; export default App;
渡されるさまざまなプロパティを使用して、Button コンポーネントのコピーをさらにいくつか作成します。現在のアプリは次のようになります。
それでは、「危険ボタン」を詳しく見てみましょう。 isHighlighted を true として渡しても、強調表示された名前空間は適用されません。危険性のバリアントは最後に記載されているため、適用されます。したがって、ボタンの背景色は赤色になります。
この Button コンポーネントのスタイル プロパティを App.jsx から直接オーバーライドできます。
import Button from "./components/Button"; const App = () => { return ( <div> <h1>StyleX by Meta</h1> <Button text="Get Started" /> </div> ); }; export default App;
この例では、オーバーライド名前空間は現在、任意のプロパティを許可しています。ただし、StyleX では、オーバーライドできるプロパティを制限する機能が提供されます。この機能は、TypeScript を使用する場合に特に役立ちます。
// Button.jsx import PropTypes from "prop-types"; const Button = ({ text }) => { return <button>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
この制限により、backgroundColor と color プロパティのみをオーバーライドできることが保証されます。
前のコード例まで上にスクロールすると、margin: "1rem" スタイルが 3 つの異なる名前空間 (App.jsx の main、button.jsx の強調表示、primary) に追加されていることがわかります。 Devtools を使用して要素を検査すると、さまざまなコンポーネント (メイン コンテナ、強調表示されたボタン、主ボタン) が同じクラス名で接続されており、マージン: "1rem" スタイルを保持するクラス x42y017 が 1 つだけ存在することがわかります。 🎜>
このようにして、StyleX はアトミック クラスを採用することでバンドル サイズを大幅に削減しました。特定のしきい値に達すると、新しいクラスは生成されません。代わりに、単に既存のクラスを再利用します。グローバル変数とテーマ
x.stylex.js ファイルを作成することで、グローバル スタイルを作成できます。この命名規則に従ってください。このファイルでは、以下に示すように stylex.defineVars を使用します。
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: "black", color: "white", }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: { default: "black", ":hover": "blue", }, color: "white", }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
import PropTypes from "prop-types"; import * as stylex from "@stylexjs/stylex"; const styles = stylex.create({ base: { fontSize: 18, backgroundColor: { default: "black", ":hover": "blue", }, color: "white", width: { default: "100px", "@media (max-width: 476px)": "100%", }, }, }); const Button = ({ text }) => { return <button {...stylex.props(styles.base)}>{text}</button>; }; Button.propTypes = { text: PropTypes.string.isRequired, }; export default Button;
万歳! StyleX の使い方の要点を理解することに成功しました。最後までお読みいただきありがとうございます。 StyleX とは何か、Meta がそれをどのように作成したのか、そしてその使用方法についてよく理解できたでしょうか。ご意見やご質問は、コメント欄または Twitter で共有してください。このブログに興味を持っていただけましたら、この投稿に「いいね!」(お気に入りの絵文字を添えて?)していただければ幸いです。
平和 ✌
面接の準備のために Topmate で私と連絡を取ってください
以上がDecoding StyleX: メタの最先端スタイリング システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。