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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;在…