ロゴテキスト ロゴ

    NuxtにStorybookを導入する

    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が起動出来た

    起動出来た!



    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>
    module cssが動作している

    .gitignoreと.nuxtignoreの設定

    .gitignoreへの追記

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

    .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をひとまとめにしたパッケージが含まれていてそれを無効にする方法も記載しています。

    プロフィールの背景画像 プロフィール画像
    Yuki Takara
    都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。