用treat构建可主题化设计系统:源自SEEK的Braid实战经验
【免费下载链接】treat:candy: Themeable, statically extracted CSS‑in‑JS with near‑zero runtime.项目地址https://gitcode.com/gh_mirrors/tre/treat点击查看免费下载treat 是 SEEK 开源的可主题化、静态提取 CSS-in-JS解决方案运行时开销近乎为零。它由 SEEK 的 Braid 设计系统孕育而生样式写在.treat.js/.treat.ts文件中在构建期执行并提前生成全部 CSS最终产物里几乎不携带任何样式逻辑。本文将带你回顾 Braid 团队踩过的坑并给出一条从零搭建可主题化设计系统的完整实践路径。为什么是 treatBraid 设计系统踩过的两个坑Braid 最初基于 CSS Modules JavaScript 实现随后遇到两个绕不开的难题完整决策过程见 docs/background.mdCSS Modules 难以兼容 TypeScript——源文件导出的是整份样式表对象而导入方拿到的只是一个扁平的类名映射TS 类型在这一步完全丢失样式文件被迫停留在 JavaScriptCSS Modules 只有一个扁平命名空间——想从单个文件导出paddingTop、background、color等多组工具类只能手动下划线命名再写一堆样板代码把它们转回嵌套结构。团队评估过主流替代方案但都被劝退styled-components / Emotion 等运行时方案动态能力强但包体积与运行时性能开销对 Braid 这种要以独立 widget 形式嵌入外部代码库的组件库不可接受Linaria 等静态方案主题化依赖 CSS 变量CSS custom properties无法支持 IE11 等旧浏览器。于是 treat 应运而生四个核心目标非常明确完全静态提取、最小运行时、类型安全、兼容旧浏览器。3 步上手 treat从安装到输出静态 CSS第一步安装并配置 webpack 插件treat 需要基于 webpack 构建插件随核心包提供完整选项见 docs/webpack-options.mdyarn add treat在 webpack 配置中加入TreatPlugin配合mini-css-extract-plugin输出独立 CSS 文件const { TreatPlugin } require(treat/webpack-plugin); const MiniCssExtractPlugin require(mini-css-extract-plugin); module.exports { plugins: [ new TreatPlugin({ outputLoaders: [MiniCssExtractPlugin.loader] }), new MiniCssExtractPlugin() ] };第二步编写 treat 文件用.treat.js/.treat.ts后缀标记构建期执行的样式文件// Button.treat.js —— 这段代码不会进入最终包 import { style } from treat; export const button style({ backgroundColor: blue, height: 48 });第三步在组件里引入样式import * as styles from ./Button.treat.js; const Button ({ text }) ( button className{styles.button}{text}/button );构建完成后treat 文件中的样式逻辑被完全剥离组件里只剩一个类名字符串——CSS 全部走静态文件JS 包内零样式代码。可主题化核心一个主题 一份预生成 CSStreat 的主题化思路与 Linaria 截然不同不用 CSS 变量而是为每个主题各生成一份独立 CSS 类。// theme.treat.js import { createTheme } from treat; export default createTheme({ brandColor: blue, grid: 4 });// Button.treat.js export const button style((theme) ({ backgroundColor: theme.brandColor, height: theme.grid * 11 }));若项目中定义了greenTheme与redTheme构建产物里就会各生成一份.button_greenTheme、.button_redTheme。运行时只需按当前主题查表切换到对应类名逻辑轻到几乎不存在——这也是它天然兼容 IE11 等旧浏览器的原因原理详见 docs/how-it-works.md。React 项目中通过react-treat的TreatProvideruseStyles完成主题注入与解析实现见 packages/react-treat/src/index.tsxTreatProvider theme{theme}.../TreatProvider // 组件内 const styles useStyles(styleRefs);⚠️优先级注意为确保跨主题 specificity 一致带主题的样式优先级永远高于普通样式与书写顺序无关。Braid 团队建议不要依赖跨类名覆盖状态样式也统一写成 themed styles。实战像 Braid 一样批量生成原子化类treat 提供styleMap/styleTree两个 API文档见 docs/styling-api.md配合 JS 的循环能力可以从设计令牌design tokens批量生成原子类。本仓库的文档站就是一个真实案例site/src/system/styles/atoms.treat.ts基于 tokens 生成display、alignItems、flexGrow等原子类site/src/system/styles/createSpacing.ts用styleTree把8 个间距档位 × 2 个断点 × 8 个 padding/margin 方向组合成上百个响应式间距类主题更新后全部自动重新生成site/src/themes.treat.ts文档站的主题定义字体、字号、颜色、边框等设计令牌。配合 site/src/Theme.ts 中手动声明的Theme接口所有theme.grid、theme.color.strong的取值都受 TypeScript 类型检查——设计令牌即类型设计即契约。运行时为什么近乎为零无主题场景完全不需要运行时构建后只剩类名有主题场景运行时只做一次主题 × 模块 → 类名的查表结果按模块缓存在内存中整个应用生命周期每个模块只解析一次所有 CSS 逻辑含其依赖都不会进入最终 JS 包——对 Braid 这类需要以独立 widget 嵌入外部站点的组件库至关重要。核心入口见 packages/treat/src/index.ts运行时查表实现见 packages/treat/src/resolveStyles.ts。进阶技巧速查场景做法参考调试类名安装babel-plugin-treat自动为样式补充可读调试名docs/setup.mdSSR 项目服务端构建设outputCSS: false避免重复生成 CSSdocs/setup.md主题按需加载动态import主题文件webpack 自动拆分为独立 CSSdocs/setup.md主题类型安全全局声明treat/theme模块的Theme接口docs/data-types.md全局样式 / resetglobalStyle(html, body, {...})site/src/App.treat.ts插件配置项localIdentName、themeIdentName、hmr等docs/webpack-options.md完整资料索引项目背景与 Braid 的决策过程docs/background.md静态提取与主题化原理docs/how-it-works.md运行时 APIresolveStyles/resolveClassNamedocs/runtime-api.mdReact APITreatProvider/useStylesdocs/react-api.md完整示例Gatsby / Next.jsexamples/gatsby-plugin-treat-example/、examples/next-treat-example/想亲手跑一遍可以获取代码git clone https://gitcode.com/gh_mirrors/tre/treat赞分享【免费下载链接】treat:candy: Themeable, statically extracted CSS‑in‑JS with near‑zero runtime.项目地址https://gitcode.com/gh_mirrors/tre/treat点击查看免费下载相关推荐styled-components主题化实战构建可定制化设计系统styled components主题化实战构建可定制化设计系统 styled components主题化是构建现代化React应用设计系统的关键技术它让开前端UI组件Context Engineering 实战用 /experiment.agent 系统提示模板构建可审计、可递归的实验设计 AgentContext Engineering 实战用 /experiment.agent 系统提示模板构建可审计、可递归的实验设计 Agent 本文以 Contex文档教程知识库人工智能提示工程Gaia高可用架构设计构建可靠的分布式自动化系统Gaia高可用架构设计构建可靠的分布式自动化系统 在当今云原生时代构建高可用的分布式系统已成为企业数字化转型的关键。Gaia作为一个开源的云计算平台专门设后端CI/CDDevOps工作流自动化任务调度流程编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ARM编译器5.06实战:从armcc环境配置到避坑技巧全解析

