自定义主题
-
对于 JS / React,Rspress 基于 ESM 重导出覆盖实现了一套运行时接口,支持对内置组件进行修改或替换,实现自己的首页、侧边栏、搜索组件等。
在此之上有两种模式:
- wrap:通过 props / 插槽来对 Rspress 内置的组件进行 包装 并增强。
- eject:通过
rspress eject命令将源码 拷贝 到本地直接修改并覆盖。
下面会根据主题定制化的程度会依次进行介绍。
CSS 变量
Rspress 暴露了一些常用的 CSS 变量,相比重写 Rspress 内置的 React 组件,覆盖 CSS 变量实现定制化更简单也更易维护。你可以在 UI - CSS 变量 页面查看这些 CSS 变量,并通过:
BEM 类名
Rspress 内置组件均使用 BEM 命名规范。你可以使用这些类名进行样式覆盖,覆盖方式和 CSS 变量 一致。
例如:
theme/index.tsx:利用 ESM 重导出覆盖内置组件
默认情况下,你需要在项目根目录下创建一个 theme 目录,然后在 theme 目录下创建一个 index.ts 或者 index.tsx 文件,该文件用于导出主题组件。
你可以使用 @rspress/core/theme-original 的内置组件,来编写 theme/index.tsx 文件:
通过 ESM 重导出 覆写内置的组件,所有 Rspress 内部引用的内置组件都会优先使用你重导出的版本。
仅在自定义主题的时候使用 @rspress/core/theme-original
-
docs目录下,使用@rspress/core/theme,@rspress/core/theme指向你的theme/index.tsx。 -
theme目录下,使用@rspress/core/theme-original,@rspress/core/theme-original永远指向 Rspress 内置的主题组件。
Wrap:在重导出的基础上传 props/插槽
Wrap 指在重导出的组件上增加 props。下面是一个例子,在导航栏标题前面插入一些内容:
值得注意的是,Layout 组件设计了一系列的 props 支持插槽元素,你可以通过这些 props 来扩展默认主题的布局:
Eject:对源码直接修改
Eject 指将 Rspress 单个内置组件的源码拷贝到本地,然后直接改动,步骤如下:
-
执行 CLI
rspress eject [component],Rspress 会将指定组件的源码 eject 到本地theme/components目录,不会 eject 依赖。 -
更新
theme/index.tsx重导出:
- 任意修改
theme/components/DocFooter.tsx,使它满足你的需要。
Rspress 的组件经过细粒度的拆分,你可在 内置组件 中看到哪些组件适合 eject。
eject 会增加一定的维护成本,因为 Rspress 未来版本更新时,这些被 eject 的组件不会自动获得更新,你需要手动对比并合并变更。
请先查看 wrap 能否满足你的需求,只有在 wrap 无法满足你的需求时,才考虑 eject。