加入直播会议:美国东部时间周四上午 11 点,Storybook 9 发布及 AMA

Storybook for Qwik:独立查看 Qwik 组件。

在 Github 上查看

Storybook Qwik 框架

这是一个允许将 StorybookQwik 结合使用的框架。

限制

  • 这仅在新创建的 Qwik 应用和组件库上测试过。
  • 组件更改时,故事会完全重新加载(无热模块替换)
  • 目前还没有自动化工具可以方便地在 Qwik 项目中搭建 Storybook 脚手架。
  • 故事在开发模式下运行 - 不会发生 SSR 或序列化

设置

在现有的 Qwik 项目中,运行 npx storybook@next init(需要 Storybook 7)

有关开始使用 Storybook 的最佳文档,请参阅Storybook 文档

用法

一个基本的故事看起来像这样

import Header, { HeaderProps } from "./header";
import { StoryObj } from "storybook-framework-qwik";

export default {
  title: "Header",
  component: Header, // component value may be a `component$`, or a "Lite component" (function component)
} as Meta<HeaderProps>;

export const Default: StoryObj<HeaderProps> = {};

您可以为每个 Meta 或每个故事包含一个自定义渲染器。但是,渲染器不能使用 Qwik 特性(例如 useStore)。如果您在故事中需要 Qwik 特性,请为组件创建一个包装器。当组件期望其 props 是响应式状态(例如 useStoreuseSignal)时,这很有用。

import {
  ReactiveComponent,
  ReactiveComponentProps,
} from "./reactive-component";
import { Meta, StoryObj } from "storybook-framework-qwik";
import { component$, useStore } from "@builder.io/qwik";

const ReactiveComponentWrapper = component$<ReactiveComponentProps>((args) => {
  const state = useStore(args.state);
  return <ReactiveComponent state={state} />;
});

export default {
  title: "Reactive Component",
  component: ReactiveComponent,
  render: (args) => <ReactiveComponentWrapper state={args.state} />,
  args: { state: { number: 1 } },
} as Meta<ReactiveComponentProps>;

export const Default: StoryObj<ReactiveComponentProps> = {};

装饰器 (Decorators)

要创建故事装饰器,请创建一个返回 JSX 的函数,其中包含作为参数传递给装饰器的 StoryFn

import { JSXNode } from "@builder.io/qwik";
import { MyComponent } from "./my-component";
import { Decorator } from "storybook-framework-qwik";

export const myDecorator: Decorator = (Story) =>
  // Cast is needed because something is out of sync with the JSXNode generated in tsx files and the type expected by Decorator
  (<MyComponent>{Story()}</MyComponent>) as JSXNode;

Qwik City

如果在组件中使用 QwikCity 特性,您可能需要导入 qwikCityDecorator,它将故事包装在 MockQwikCityProvider 中。可以通过在 .storybook/preview.ts 的装饰器数组中导出装饰器来将其添加到所有故事中。

import { qwikCityDecorator } from "storybook-framework-qwik/qwik-city-decorator";
export const decorators = [qwikCityDecorator];

您还可以将装饰器添加到单个故事或故事文件中。

因为此框架仅作为 ESM 模块发布,所以您可能需要在 package.json 中添加 "type": "module"(或者在您的 .storybook 文件夹内创建一个 package.json,以便此设置仅应用于 Storybook)。

故障排除

如果您正在使用 MDX 文件并遇到类似以下错误

Failed to resolve import "react/jsx-dev-runtime"

您可能需要安装 react 作为开发依赖项。

演示

这里有一个使用此包最新版本的简单 Storybook 示例。

鸣谢

此包的许多部分基于我从这个 PR 获取的代码,而这个 PR 又从这个讨论 中获得了一些想法。