ARM编译器5.06实战:从armcc环境配置到避坑技巧全解析

简介:面向嵌入式硬件开发者的ARM Compiler 5.06离线安装包,用于在Keil MDK等图形化IDE中补齐ARMCC工具链,解决Cortex-A/R/M系列处理器从编译、汇编到链接的完整构建需求。资源共3个文件,包含可执行的安装程序(exe&…

2026/10/15 18:25:39 阅读更多 →
Agentjacking 防御指南:当 AI 编程 Agent 遇到假报错,如何用 TaoToken 隔离恶意代码执行

Agentjacking 防御指南:当 AI 编程 Agent 遇到假报错,如何用 TaoToken 隔离恶意代码执行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 18:24:38 阅读更多 →
Qt网络调试助手:TCP/UDP三合一协议联调实践与避坑指南

Qt网络调试助手:TCP/UDP三合一协议联调实践与避坑指南

简介:这是基于Qt开发的一套网络调试助手终极版源码,完整支持TCP客户端、TCP服务端、UDP客户端与服务端四种模式,适合需要频繁调试网络协议、排查通信问题的开发者在真实项目中借鉴或直接复用。压缩包共35个文件,整体仅263KB&#…

2026/10/15 18:24:38 阅读更多 →

最新新闻

SAP系统拆分:注意事项与规避做法(下篇)

SAP系统拆分:注意事项与规避做法(下篇)

上篇梳理了拆分项目的风险:模块集成带来的牵连、数据关联被切断、自开发处理工作量被低估、停机窗口受交易时间表约束、合规敞口放大、跨部门协同吃紧、测试被压缩,以及源系统遗留数据的处理。 本篇说明相应的规避做法,按启动前、执行中、上线…

2026/10/15 19:05:56 阅读更多 →
豆包工作上线新功能,支持跨AI产品一键导入已有配置

豆包工作上线新功能,支持跨AI产品一键导入已有配置

近期,豆包工作持续更新,上线“数据导入与同步”功能,支持从其他AI产品一键导入数据,并推出“在新对话中继续”、消息注释和对话摘要侧栏等能力,进一步优化工作任务中的对话体验。据介绍,豆包工作的“数据导…

2026/10/15 19:05:56 阅读更多 →
氧化锆陶瓷电极原理是什么?氧化锆陶瓷电极精密加工厂家

氧化锆陶瓷电极原理是什么?氧化锆陶瓷电极精密加工厂家

氧化锆陶瓷电极之所以能在氧传感器、固体氧化物燃料电池和高温电化学装置中发挥关键作用,根本原因在于其独特的氧离子导电机制。很多用户搜索“氧化锆陶瓷电极原理是什么”,同时也希望找到氧化锆陶瓷电极精密加工厂家。一、氧化锆陶瓷的晶体结构与氧空位…

2026/10/15 19:05:56 阅读更多 →
Java UDP网络编程实战:从原理到C/S通信案例

Java UDP网络编程实战:从原理到C/S通信案例

1. 为什么我选择用UDP做这个C/S通信案例1.1 从一次局域网调试说起前阵子帮一个做物联网设备的朋友排查问题,他的设备端每隔一秒往服务器发一次状态心跳,用的是TCP长连接。设备数量一上来,服务器端就出现大量连接堆积,资源占用高得…

2026/10/15 19:05:56 阅读更多 →
C# USB摄像头稳定录制方案:AForge+FFmpeg工业级实践

C# USB摄像头稳定录制方案:AForge+FFmpeg工业级实践

简介:本资源是一份面向C#初学者与桌面应用开发者的USB摄像头调用实战项目,聚焦于Windows平台下视频录制与单帧图像保存的核心功能实现。资源提供DirectShow与Media Foundation双框架的代码实践路径,涵盖设备枚举、滤镜图构建、媒体流捕获、文…

2026/10/15 19:05:56 阅读更多 →
【ESP32笔记】ESP中的分区表

【ESP32笔记】ESP中的分区表

本节目标:看懂分区表 CSV 的每一列,会给工程添加自定义分区,并用 esp_partition API 完成擦除、写入、读取一、本节要解决的问题 ESP32 的程序不是"整个 bin 一股脑烧到某个固定地址",而是把整块 flash 划分成多个分区&…

2026/10/15 19:04:55 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →