React 用 Storybook 搭建组件文档与可视化测试:从零到可交互文档站
test12026-10-041 次阅读
为什么需要 Storybook
组件越写越多,真正麻烦的不是写,而是「找不到、看不懂、不敢改」。把 Button、Modal 这类组件塞进业务页面里调试,每次都要走完整链路才能看到效果。Storybook 把组件单独隔离出来,给每个状态一个独立的「故事」,既是文档,也是可视化测试入口。
在 Vite + React 项目里接入
用官方初始化命令即可,它会根据项目类型自动写入 .storybook 配置与示例:
npx storybook@latest init --builder vite
生成的 .storybook/main.ts 决定故事文件的位置与渲染框架:
import type { StorybookConfig } from "@storybook/react-vite";
const config: StorybookConfig = {
stories: ["../src/**/*.stories.@(ts|tsx)"],
addons: ["@storybook/addon-essentials"],
framework: {
name: "@storybook/react-vite",
options: {},
},
};
export default config;
写一个 CSF 故事
Component Story Format(CSF 3.0)用默认导出描述组件元信息,命名导出描述每个故事:
import type { Meta, StoryObj } from "@storybook/react";
import { Button } from "./Button";
const meta: Meta = {
title: "UI/Button",
component: Button,
args: {
label: "提交",
loading: false,
},
};
export default meta;
type Story = StoryObj;
export const Primary: Story = {
args: { variant: "primary" },
};
export const Loading: Story = {
args: { variant: "primary", loading: true },
};
用 args 与 controls 做交互
args 是组件的入参,Storybook 的 controls 插件会把它们自动渲染成可调面板。改一个值,组件实时重渲染,不用改代码就能覆盖各种状态。
用 play 函数写组件交互测试
story 里的 play 函数能在渲染后自动操作组件,配合 @storybook/test 的 expect 做可视化断言:
import { expect, userEvent, within } from "@storybook/test";
export const ClickFlow: Story = {
args: { label: "计数" },
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
const button = canvas.getByRole("button");
await userEvent.click(button);
await expect(button).toHaveTextContent("计数 1");
},
};
跑起来与交付
本地用 npm run storybook 起开发服务;要交付静态文档站就构建成静态文件,挂到内网或对象存储:
npm run build-storybook
# 产物在 storybook-static/,直接当作静态站点部署
把组件故事纳入流水线,每次提交自动跑 play 测试,组件库的回归风险会被压到很低。
T
test1
文章作者
为什么需要 Storybook 组件越写越多,真正麻烦的不是写,而是「找不到、看不懂、不敢改」。把 Button、Mo...
- 分类
- 技术
- 发布时间
- 2026-10-04
- 字数
- 约 1745 字
- 阅读
- 1 次
