GatsbyJS + tailwindcss + Sass 環境にStorybookを導入する

## はじめに

Gatsby.jsにStorybookを導入しようと思ったんですが、tailwindcssとSassも欲しかったので、構築ついでにメモを残しておきます。

### 使用する主なフレームワークやパッケージ

- [GatsbyJS](https://www.gatsbyjs.org)
- [tailwindcss](https://tailwindcss.com)
- [Storybook](https://storybook.js.org)

## GatsbyJS プロジェクトを立ち上げる

まずはチュートリアルに沿って、GatsbyJSを導入します。
<https://www.gatsbyjs.org/docs/quick-start/>

一通り作業して起動を確認できればGatsbyJSプロジェクトの立ち上げはOKです。

### Sassを導入する

GatsbyJS にSassを導入します。これもマニュアルがあるので、それに沿って導入します。
<https://www.gatsbyjs.org/docs/sass/>

試しにひとつコンポーネントを作成してSassが正常に動作してるかチェックしてみます。

```jsx:src/components/hogehoge/index.js
import React from "react"
import hogehogeStyle from "./style.module.sass"

const Hogehoge = () => (
  <h1 className={hogehogeStyle.title}>
    ほげほげ
  </h1>
)

export default Hogehoge
```

```sass:src/components/hogehoge/style.module.sass
.title
  color: crimson
```

```jsx:src/pages/index.js
// 追加する
import Hogehoge from "../components/hogehoge/index"

// 任意の位置に追加する
<Hogehoge />
```

これで正常にSassが動作していることが確認できるはずです。

### tailwindcss を導入する

次に tailwindcss を導入していきますが、これもまたマニュアルがあるため、それに沿って導入します。
なお今回はマニュアルの _Option #3: SCSS_ を進めます。
<https://www.gatsbyjs.org/docs/tailwind-css/>

試しにsassファイルを編集してみます。

```sass:src/components/hogehoge/style.module.sass
.title
  @apply text-blue-700
```

色が変わってればプロジェクトの立ち上げは完了です。

## Storybook を導入する

大変ありがたいことにStorybookの導入方法すら、公式サイトにマニュアルがありますので、これに従い導入します。
<https://www.gatsbyjs.org/docs/visual-testing-with-storybook/>

導入ができたら一旦storybookを起動してみます。

```shell-session:shell
yarn run storybook
```

正常に起動したことを確認したら早速、先ほど作成したテストコンポーネント(hogehoge)をstoryに書いてみます。

```javascript:src/stories/hogehoge.stories.js
import React from "react"
import { storiesOf } from "@storybook/react"

import Hogehoge from "../components/hogehoge/index"

storiesOf(`Hogehoge`, module).add(`default`, () => (
  <Hogehoge />
))
```

すると下記の様なエラーが発生するはずです。

```shell-session:shell
ERROR in ./src/components/hogehoge/style.module.sass 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
```

loaderがないぞと怒っているので、`.storybook/webpack.config.js`に追加します。

### Storybook をSassとtailwindcssに対応させる

まずは必要なloaderをインストールします。

```shell-session:shell
yarn add -D style-loader css-loader sass-loader postcss-loader
```

`.storybook/webpack.config.js`に下記を追加します。

```javascript:.storybook/webpack.config.js
config.module.rules.push({
  test: /\.sass$/,
  use: [
    {
      loader: "style-loader"
    },
    {
      loader: "css-loader",
      options: {
        modules: {
          localIdentName: "[path]-[local]-[hash:base64:5]"
        }
      }
    },
    {
      loader: "postcss-loader",
      options: {
        config: {
          path: "./.storybook/postcss.config"
        }
      }
    },
    {
      loader: "sass-loader"
    }
  ]
})
```

`.storybook/postcss.config.js`を追加します。

```javascript:.storybook/postcss.config.js
module.exports = {
  plugins: [
    require("tailwindcss")
  ]
}
```

`tailwindcss.config.js`をコピーします。シンボリックリンクでも良いかもしれません。

```shell-session:shell
cp tailwindcss.config.js .storybook
```

あとはstorybookを実行すれば、無事作業完了です！

### まとめ

たったこれだけのことですが、意外とまとめてるところがなかったので書いてみました。
Storybookはデザイナーとエンジニアの意思の疎通のための道具として語られることが多いですが、未来の自分のために残すのにも非常に有益ですので、是非活用しましょう。

この記事についてもし不備などがありましたらご指摘いただけますと幸いです。