vue3+vite+storybook+pnpmでハマったことメモ
StorybookがViteに対応していたので、試した際にハマったことなど。
pnpm起因の問題は使っている人には参考になるかもしれない。
pnpx sb initが動かない
Storybook for Viteに↓の記述があるので、pnpxとバージョンを読み替えて
npx sb@next init --builder storybook-builder-vite
↓を実行した。
npx sb init --builder storybook-builder-vite
結果動かず、Invalid Packageと怒られてしまう。 (EINVALIDPACKAGENAMEと表示されていた)
実行時 - pnpm : 6.13.0 - npm: 7.20.3 - node: v16.7.0
入れようとしたstorybookのバージョン - @storybook/vue3": 6.3.7
やったこと
↓を叩く
pnpx sb init -s pnpm install // storybookの起動に必要 pnpm add -D @storybook/cli panpm install
-s オプションを付与することで、package.jsonの変更は入るが、パッケージのインストールは実行されない。
pnpx を使った際の動作が内部的にどうなってるのか把握できてないが、pnpm側で実行させることで回避している(?). (内部的にはnpmを使ってたりするのか...?)
参考
Storybook 起動時に "Singleton client API not yet initialized" と怒られる
↓のIssueを参考に.storybook/main.jsに変更を加えた。
module.exports = { + async viteFinal(config) { + // suppress storybook error + // https://github.com/storybookjs/storybook/issues/10887#issuecomment-901109891 + config.resolve.dedupe = ['@storybook/client-api']; + return config; + }, stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], addons: ['@storybook/addon-links', '@storybook/addon-essentials'], core: { builder: 'storybook-builder-vite', }, };
Vue3のプラグインの読み込み方
Vue2までは↓のようにすれば良かったが、Vue3ではcreateAppで作成したオブジェクトに対してプラグインを読み込ませる必要がある。
import Vue from 'vue'; Vue.use(xxxxPlugin);
やったこと
以下のようにする
import { app } from '@storybook/vue3'; import { Button } from 'ant-design-vue'; app.use(Button); export const parameters = { actions: { argTypesRegex: '^on[A-Z].*' }, controls: { matchers: { color: /(background|color)$/i, date: /Date$/, }, }, };
コンポーネントがstoryでレンダリングされない
consoleを見ると以下のようなメッセージが出ていたので、
[Vue warn]: Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".
.storybook/main.jsのconfigにaliasを貼った。
async viteFinal(config) { config.resolve.alias = { /* fix this issue [Vue warn]: Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js". * */ vue: 'vue/dist/vue.esm-bundler.js', '@': path.resolve(__dirname, '/src'), };