🙌

三目並べをStorybookにする

2024/06/08に公開

はじめに

reactのチュートリアルやっていて、コンポーネントをどんどん追加したくなりましたが、後でStorybookを導入した時にStoryを作りやすい感じのコンポーネントにしておきたくて調べてみました(そんなのあるのか?)。

既存のプロジェクトにStorybook追加

事前に調べた感じだと、storybookに関しては、Chromaticで公開, アプリ(3目並べ)に関しては引き続きGitHub Pagesがいいかなと思いました。

話はそれますが、Storybookのチュートリアルをざっと眺めてみたんですが、Reduxが登場したり、mswを使ったAPIのインターセプトの方法が出てきたりかなり難易度が高かったです。
少なくともReduxのチュートリアルは、ざっと眺めていく必要がありそうです。
※初学者にはかなりきつそう

まず、Toggleのstoriesを追加

最低限動くようにしてみました。

https://github.com/na8esin/react-vite-practice/blob/11221e7bf56de70d22cfa3b57bbabdaf87ff8264/src/components/Toggle.stories.tsx
Toggleだけだとこんなものですね。

Storybook上ではこんな感じで動きます。

難易度が高そうなSquareコンポーネントのstoriesを作成

Squareはpropsも色々あって、複雑そうです。
cssがindex.cssみたいな共通のところにあったり、まだ追加してない機能(勝利に繋がったラインの色を変える)も実装したかったので、別のファイルに分離しました。

https://github.com/na8esin/react-vite-practice/blob/592cda66f6b0bf31403559fda5410f9dbb7525b2/src/components/Square.tsx
さらに、こっちは、Toggleと違って、styled-componentsを使ってみました。
styled-componentsの方は、若干学習コストがあるが、柔軟性がある感じでしょうか。
その柔軟性を利用して、勝利ラインの一部かどうかをpropsとして渡して、色を変えることにしました。

storiesも最初はこんな感じで用意してみました

Square.stories.ts
import type { Meta, StoryObj } from '@storybook/react';
import { fn } from '@storybook/test';
import { Square } from "./Square";

const meta = {
  title: "Square",
  component: Square,
  tags: ["autodocs"],
  args: {
    onSquareClick: fn()
  },
} satisfies Meta<typeof Square>;

export default meta;
type Story = StoryObj<typeof meta>;

export const Default: Story = {
  args: {
    value: null,
    partOfWonLine: false,
  }
};

autodocsでエラー

Square.storiesのDocsでエラーが発生しました。

type SquareValue = "X" | "O" | nullこんな感じの型をpropsのvalueという値に設定してるんですが、下記のようなエラーが発生して、うまく動きませんでした。

このエラーはこんな感じのコードで怒られる時と同じですね。

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <div>{{}}</div>
      {/* ↑ここでエラーになる */}
    </div>
  );
}

↓あたりのissueが関係そうに見えます。。。
https://github.com/storybookjs/storybook/issues/25305
うーん、難しい。

ただ、npx storybook@latest initで生成された、ExampleのButton.tsxはsize?: 'small' | 'medium' | 'large';みたいな型があるので、なんでだろ?と思ったんですが、nullがどうやら悪さをするようで、削除するとさっきのエラーは出なくなりました。

でも、今更nullを削除すると動作が変わって困るので、若干調べてみました。
色々調べてみたところ、autodocsの機能は、react-docgenを利用しているようで、そこに問題があるようだと。
なので、下記で先ほどの型を入力してみました。
https://react-docgen.dev/playground
入力結果↓

↑を見ると赤で囲った部分のnullのところにvalueがなくて、何か変な感じがします。
ただ、ここからは深みにハマる予感がしたので、調査はやめにして、argTypesを使って下記のようにすることで乗り切りました。
https://github.com/na8esin/react-vite-practice/blob/781c5fc12b1c28748b8ef6d4f8fbd2ae60009c3a/src/components/Square.stories.ts
storybookでの表示↓

GitHub ActionsでChromaticへデプロイ

ひと段落したので、この辺で、Chromaticにデプロイすることにしました。

この辺りの手順を上から実施していく感じになると思います。
https://storybook.js.org/tutorials/intro-to-storybook/react/en/deploy/

workflows用のymlファイルは、全部コピペしてしまうと冗長なので、必要な部分だけ加えていきます。
今回追加したのは、こんな感じになります。
https://github.com/na8esin/react-vite-practice/compare/9eca6a4593a06765540164a1f1757ae0a727ee22...781c5fc12b1c28748b8ef6d4f8fbd2ae60009c3a
Nodeのセットアップ等は、GitHub Pagesにデプロイできている時点で完了しているので、あまり追加することがないかと思います。

最後に

GitHub Pagesは引き続きこちら↓
https://na8esin.github.io/react-vite-practice/
Storybookはこちら↓で確認することができます。
https://6662b0223b9e9597e66125ab-txialjsxlb.chromatic.com/

しくみのテックブログ

Discussion