React×TypeScriptでStorybookを5.1.9から6.0.26にメジャーアップデートしたハマりどころ
先日、Storybookを5系から6系にメジャーアップデートした。かなり手こずったので、同じ境遇にいる誰かのために、メモを残しておく。利用していたverは 5.1.9 (古い!)
まずは、素直にStorybookのメジャーアップデートコマンドを試す。
npx sb upgrade
これでStorybookを起動。
yarn storybook
これで動けば万事解決だが、そうはいかず。
94% after seal
という表示が出て94%のところでストップ。前のconfigファイルたちが悪さをしている可能性があるので、.storybook ディレクトリ配下を一旦すべて削除。storybookを再セットアップする。
npx sb init
yarn storybook
再び94%で止まった。同じ結果。package系で困ったときの伝家の宝刀、 node_modules/ の配下と yarn.lock の削除をしてもう一度try。
rm -rf node_modules/ yarn.lock
yarn install
yarn storybook
すると
╭───────────────────────────────────────────────────╮
│                                                   │
│   Storybook 6.0.26 started                        │
│   13 s for manager and 16 s for preview           │
│                                                   │
│    Local:            http://localhost:6006/       │
│    On your network:  http://192.168.11.8:6006/    │
│                                                   │
╰───────────────────────────────────────────────────╯
起動。あとは、下記の設定ファイルを元の設定に寄せていく。
.storybook/main.js
module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials"
  ]
}
設定ファイルを変更したら、storybookを再ビルドすることを忘れずに( package.json の記述内容によって下記コマンドは異なります)
yarn build-storybook
5.1.9と6系の違いで直面した問題のリスト
config.js, addon.js, presets.js -> main.js へ統合
storybookの5系までは設定ファイルが3つにセパレートされていたのですが、6系では .storybook/main.js というファイルに統合された。
参考: https://medium.com/storybookjs/declarative-storybook-configuration-49912f77b78
ちなみに、他にも以下の設定ファイルがある
- 
preview.js- globalなparameterやdecoratorの設定をするときはここに記述
 - ThemeProviderの設定とかを書く
 
 - 
manager.js- storybook自体のテーマとかを設定できる
- ex. グリッドの太さを変えたりとか
 
 
 - storybook自体のテーマとかを設定できる
 
※mediumのstorybookコミュニティをフォローしておくことをおすすめします。
書き方が全然違う
今まで(5.1.9)では以下のように書いていた。
import React from 'react';
import { storiesOf } from '@storybook/react';
import Button from './';
storiesOf('components/Button', module)
  .add('primary', () => (
    <Button text="送信" onClick={() => { console.info('click!'); }} />
  ))
6系ではかなり変わる。
import React from 'react';
import { Story, Meta } from '@storybook/react/types-6-0';
import { Button, ButtonProps } from './Button';
export default {
  title: 'components/Button',
  component: Button,
} as Meta;
const Template: Story<ButtonProps> = (args) => <Button {...args} />;
export const Primary = Template.bind({});
Primary.args = {
  text: "送信",
  onClick: () => { console.info('click!'); },
};
参考: https://storybook.js.org/docs/react/writing-stories/args
~/xxx/xxx のようなチルダ利用のファイルインポートができない問題
これはwebpackのconfigミスに起因しています。
参考:
Discussion