我们来比较一下Storybook和Ladle的设置

这篇文章的简要内容

在个人开发中,经常会遇到需要一个组件目录的情况。不过,只要能够进行简单的显示确认,快速准备并且轻便的工具就可以了。在这种情况下,我觉得并不需要特意使用Storybook。

因此,我决定尝试一下只是听说过名字的 Alternative Storybook – Ladle。

 

准备React

暫時為了比較,我想設置 Storybook,但無法在空的專案下執行storybook init指令。
因此,我將簡單準備React。

bun init
bun i react react-dom
bun i -d @types/react @types/react-dom

目前的文件結構等如下所示。

.
├── README.md
├── bun.lockb
├── index.ts
├── package.json
└── tsconfig.json
{
  "name": "comparing-storybook-ladle",
  "module": "index.ts",
  "type": "module",
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/react": "^18.2.42",
    "@types/react-dom": "^18.2.17",
    "bun-types": "latest"
  },
  "peerDependencies": {
    "typescript": "^5.0.0"
  }
}

故事书 shū)

我們這次沒有打算製作應用程式本身,所以我們將繼續進行Storybook的設置。

bunx storybook@latest init

等了2、3分钟后,成功地启动了。

以下是当前文件结构等内容。

.
├── README.md
├── bun.lockb
├── index.ts
├── package.json
├── stories
│   ├── Button.stories.ts
│   ├── Button.tsx
│   ├── Configure.mdx
│   ├── Header.stories.ts
│   ├── Header.tsx
│   ├── Page.stories.ts
│   ├── Page.tsx
│   ├── assets
│   │   ├── 省略
│   ├── button.css
│   ├── header.css
│   └── page.css
└── tsconfig.json
{
  "name": "comparing-storybook-ladle",
  "module": "index.ts",
  "type": "module",
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@storybook/addon-essentials": "^7.6.4",
    "@storybook/addon-interactions": "^7.6.4",
    "@storybook/addon-links": "^7.6.4",
    "@storybook/addon-onboarding": "^1.0.9",
    "@storybook/blocks": "^7.6.4",
    "@storybook/react": "^7.6.4",
    "@storybook/react-vite": "^7.6.4",
    "@storybook/test": "^7.6.4",
    "@types/react": "^18.2.42",
    "@types/react-dom": "^18.2.17",
    "bun-types": "latest",
    "storybook": "^7.6.4"
  },
  "peerDependencies": {
    "typescript": "^5.0.0"
  },
  "scripts": {
    "storybook": "storybook dev -p 6006",
    "build-storybook": "storybook build"
  }
}

自动生成的各种各样的功能由init命令负责确实很方便,但是仅凭要准备三个组件和一个文档就需要花费很长时间的印象。
此外,我是“依存关系越少越好”的派别,所以一次性有太多的依赖让我感到有些气馁。

请不要自行安装 @storybook/addon-onboarding 这样的东西进行Onboarding。

舀勺

这里开始是正题。
我将尝试设置Ladle。
既然这样,我会尽力使其显示与由storybook init生成的内容相同。

回到准备React阶段,继续进行设置。

bun i @ladle/react

让我们尝试执行 storybook init 生成的代码,并显示以下的 4 个内容。

    • Button.stories.ts

 

    • Header.stories.ts

 

    • Page.stories.ts

 

    Configure.mdx

共同之处-更改文件扩展名

故事书使用.ts的文件扩展名是可以的,但是勺子必须使用.tsx否则组件无法运行。

此外,还需要将.mdx更改为.stories.mdx。

按钮

公式文档的撰写方式有些改变,但是按照这样的方式做,它就正常工作了。

import type { StoryDefault, Story } from "@ladle/react";
import { Button } from "./Button";

type StoryType = Story<React.ComponentProps<typeof Button>>;

const ButtonStory: StoryType = (props) => <Button {...props} />;
ButtonStory.storyName = "Button";

export default {
  args: {
    primary: false,
    size: "medium",
    label: "Button",
  },
  argTypes: {
    backgroundColor: {
      control: {type: "color"},
    },
    size: {
      control: {type: "select"},
      options: ["small", "medium", "large"],
    },
  }
} satisfies StoryDefault

export const Primary = ButtonStory.bind({});
Primary.args = {
  primary: true,
};

export const Secondary = ButtonStory.bind({});

export const Large = ButtonStory.bind({});
Large.args = {
  size: "large",
};

export const Small = ButtonStory.bind({});
Small.args = {
  size: "small",
};

在公式中介绍的内容往往是在stories文件中首次编写标记,而不是导入在另一个文件中定义的组件。

只要按照所介绍的方法进行模仿,可能会导致 props 的类型被写两次,所以为了避免这种情况,我采用了 type StoryType = Story<React.ComponentProps>; 来获取并成功解决了这个问题。

 

整體來說,我覺得 Storybook 6.x 系列的寫作方式與這個很相似。

 

标题

按钮几乎没有变化,所以省略了说明。

import type { Story } from "@ladle/react";
import { Header } from "./Header";

type StoryType = Story<React.ComponentProps<typeof Header>>;

const HeaderStory: StoryType = (props) => <Header {...props} />;
HeaderStory.storyName = "Header";

export const LoggedIn = HeaderStory.bind({});
LoggedIn.args = {
  user: { name: "Jane Doe" },
};

export const LoggedOut = HeaderStory.bind({});

页面

用storybook init创建的Page通过play函数显示登录状态。
虽然在Ladle中也可以使用Playwright来实现,但在Ladle的依赖关系中的Vite和fsevents出现了某些错误,无法运行……。

我感到很沮丧,但这次我决定放弃了。

import type { Story } from "@ladle/react";
import { Page } from "./Page";

type StoryType = Story<React.ComponentProps<typeof Page>>;

export const PageStory: StoryType = (props) => <Page {...props} />;
PageStory.storyName = "Page";

配置

只要更改了文件后缀,就能成功显示了。

请进行比较

我认为,我们可以实现文章开头所提到的目标:“只需要确认显示,并且迅速准备好且轻便的东西。”这是因为它具有快速启动和少依赖关系等特点。

我也很高兴不再需要配置文件和像.ladle这样的文件夹了。

虽然外观看起来简洁,但是同时追求外观上的豪华感与提出的要求不够一致,给人一种不够统一的感觉,但这样也可以接受。

由于公式文档以外的信息几乎没有,所以在工作中使用它让我感到害怕,但是在个人开发中,我想再试一次。

广告
将在 10 秒后关闭
bannerAds