文档
Storybook 文档

图片、字体和资源

组件通常依赖于图片、视频、字体和其他资源,以按照用户的预期进行渲染。在故事文件中使用这些资源有多种方法。

将资源导入故事

您可以通过导入(或要求)任何媒体资源来导入它们。它与我们的默认配置开箱即用。但是,如果您使用的是自定义 webpack 配置,则需要添加 文件加载器 来处理所需的文件。

之后,您可以在故事中使用任何资源

MyComponent.stories.ts|tsx
import type { Meta, StoryObj } from '@storybook/react';
 
import imageFile from './static/image.png';
 
import { MyComponent } from './MyComponent';
 
const meta: Meta<typeof MyComponent> = {
  component: MyComponent,
};
 
export default meta;
type Story = StoryObj<typeof MyComponent>;
 
const image = {
  src: imageFile,
  alt: 'my image',
};
 
export const WithAnImage: Story = {
  render: () => <img src={image.src} alt={image.alt} />,
};

通过 Storybook 配置提供静态文件

我们建议通过 Storybook 提供静态文件,以确保您的组件始终拥有其需要加载的资源。我们建议对组件经常使用的资源(如徽标、字体和图标)使用此技术。

在启动 Storybook 时,配置一个目录(或目录列表)来存放您的资源。在您的主要 Storybook 配置文件(即 .storybook/main.js|ts)中使用 staticDirs 配置元素来指定目录

.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/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
  staticDirs: ['../public', '../static'],
};
 
export default config;

这里 ../public 是您的静态目录。现在像这样在组件或故事中使用它。

MyComponent.stories.ts|tsx
import type { Meta, StoryObj } from '@storybook/react';
 
import { MyComponent } from './MyComponent';
 
const meta: Meta<typeof MyComponent> = {
  component: MyComponent,
};
 
export default meta;
type Story = StoryObj<typeof MyComponent>;
 
// Assume image.png is located in the "public" directory.
export const WithAnImage: Story = {
  render: () => <img src="/image.png" alt="my image" />,
};

您还可以传递以逗号分隔且不带空格的目录列表,而不是单个目录。

.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/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
  staticDirs: ['../public', '../static'],
};
 
export default config;

甚至可以使用配置对象来定义目录

.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/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
  staticDirs: [{ from: '../my-custom-assets/images', to: '/assets' }],
};
 
export default config;

从 CDN 引用资源

将您的文件上传到在线 CDN 并引用它们。在本例中,我们使用的是占位符图片服务。

MyComponent.stories.ts|tsx
import type { Meta, StoryObj } from '@storybook/react';
 
import { MyComponent } from './MyComponent';
 
const meta: Meta<typeof MyComponent> = {
  component: MyComponent,
};
 
export default meta;
type Story = StoryObj<typeof MyComponent>;
 
export const WithAnImage: Story = {
  render: () => (
    <img src="https://storybook.org.cn/images/placeholders/350x150.png" alt="My CDN placeholder" />
  ),
};

绝对路径与相对路径

有时,您可能希望将 Storybook 部署到子路径中,例如 https://example.com/storybook

在这种情况下,您需要让所有图片和媒体文件都使用相对路径。否则,浏览器将无法找到这些文件。

如果您通过导入来加载静态内容,则此过程是自动的,您无需执行任何操作。

假设您与 Storybook 一起在 静态目录 中提供资源。在这种情况下,您需要使用相对路径来加载图片或使用 base 元素。

在故事中引用字体

配置 Storybook 从静态文件夹提供资源后,您可以在 Storybook 中引用这些资源。例如,您可以引用并应用自定义字体到您的故事。为此,请在配置目录(例如,.storybook)中创建一个 preview-head.html 文件,并添加一个 <link /> 标签来引用您的字体。

{/* .storybook/preview-head.html */}
 
{/* Pull in static files served from your Static directory or the internet */}
{/* Example: `main.js|ts` is configured with staticDirs: ['../public'] and your font is located in the `fonts` directory inside your `public` directory */}
<link rel="preload" href="/fonts/my-font.woff2" />
 
{/* Or you can load custom head-tag JavaScript: */}
 
<script src="https://use.typekit.net/xxxyyy.js"></script>
<script>
  try {
    Typekit.load();
  } catch (e) {}
</script>