文档
Storybook 文档

故事

(**必需**)

父级:main.js|ts 配置

类型

| (string | StoriesSpecifier)[]
| async (list: (string | StoriesSpecifier)[]) => (string | StoriesSpecifier)[]

配置 Storybook 从指定位置加载故事。 您的意图是将故事文件与它所记录的组件放在一起。

•
└── components
    ├── Button.ts
    └── Button.stories.ts
.storybook/main.ts
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { StorybookConfig } from '@storybook/your-framework';
 
const config: StorybookConfig = {
  framework: '@storybook/your-framework',
  stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
};
 
export default config;

如果您想使用不同的命名约定,您可以使用 picomatch 支持的语法来修改 glob。

请记住,某些附加组件可能会假设 Storybook 的默认命名约定。

使用 glob 数组

Storybook 将从您的项目中加载故事,这些故事由此 glob 数组(模式匹配字符串)找到。

故事按它们在数组中定义的顺序加载。 这使您可以控制故事在侧边栏中的显示顺序。

.storybook/main.ts
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { StorybookConfig } from '@storybook/your-framework';
 
const config: StorybookConfig = {
  framework: '@storybook/your-framework',
  stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
};
 
export default config;

使用配置对象

此外,您可以自定义 Storybook 配置以根据配置对象加载故事。 此对象为 StoriesSpecifier 类型,定义如下。

例如,如果您想从 packages/components 目录加载故事,您可以将您的 stories 配置字段调整为以下内容

.storybook/main.ts
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { StorybookConfig } from '@storybook/your-framework';
 
const config: StorybookConfig = {
  framework: '@storybook/your-framework',
  stories: [
    {
      // 👇 Sets the directory containing your stories
      directory: '../packages/components',
      // 👇 Storybook will load all files that match this glob
      files: '*.stories.*',
      // 👇 Used when generating automatic titles for your stories
      titlePrefix: 'MyComponents',
    },
  ],
};
 
export default config;

当 Storybook 启动时,它将在 packages/components 目录中查找任何包含 stories 扩展名的文件,并为您的故事生成标题。

StoriesSpecifier

类型

{
  directory: string;
  files?: string;
  titlePrefix?: string;
}

StoriesSpecifier.directory

(**必需**)

类型:string

从哪里开始查找故事文件,相对于项目的根目录。

StoriesSpecifier.files

类型:string

默认值:'**/*.@(mdx|stories.@(js|jsx|mjs|ts|tsx))'

一个 glob,相对于 StoriesSpecifier.directory(没有前导 ./),匹配要加载的文件名。

StoriesSpecifier.titlePrefix

类型:string

默认值:''

自动标题 时,用于生成故事标题的前缀。

使用自定义实现

💡 Storybook 现在静态分析配置文件以提高性能。加载使用自定义实现的故事可能会降低此功能的性能或导致其失效。

您也可以调整 Storybook 配置并实现自定义逻辑来加载您的故事。例如,假设您正在处理一个包含特定模式的项目,而传统的加载故事方式无法解决此模式。在这种情况下,您可以按如下方式调整配置

.storybook/main.ts
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { StorybookConfig } from '@storybook/your-framework';
import type { StoriesEntry } from '@storybook/types';
 
async function findStories(): Promise<StoriesEntry[]> {
  // your custom logic returns a list of files
}
 
const config: StorybookConfig = {
  framework: '@storybook/your-framework',
  stories: async (list: StoriesEntry[]) => [
    ...list,
    // 👇 Add your found stories to the existing list of story files
    ...(await findStories()),
  ],
};
 
export default config;