StyleX:Meta推出的高性能零運行時CSS-in-JS解決方案

簡介

StyleX 是由 Meta 開發的零運行時 CSS-in-JS 解決方案,在構建時將樣式編譯為靜態 CSS,消除運行時開銷。

核心特性

  • 零運行時開銷?– 構建時編譯為靜態 CSS
  • 類型安全?– 完整的 TypeScript 支持
  • 原子化 CSS?– 自動生成原子化類名,最小化包體積
  • 開發體驗?– 熱重載、錯誤提示、工具鏈集成

快速開始

安裝

npm install @stylexjs/stylex
npm install -D @stylexjs/rollup-plugin

Vite 配置

// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import stylexPlugin from "@stylexjs/rollup-plugin";export default defineConfig({plugins: [stylexPlugin({dev: true,runtimeInjection: true,genConditionalClasses: true,fileName: "stylex.css",unstable_moduleResolution: {type: "commonJS",rootDir: process.cwd(),},}),react(),],
});

基礎用法

創建樣式

import * as stylex from "@stylexjs/stylex";// 簡單的樣式定義
const styles = stylex.create({button: {padding: 16,margin: 8,borderRadius: 4,borderWidth: 1,borderStyle: "solid",borderColor: "#ccc",backgroundColor: "#f0f0f0",cursor: "pointer",fontSize: 16,},primary: {backgroundColor: "#007bff",borderColor: "#007bff",color: "white",},
});function StyleXButton({ variant, children }) {const buttonProps = stylex.props(styles.button,variant === "primary" && styles.primary);return <button {...buttonProps}>{children}</button>;
}

響應式設計

import * as stylex from "@stylexjs/stylex";const responsiveStyles = stylex.create({container: {padding: 16,"@media (max-width: 768px)": {padding: 8,},"@media (min-width: 1024px)": {padding: 32,},},
});

主題系統

//tokens.stylex.js
import * as stylex from "@stylexjs/stylex";// 定義主題變量
export const tokens = stylex.defineVars({primaryColor: "#007bff",backgroundColor: "#ffffff",textColor: "#333333",spacing: "16px",
});// 暗色主題
export const darkTheme = stylex.createTheme(tokens, {primaryColor: "#0d6efd",backgroundColor: "#1a1a1a",textColor: "#ffffff",spacing: "16px",
});
import * as stylex from "@stylexjs/stylex";
import { tokens, darkTheme } from "./tokens.stylex.js";// 使用主題
const themedStyles = stylex.create({card: {backgroundColor: tokens.backgroundColor,color: tokens.textColor,padding: tokens.spacing,},
});function ThemedCard({ isDark, children }) {const themeProps = stylex.props(isDark && darkTheme);const cardProps = stylex.props(themedStyles.card);return (<div {...themeProps}><div {...cardProps}>{children}</div></div>);
}

實際應用示例

卡片組件

const cardStyles = stylex.create({card: {backgroundColor: "white",borderRadius: 8,boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)",overflow: "hidden",transition: "transform 0.2s ease",":hover": {transform: "translateY(-2px)",},},header: {padding: 16,borderBottom: "1px solid #e9ecef",},content: {padding: 16,},
});function Card({ title, children }) {const cardProps = stylex.props(cardStyles.card);const headerProps = stylex.props(cardStyles.header);const contentProps = stylex.props(cardStyles.content);return (<div {...cardProps}>{title && (<div {...headerProps}><h3>{title}</h3></div>)}<div {...contentProps}>{children}</div></div>);
}

表單組件

const formStyles = stylex.create({input: {width: "100%",padding: "8px 12px",border: "1px solid #ddd",borderRadius: 4,":focus": {outline: "none",borderColor: "#007bff",boxShadow: "0 0 0 2px rgba(0, 123, 255, 0.25)",},},error: {borderColor: "#dc3545",},button: {padding: "12px 24px",backgroundColor: "#007bff",color: "white",border: "none",borderRadius: 4,cursor: "pointer",":hover": {backgroundColor: "#0056b3",},},
});

