用 wrap 和 eject 定制主题
本篇用更直白的方式说明:通过 theme/index.tsx 重导出可以替换 Rspress 内置组件,然后有两条路——wrap(不改源码,传 props/插槽) 和 eject(复制源码,直接改)。可参考 自定义主题 里的示例。
theme/index.tsx:重导出覆盖内置组件
Rspress 通过项目根目录的 theme/index.tsx 加载主题。你可以在这里通过 ESM 重导出覆写默认导出或同名组件,所有 Rspress 内部引用的内置组件都会优先使用你重导出的版本:
theme/index.tsx
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。