NuxtにStorybookを導入する

2020.10.31
2020.11.02
NuxtにStorybookを導入する

Nuxt.jsのプロジェクトにStorybookを導入します。


Storybook公式の動画見ると「お〜〜!」てなりますね!

こんなに整った環境を作るのは中々難しいけど、でもすごい!

検証した環境

1 Nuxt 2.14.3
2 @nuxtjs/storybook 3.0.0

パッケージのインストール

パッケージを導入

$ yarn add --dev @nuxtjs/storybook

公式GitHubに以下のように書かれているため、2.14.0以下のバージョンの方は注意が必要です

If you are using Nuxt < 2.14.0, you need to use core-js@3

nuxt-community/storybook: Storybook integration with Nuxt.jsより引用

調べていると @storybook/vue を使ってStorybookに対応する記事がいくつかありましたが、
記述量の少ない @nuxtjs/storybook でも問題なかったためこちらで進めます。



起動出来ることの確認

まだコンポーネントも何も作っていないのと公式の進め方と外れてしまいますが、
先に $ yarn nuxt storybook でStorybookが起動出来ることを確認します。

$ yarn nuxt storybook
・・・
・・・
webpack built d734592276f0d03376b2 in 9643ms
╭────────────────────────────────────────────────────╮
│                                                    │
│   Storybook 3.0.0 started                          │
│   8.52 s for manager and 12 s for preview          │
│                                                    │
│    Local:            http://localhost:3003/        │
│    On your network:  http://192.168.0.107:3003/    │
│                                                    │
╰────────────────────────────────────────────────────╯
No issues found.

http://localhost:3003/ にアクセスすると


起動出来た!



Storybookで起動するポート番号を変更する場合は nuxt.config.js を

nuxt.config.js
export default {
  storybook: {
    // Run Storybook on localhost:4000
    port: 4000
  }
}

とすることで変更もできます

サンプルコンポーネントを表示

Storybookが起動出来ることが確認出来たので、コンポーネントを表示してみます。


Storybookで表示するには <対応するコンポーネント名>.stories.js と付ける必要があるためここでは以下のようにします。

components/
  TextSample.stories.js
  TextSample.vue

書き出された main.js の中身を見ると

const stories = ['../../components/**/*.stories.@(ts|js)']


と書かれているため「components/」フォルダ内の */stories.ts*.stories.js をデフォルトで読み込んでくれるようになっています。





「TextSample.vue」の内容は <slot/> で渡した文字列を表示しつつ、
type="primary" というpropsを受け取った場合のみ、isPrimaryクラスを付与して見た目を変える、というコンポーネントです。

TextSample.vue
<template>
  <p class="text" :class="{ isPrimary: type === 'primary' }"><slot /></p>
</template>

<script>
export default {
  props: {
    type: {
      type: String,
      default: ''
    }
  }
}
</script>

<style scoped>
.text {
  font-size: 20px;
}

.text.isPrimary {
  color: #f0f;
  font-weight: bold;
}
</style>

Storybookに表示するためのファイルには「type="primary"」を渡した場合/渡さなかった場合どちらも表示してみます

TextSample.stories.js
export default { title: 'TextSample' }

export const sample1 = () => '<text-sample>sample text</text-sample>'
export const sample2 = () => '<text-sample type="primary">sample text</text-sample>'

scssやmodule cssへの対応

@nuxtjs/storybook はデフォルトで scssmodule css に対応しています。

そのため、先程のコンポーネントを以下のようにしても問題なく動きます。

TextSample.vue
<template>
  <p :class="[$style.text, { [$style.isPrimary]: type === 'primary' }]"><slot /></p>
</template>

<script>
export default {
  props: {
    type: {
      type: String,
      default: ''
    }
  }
}
</script>

<style lang="scss" module>
.text {
  font-size: 20px;

  &.isPrimary {
    color: #f0f;
    font-weight: bold;
  }
}
</style>

.gitignoreと.nuxtignoreの設定

.gitignoreへの追記

ここまで実行すると「.nuxt-storybook」というフォルダが作成されています


これらはStorybookをlocalhostで確認する際に作られているファイル群です。


Git管理する必要がないファイルになるため、.gitignoreに追加しましょう。

.gitignore
.nuxt-storybook
storybook-static

ホスティングを行う際に実行する $ yarn nuxt storybook build で作られる「storybook-static」というフォルダもignoreに合わせて追加してます。

.nuxtignoreへの追記

Nuxtのビルド時にstorybookのファイルは含める必要がありません。

そのため「.nuxtignore」に1文追加します。

.nuxtignore
**/*.stories.js

npm-scriptsへの登録(お好み)

npm-scriptsに登録しておくと何かと便利なので追加します

package.json
{
  "scripts": {
    "storybook": "nuxt storybook"
  },
  ・・・

これで以下のコマンド実行出来るようになりました!

$ yarn run storybook

Addonの追加や変更

別途記事書きました!

@nuxtjs/storybook には デフォルトで @storybook/addon-essentials というよく使われるAddonをひとまとめにしたパッケージが含まれていてそれを無効にする方法も記載しています。

おすすめ