ant design 5 的 token 系统通过 seed/map/alias 三层设计变量驱动样式生成,改 seed(如 colorprimary)自动重算 map,优先用于全局定制;必须用最外层 configprovider.theme 配置,否则 api 组件不响应;v5.8.0+ 支持 algorithm 才能触发派生色计算;css 变量需手动注入。

Ant Design 5 的 CSS-in-JS Token 系统不是让你“写 CSS”,而是通过修改设计变量(Design Token)驱动样式生成——直接改 token,而不是覆盖 .ant-btn 类名。
Design Token 分三层:Seed、Map、Alias,改哪层决定影响范围
改 colorPrimary 这类 Seed Token,会触发整套 Map Token(如 colorPrimaryHover、colorPrimaryActive)自动重算;而直接改 Alias Token(如 colorText)只影响单点,不联动。多数定制场景应优先动 Seed 层。
-
Seed Token:基础变量,如colorPrimary、borderRadius、fontSize,改它最省力也最彻底 -
Map Token:由 Seed 派生的中间变量,一般不建议手动设,除非要打破默认映射逻辑 -
Alias Token:语义化别名,如colorBgContainer,适合局部微调,但不会反向影响 Seed
全局定制必须用 ConfigProvider.theme,静态方法(如 Modal.xxx)不生效
常见错误是把 theme 配在组件内部或某个子树里,结果 message.error() 或 notification.open() 完全不响应——因为这些 API 内部用 ReactDOM.render 创建新上下文,脱离了你的 ConfigProvider。
通过 Auth0 Token Vault,代表已认证用户访问 Gmail、Slack、Google Calendar、GitHub 等第三方服务以及自定义 Auth0 连接。使用...
- 正确做法:把
ConfigProvider包在应用最外层(比如root.render()的入口处) - 对
Modal.useModal()等 Hook,需显式传入contextHolder,或用App组件包裹来透传 context - 别试图在
useEffect里动态改theme,Token 是初始化时计算的,运行时变更不会刷新已挂载组件的样式
组件级 Token 定制从 v5.8.0 起支持 algorithm,否则只是硬覆盖
早期版本中,给 components.Button.token 直接赋值 { colorPrimary: '#ff6b35' },只会替换该值,不会重新生成 colorPrimaryHover 等派生色。v5.8.0+ 加了 algorithm 字段,才能让组件 Token 参与主题演算:
theme={{
components: {
Button: {
algorithm: theme.defaultAlgorithm, // 必须显式指定
token: { colorPrimary: '#ff6b35' },
},
},
}}
- 不加
algorithm:Token 被当作文本覆盖,失去派生能力 - 加了
algorithm:组件 Token 会先合并进全局 Seed,再走一遍算法,确保 hover / active / disabled 状态色自动适配 - 多个组件共用同一套算法时,可复用
theme.darkAlgorithm或自定义函数
自定义 CSS 变量(CSS Custom Properties)仍需手动注入,Token 不自动导出
Ant Design 的 Token 系统本身不生成 CSS 变量(:root { --color-primary: #1890ff; }),即使你用了 @ant-design/cssinjs,变量仍只存在于 JS 运行时。想暴露给外部 CSS 或第三方库,得自己做桥接:
- 用
StyleProvider+createCache获取当前 token 值,再用document.documentElement.style.setProperty注入 - 若服务端渲染(SSR),需在
getInitialProps或getServerSideProps中同步计算并注入<style></style>标签 - 注意:Token 值可能含单位(如
unit(token.fontSize)返回"14px"),直接塞进 CSS 变量会出错,得先提取数值
真正难的不是改几个颜色,而是理解 Token 的派生链和上下文边界——比如为什么 Button 组件的 colorPrimary 改了,Input 却没变;又比如为什么暗色模式开了,但自定义的 components.Table token 还是亮色。这些都不是 bug,是设计选择的结果。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










