close

使用 Rspress

Rspress 是基于 Rspack 的静态站点生成器,适合为组件库项目提供预览和搭建 API 文档。借助 plugin-previewplugin-api-docgen

新项目

Info

使用 create-rslib 时,选择 React + TypeScript 模板并勾选额外工具 “Rspress - documentation”,会自动生成文档目录、脚本和 Rspress 配置,无需手动搭建。

执行 npm create rslib@latest 并选中 Rspress,会生成下方的文件结构:

docs
index.mdx
src
Button.tsx
package.json
tsconfig.json
rslib.config.ts
rspress.config.ts

模板中内置了 rsbuild-plugin-workspace-dev 插件,可在启动 Rspress 开发服务器的同时启动 Rslib 的 watch 模式。

运行 npm run doc 启动 Rspress 的开发服务器对 Rslib 组件库进行预览:

package.json
{
  "scripts": {
    "dev": "rslib build --watch",
    "doc": "rspress dev" // 执行该命令,会同时执行 dev 脚本
  }
}

已有项目

如果你在使用 Rslib 开发组件库,可以按照以下步骤为现有项目添加 Rspress 文档支持:

安装依赖

npm
yarn
pnpm
bun
deno
npm add @rspress/core @rspress/plugin-api-docgen @rspress/plugin-preview rsbuild-plugin-workspace-dev -D

package.json 增加脚本

package.json
{
  "name": "@your-scope/your-package",
  "version": "0.1.0",
  "scripts": {
    "dev": "rslib build --watch",
    "build": "rslib build",
    "doc": "rspress dev",
    "doc:build": "rspress build",
    "doc:preview": "rspress preview"
  }
}

创建 rspress.config.ts

增加 Rspress 组件库预览相关的 plugin,比如 plugin-previewplugin-api-docgen

rspress.config.ts
import * as path from 'node:path';
import { defineConfig } from '@rspress/core';
import { pluginApiDocgen } from '@rspress/plugin-api-docgen';
import { pluginPreview } from '@rspress/plugin-preview';
import { pluginWorkspaceDev } from 'rsbuild-plugin-workspace-dev';

export default defineConfig({
  root: path.join(__dirname, 'docs'),
  title: '组件库文档',
  lang: 'zh',
  builderConfig: {
    plugins: [
      pluginWorkspaceDev({
        startCurrent: true, // 启动文档时同时跑当前包的 dev,保持产物最新
      }),
    ],
  },
  plugins: [
    pluginApiDocgen({
      entries: {
        Button: './src/Button.tsx',
      },
      apiParseTool: 'react-docgen-typescript',
    }),
    pluginPreview(),
  ],
});

通过包名引入产物

tsconfig.json 中用 paths 指向当前包,或在 package.json 将自身依赖声明为 "workspace:*",让 plugin-preview 可以索引到当前项目,文档开发者和用户使用组件方式一致。

tsconfig.json
{
  "compilerOptions": {
    "paths": {
      "@your-scope/your-package": ["."] // 指向当前目录
    }
  },
  "include": ["src", "docs", "rspress.config.ts", "rslib.config.ts"]
}
Tip

plugin-preview 中,我们更推荐使用包名导入组件的产物,而不是相对路径导入源码。这样可以确保预览环境和用户使用环境一致。

如果你的项目中使用 exports 字段,我们更推荐使用 "workspace:*"

package.json
{
  "name": "@your-scope/your-package",
  "version": "0.1.0",
  "dependencies": {
    "@your-scope/your-package": "workspace:*" // 声明自身依赖为 workspace
  }
}

这种方式不需要修改 tsconfig.json,且能更好地支持多入口导出。

示例

docs/ 添加文档示例(可参考模板中的 docs/Button.mdx):

docs/Button.mdx
# Button

## 大小

```jsx preview
import { Button } from '@your-scope/your-package';

export default () => <Button size="medium" label="Click me" />;
```

## 背景色

```jsx preview
import { Button } from '@your-scope/your-package';

export default () => <Button backgroundColor="red" label="Red" />;
```

## API

<API moduleName="Button" />

参考