🚧 Rspress 2.0 文档还在开发中
close

用 wrap 和 eject 定制主题

本篇用更直白的方式说明:通过 theme/index.tsx 重导出可以替换 Rspress 内置组件,然后有两条路——wrap(不改源码,传 props/插槽)eject(复制源码,直接改)。可参考 自定义主题 里的示例。

theme/index.tsx:重导出覆盖内置组件

Rspress 通过项目根目录的 theme/index.tsx 加载主题。你可以在这里通过 ESM 重导出覆写默认导出或同名组件,所有 Rspress 内部引用的内置组件都会优先使用你重导出的版本:

theme/index.tsx
import { Layout as BasicLayout } from '@rspress/core/theme-original';

const Layout = () => <BasicLayout beforeNavTitle={<div>some content</div>} />;

export { Layout };

export * from '@rspress/core/theme-original';
  • Layout 是主题入口,Rspress 会自动加载;通过同名导出你可以替换或包裹默认组件。
  • export * from '@rspress/core/theme-original' 保留默认主题的其它导出,仅对你覆写的组件生效。
  • 该能力是所有自定义方式的基础:你可以只包裹默认组件,也可以在重导出前彻底替换。

Wrap:在重导出的基础上传 props/插槽

Wrap 指在重导出的组件上增加 props 进行定制,例如利用 Layout 的插槽:

  • 不改源码:只在 theme/index.tsx 里包一层,给内置组件传 props/插槽。
  • 轻量改动:样式微调、在插槽里加内容、或用同名导出替换少量组件。

Eject:复制源码后直接修改

Eject 指使用 CLI rspress eject@rspress/core/theme-original 的源码拷贝到本地,然后直接改动:

  • 有源码:rspress eject 把主题源码拷到本地,直接改内部实现。
  • 需维护:与上游解耦,后续升级要自己同步改动。

选择建议

  • 优先使用 Wrap:低风险、易升级,能满足大多数样式和插槽需求。
  • 再考虑 Eject:只有当需要改内部逻辑、Wrap 覆盖不了时,再执行 rspress eject