Open10

Reading Storybook

nus3nus3

ディレクトリ構造

.
├── code  // Storybookの本体周り
│   ├── __mocks__
│   ├── addons
│   ├── e2e-tests
│   ├── frameworks
│   ├── lib
│   ├── node_modules
│   ├── presets
│   ├── renderers
│   └── ui
├── docs
│   ├── addons
│   ├── api
│   ├── assets
│   ├── builders
│   ├── configure
│   ├── contribute
│   ├── essentials
│   ├── get-started
│   ├── sharing
│   ├── snippets
│   ├── versions
│   ├── writing-docs
│   ├── writing-stories
│   └── writing-tests
├── node_modules
├── sandbox  rootで`yarn start`すると生成される環境
│   └── react-vite-default-ts
├── scripts  rootで`yarn start`した際に実行されるファイルが
│   ├── node_modules
│   ├── prepare
│   ├── sandbox
│   ├── tasks
│   └── utils
└── test-storybooks
    ├── ember-cli
    ├── external-docs
    ├── server-kitchen-sink
    └── standalone-preview
nus3nus3

storybook devが実行されて、Manager app 部分がレンダリングされるまでの流れ

3 行まとめ

  • yarn startで sandbox 環境が構築され、すぐに動作確認ができる
  • storybook devでは Express が起動し、ejs から HTML がレンダリングされる
  • Manager app 部分は@storybook/managerパッケージが該当しており、React で実装されている

処理の流れ

  1. storybook パッケージの index.js が実行され、@storybook/cli/bin/indexが require される
  2. @storybook/cli パッケージのbin/index.jsが実行され、'../dist/generate.js'が require される
  3. require されたcode/lib/cli/src/generate.ts(ビルド前)で、commanderを使って storybook devコマンドが定義される
  4. storybook devコマンドでは、code/lib/cli/src/dev.tsdev関数が実行される
  5. dev関数では、@storybook/core-serverパッケージのbuildDevStandaloneが実行される
  6. buildDevStandaloneではcode/lib/core-server/src/dev-server.tsで定義されたstorybookDevServerが実行される
  7. storybookDevServerでは Express を使ってサーバーが起動
  8. @storybook/builder-managerパッケージが提供するビルダーを使ってベースとなる HTML をレンダリング
  9. Manager app と呼ばれる部分は@storybook/managerパッケージで React でレンダリングされる
nus3nus3

今回登場する code 配下のディレクトリ

.
├── frameworks
│   └── react-vite
├── lib
│   ├── builder-manager // 8. @storybook/builder-manager
│   ├── builder-vite
│   ├── cli // 2~5. @storybook/cli
│   ├── cli-storybook  // 1. storybook
│   └── core-server // 6~7. @storybook/core-server
└── ui
    └── manager // 9. @storybook/manager
nus3nus3

2~5. @storybook/cli

@storybook/cli/bin/index.jsではgenerate.jsを require している

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/cli/bin/index.js#L9


generate.jsのビルド前のコードはcode/lib/cli/src/generate.tsであり、ここではstorybook devを含むコマンドの処理が実装されている。

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/cli/src/generate.ts#L184


storybook devコマンドではdev関数が実行され、@storybook/core-serverbuildDevStandaloneが呼び出される

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/cli/src/dev.ts#L38

nus3nus3

6~7. @storybook/core-server

@storybook/core-serverbuildDevStandaloneでは dev サーバーの起動にstorybookDevServerが実行されている

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/core-server/src/build-dev.ts#L127-L129


storybookDevServerでは Express を使ってサーバーが起動

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/core-server/src/dev-server.ts#L24


Manager app 部分はmanagerBuilder.start()でレンダリングされている

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/core-server/src/dev-server.ts#L79-L85

managerBuilderの実態は'@storybook/builder-manager'を import したもの

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/core-server/src/utils/get-builders.ts#L4

nus3nus3

8. @storybook/builder-manager

managerBuilder.start()ではstarter関数が実行される

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/src/index.ts#L288


starter 関数では html をレンダリングし、/のレスポンスとして渡している

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/src/index.ts#L166-L188

また、テンプレートエンジンとして ejs が使われる

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/src/utils/data.ts#L18

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/templates/template.ejs


このテンプレートではクライアントサイドの runtime として'./sb-manager/runtime.js'が import される

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/templates/template.ejs#L60

./sb-manager/runtime.js@storybook/managerパッケージで生成された js ファイル
(coreDirOriginのパスが@storybook/managerになっている)

`coreDirOrigin: '/storybook/sandbox/react-vite-default-ts/node_modules/@storybook/manager/dist'`

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/lib/builder-manager/src/index.ts#L160

nus3nus3

9. @storybook/manager

./sb-manager/runtime.jsのビルド前のcode/ui/manager/src/runtime.tsではrenderStorybookを使ってクライアントサイドのレンダリングをしてる

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/ui/manager/src/runtime.ts#L61


renderStorybookでは React をレンダリングしている

https://github.com/storybookjs/storybook/blob/529089564eb1b369603ee3c563c3ed6f585002f9/code/ui/manager/src/index.tsx#L76