工具集成

高級 Vite 配置

// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import stylexPlugin from "@stylexjs/rollup-plugin";export default defineConfig({plugins: [react(),stylexPlugin({dev: process.env.NODE_ENV === "development",genConditionalClasses: true,fileName: "stylex.css",minify: process.env.NODE_ENV === "production",// 自定義類名生成classNamePrefix: "sx",// 啟用樣式去重unstable_moduleResolution: {type: "commonJS",rootDir: process.cwd(),},}),],build: {// 確保 CSS 被正確提取cssCodeSplit: true,rollupOptions: {output: {assetFileNames: (assetInfo) => {if (assetInfo.name === "stylex.css") {return "assets/stylex.[hash].css";}return "assets/[name].[hash][extname]";},},},},
});

TypeScript 支持

// stylex.d.ts
declare module "@stylexjs/stylex" {export function create<T extends Record<string, any>>(styles: T): { [K in keyof T]: string };export function defineVars<T extends Record<string, string | number>>(vars: T): T;export function createTheme<T>(baseTheme: T, overrides: Partial<T>): string;export default function stylex(...styles: (string | false | null | undefined)[]): string;
}

最佳實踐

樣式組織

// tokens.js - 設計令牌
export const tokens = stylex.defineVars({colorPrimary: "#007bff",colorSecondary: "#6c757d",spacingS: "8px",spacingM: "16px",spacingL: "24px",fontSizeS: "12px",fontSizeM: "14px",borderRadius: "4px",
});// Button.stylex.js - 組件樣式
import { tokens } from "./tokens";export const buttonStyles = stylex.create({base: {padding: `${tokens.spacingS} ${tokens.spacingM}`,fontSize: tokens.fontSizeM,borderRadius: tokens.borderRadius,border: "none",cursor: "pointer",},primary: {backgroundColor: tokens.colorPrimary,color: "white",},secondary: {backgroundColor: tokens.colorSecondary,color: "white",},
});

條件樣式

const messageStyles = stylex.create({base: {padding: 16,borderRadius: 4,marginBottom: 16,},success: {backgroundColor: "#d4edda",color: "#155724",},error: {backgroundColor: "#f8d7da",color: "#721c24",},
});function Message({ type, children }) {const messageProps = stylex.props(messageStyles.base,type === "success" && messageStyles.success,type === "error" && messageStyles.error);return <div {...messageProps}>{children}</div>;
}

常見問題

Q: StyleX 與其他 CSS-in-JS 庫有什么區別?
A: StyleX 的主要優勢是零運行時開銷,在構建時編譯為靜態 CSS。

Q: 如何處理動態樣式?
A: 使用 CSS 變量或函數參數傳遞動態值。

Q: 是否支持 SSR?
A: 完全支持,由于樣式在構建時生成,無客戶端和服務端不一致問題。

總結

StyleX 是一個強大的零運行時 CSS-in-JS 解決方案,特別適合:

  • 大型 React 應用程序
  • 性能要求嚴格的項目
  • 需要類型安全的團隊
  • 追求最佳構建產物的項目

主要優勢:零運行時開銷、類型安全、原子化 CSS、優秀的開發體驗。通過構建時編譯,StyleX 既保持了 CSS-in-JS 的開發體驗,又獲得了靜態 CSS 的性能優勢。

?StyleX:Meta推出的高性能零運行時CSS-in-JS解決方案 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿技術分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92077.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LINUX 85 SHElL if else 前瞻 實例

問題 判斷用戶是否存在 id user id $user變量判斷vsftpd軟件包被安裝 rpm -q vsftpd rpm -ql vsftpd >& null[rootweb ~]# rpm -ql vsftpd >/dev/null 2>&1 您在 /var/spool/mail/root 中有郵件yum install vsftpd 內核主版本判斷 uname -rcut -d[rootweb ~]#…

2025 年非關系型數據庫全面指南:類型、優勢

