为什么我的Storybook故事显示空白页面?
我在用Storybook写React组件故事时,某个按钮组件的故事一直显示空白页面。其他组件的故事都能正常渲染,这个组件结构也很简单:
import Button from './Button';
export default {
title: 'Components/Button',
component: Button,
};
export const Primary = () => (
<Button variant="primary">Click me</Button>
);
我检查了导入路径没问题,也尝试过把props写成参数形式,甚至重启了Storybook进程。但页面还是只显示容器边框,里面的内容完全看不到,控制台也没有报错信息。
先别急着改 Storybook 配置,咱们一步步来定位:
第一步,最简单的验证方式是把你的故事改成纯原生 HTML 按钮,看看能不能显示
如果这个能显示,说明 Storybook 渲染机制本身没问题,问题出在你写的 Button 组件上。
第二步,打开你的 Button.js 文件,检查它的导出是不是对的。有时候你以为导出了默认组件,结果不小心写成了命名导出,或者用了高阶函数包裹但没正确处理。确认一下你是不是这样导出的:
如果你用了 styled-components、emotion 这类库,那问题很可能出现在样式注入时机上。Storybook 默认不会自动加载你在 App.js 里引入的全局样式或 ThemeProvider。你需要手动在 preview.js 中包裹装饰器。
比如你用了 emotion,就得在 .storybook/preview.js 加上:
第三步,检查你的构建配置。如果你用了 vite 或 webpack 构建 Storybook,有可能 css 文件没被正确识别。特别是当你用的是 CSS modules 或 postcss,需要确保 .storybook/main.js 里配置了对应的 loader。
比如在 main.js 中确认有类似:
最后还有一个隐藏雷区:React 版本不一致。如果你项目里装了多个版本的 react,可能导致 Button 组件虽然渲染了,但 Fiber 树断了,界面看起来就是空白。运行下
npm ls react或yarn list react,看看有没有重复安装。总结一下排查顺序:
1. 先用原生 button 测试 Storybook 能不能渲染内容
2. 检查 Button 组件是否真的 return 了可见元素
3. 看是否有样式丢失(特别是 CSS-in-JS 或主题未注入)
4. 确认 webpack/vite 配置处理了样式文件
5. 排查依赖冲突,尤其是 react 和 react-dom 版本
我上周就是因为忘了在 decorators 里加 ThemeProvider,对着空白页面发呆两个小时……真不想再经历第二次。