diff --git a/docs/design/storybook-investigation.md b/docs/design/storybook-investigation.md new file mode 100644 index 00000000..2b3b0d00 --- /dev/null +++ b/docs/design/storybook-investigation.md @@ -0,0 +1,99 @@ +# Storybook導入 調査記録 + +## 目的 + +`packages/extension` へ Storybook を導入し、`OnboardingPage.tsx` の各ステップ +(`OnboardingStep` × `StepPhase` の組み合わせ)を個別に確認できるようにする +試みを行った。作業時間の制約により完了に至らなかったため、原因と得られた +知見を記録する。 + +## 採用した方針(概要) + +- `OnboardingPage` は自身の状態を `useOnboardingState` フックで管理しており、 + Props を受け取らない。そのため、各ステップ用の Story を個別に自作する + のではなく、`useOnboardingState.ts` に既に存在する e2e 用の URL 上書き + 機構(`?step=SEARCH&phase=value_shown`、`e2e/onboarding-shots.spec.ts` が + スクリーンショット撮影に使用しているもの)を Storybook からも流用する + 方針を取った。 +- `chrome.*` API は Storybook のプレビュー用に独自モック(`chrome.storage` + のメモリ実装、`chrome.i18n.getMessage` の実メッセージ引き当て等)を用意 + し、`Storage.setCommands(getDefaultCommands(locale))` を Story 読み込み時 + に実行して、本番の初回インストール時と同じ状態を再現する設計とした。 + +## 遭遇した問題と原因 + +### 1. Storybook の Vite ビルダーが、拡張機能用の `vite.config.ts` を自動で読み込んでしまう + +- `@storybook/react-vite` は既定で `.storybook` の親ディレクトリにある + `vite.config.ts` を自動検出し、Storybook 用の設定にマージする仕様になっ + ている(`@storybook/builder-vite` 内部の `getBuilderOptions()` / + `loadConfigFromFile()`)。 +- 本プロジェクトの `vite.config.ts` は Chrome 拡張機能のビルド専用で、 + `@crxjs/vite-plugin`(manifest.json の解釈やコンテンツスクリプトの特別 + なバンドリング)や、Shadow DOM 環境向けにカスタムした + `vite-plugin-css-injected-by-js` の `injectCodeFunction` + (`document.getElementById("selection-command")?.shadowRoot ?? document.head` + への注入)を含んでいる。 +- これが Storybook のプレビュー(通常の DOM ページ)に対しても適用されて + しまい、 + - `@crxjs/vite-plugin` の HMR ハンドラがエラーを送出してオーバーレイ + 表示になる + - CSS が期待通り `