非關系型數據庫的分類與特點隨著數據量呈指數級增長和數據類型日益多樣化&#xff0c;傳統關系型數據庫在處理海量非結構化數據時面臨著嚴峻挑戰。非關系型數據庫&#xff08;NoSQL&#xff09;應運而生&#xff0c;它摒棄了傳統關系模型的約束&#xff0c;采用更靈活的數據存儲…

深度殘差網絡ResNet結構

Deep Residual Learning for Image Recognition&#xff0c;由Kaiming He、Xiangyu Zhang、Shaoqing Ren和Jian Sun于2016年發表在CVPR上 1512.03385 (arxiv.org)https://arxiv.org/pdf/1512.03385 下圖中&#xff0c;左側為VGG19網絡&#xff0c;中間為34層的普通網絡&#xf…

python筆記--socket_TCP模擬瀏覽器實現

""" 1,導包 2,創建TCP套接字 3,建立連接 4,拼接客戶端請求報文 5,發送請求報文 6,接收響應報文 7,過濾出html頁面 8,保存為html文件 9,關閉套接字 """ # 1,導包 import socket # 2,創建TCP套接字 tcp_socketsocket.socket(socket.AF_INET,socket…

西門子PLC基礎指令4:置位指令 S、復位指令 R

布爾指令 1、置位指令 S Setbit 是要進行置位操作的地址的首地址&#xff0c;N 是從該首地址開始連續置位的位數 。 LD I0.0 // 裝載輸入繼電器I0.0的狀態&#xff08;當I0.0為ON時&#xff0c;執行后續指令&#xff09; S Q0.0, 3 // 從Q0.0開始&#xff0c;連續置位3…

2.3 子組件樣式沖突詳解

Vue2組件樣式沖突的成因與解決方案組件樣式沖突的根本原因在Vue單頁面應用中&#xff0c;所有組件的DOM結構最終都會合并到同一個index.html 頁面中。若子組件未使用scoped屬性&#xff0c;其樣式會默認全局生效&#xff0c;導致不同組件中相同選擇器&#xff08;如h1、.contai…

26-數據倉庫與Apache Hive

1.數據倉庫 是什么&#xff1f;解決什么&#xff1f;1.1 數據倉庫Data Warehouse 數倉 / DW 是一個用于存儲、分析、報告的數據系統.目的&#xff1a;構建面向分析的集成數據環境&#xff0c;分析結構為企業提供決策支持。數倉專注于分析數倉本身不“”生產“”數據&#xff0c…

前端開發技術教學(二)

書接上回&#xff1a;前端開發技術教學(一) -CSDN博客 必要資源&#xff1a;TRAE - The Real AI Engineer 目錄 一) 自定義函數 - function 二) DOM操控 DOM事件 a.) onclick b.) onkeydown 三) AI寫代碼 書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們…

設計模式 - 組合模式:用樹形結構處理對象之間的復雜關系

文章目錄一、引言二、模式原理分析三、代碼示例四、核心要點五、使用場景分析六、案例七、為何使用組合模式&#xff1f;八、優缺點剖析九、最佳實踐建議十、總結一、引言 “組合模式”&#xff08;Composite Pattern&#xff09;常被誤解為“組合關系”。前者專注于將對象組合…

STM32U575低功耗調試

開啟了MSIK時鐘導致功耗變高在stop2模式下, 整體板子25.41uA; 如果在standby模式, 整體板子5uA;如果在stop2模式, 并且把LPTIM3,4選擇的時鐘是MSIK, 整體功耗53.59uA2.stanby模式板子整體5uA調試的時候, 可以讓板子進入standby模式, 如果電流很小, 可以證明板子沒有漏電(圖畫錯…

基于ARM+FPGA多通道超聲信號采集與傳輸系統設計

針對超聲信號采集系統在多通道同步采集和高速數據傳輸所面臨的挑戰,設計并實現了一種 基于 FPGA 的8通道超聲信號同步采集與傳輸系統。系統以FPGA 作為主控芯片,ADI公司的 AD9279作 為8通道超聲信號同步采集的模擬前端和模數轉換芯片,通過 DDR3SDRAM 及 USB3.0實現數據緩存和 高…

計算機網絡:為什么IPv6沒有選擇使用點分十進制

IPv6沒有采用點分十進制(如IPv4的192.168.1.1),核心原因是其地址長度、設計目標與表示需求和IPv4存在本質差異,而冒號分十六進制(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)是更適配其特性的選擇。具體可從以下幾個角度分析: 一、地址長度差異:點分十進制無法適配12…

HBM Basic(VCU128)

目錄 1. 簡介 1.1 硬件平臺 1.2 圖片 2. 硬件信息 2.1 Vivado Basic 2.1.1 GPIO 2.1.2 Clock Sources 2.1.3 Reset 2.1.4 Flash 2.1.5 燒寫報錯 2.2 PCIe simple 2.2.1 Block Design 2.2.2 XDMA 2.3 PCIe HBM 2.3.1 Block Design 2.3.2 HBM IP 3. HBM 知識 3…

Mybatis的應用及部分特性

初識MybatisMybatis的概念MyBatis 是一個Java 持久層框架&#xff0c;核心作用是簡化數據庫操作&#xff0c;把 SQL 和 Java 代碼解耦。ORM框架MyBatis是一個ORM 框架所謂ORM 框架&#xff0c;就是把數據庫里的表、字段、關系&#xff0c;映射成編程語言里的類、屬性、對象引用…

使用Jeecg低代碼平臺實現計劃管控系統建設方案--2平臺學習

1.前后端列表練習 前端頁面下的views下的system下的基本都是系統管理的東西。 在system下新建一個目錄edu。 index基本就是列表頁面。 modal就是新增編輯彈窗。 api就是接口。 data就是列配置。 一些組件的使用可以參考官方文檔&#xff0c;help.jeecg.com。 在創建一個…

調試|谷歌瀏覽器調試長連接|調試SSE和websocket

長連接需求不常有&#xff0c;控制臺調試的細節容易忘&#xff0c;在這截圖備忘。本文會記錄SSE、websocket連接、普通接口 在谷歌瀏覽器控制臺的對比 文章目錄SSE&#xff08;Server-Sent Events&#xff09;觀察對象&#xff1a;百度翻譯觀察請求頭和響應頭觀察EventStream觀…

VS2019 Qt5.14.2 OpenCV4.4.0 全流程安裝及開發環境搭建與配置(工業相機環境配置)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言Visual Studio 2019 安裝步驟項目配置驗證Qt 5.14.2 安裝步驟項目配置驗證Visual Studio Qt 拓展&#xff08;確定項目后&#xff09;OpenCV 4.4.0 安裝步驟項目…

正確配置jdk環境但IntelliJ IDEA無法啟動

現象&#xff1a;今天突然發現開發工具雙擊沒有正常啟動&#xff0c;之前是用著的。問題排查&#xff1a;是否是因為jdk環境變量導致的&#xff0c;之前安裝過安卓的開發環境也修改過環境變量。步驟一&#xff1a;cmd輸入java -version 或javac&#xff0c;如圖沒有反應步驟二&…

ubuntu-server安裝

1.下載系統鏡像&#xff1a; 阿里云鏡像站下載服務器鏡像 https://mirrors.aliyun.com/ubuntu-releases/24.04/ubuntu-24.04.2-live-server-amd64.iso 1.創建新的虛擬機 按住鍵盤ctrl n 打開虛擬機創建界面 用光標選擇對應語言沒有中文哈 然后回車確認 設置計算機名、用戶名…

Docker Compose管理新范式:可視化控制臺結合cpolar提升容器編排效率?

文章目錄前言1. 安裝Docker2. 檢查本地docker環境3. 安裝cpolar內網穿透4. 使用固定二級子域名地址遠程訪問前言 在容器化應用部署領域&#xff0c;Docker Compose UI為開發者提供了一種更直觀的解決方案。這款工具以Web界面形式封裝了Docker Compose的核心功能&#xff0c;在…