setup-react-native-storybook について
React Native プロジェクトに Storybook v10 を導入するためのセットアップスキルです。Expo、Expo Router、React Native CLI、Re.Pack に応じた手順と共通設定を案内します。
主な機能
- 01プロジェクト別の4つの手順
- 02パッケージマネージャーに応じたコマンド
- 03Storybook の初期化と設定
- 04Metro または Re.Pack の設定
- 05WebSocket とストーリー検索の設定
活用シーン
- 01Expo アプリへの Storybook 導入
- 02Expo Router での Storybook 設定
- 03React Native CLI プロジェクトのセットアップ
- 04Re.Pack への Storybook 組み込み
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ storybookjs/ react-native --skill setup-react-native-storybookインストール後、Claude Code で/setup-react-native-storybookを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/expo-router-setup.mdexpo-setup.mdreact-native-cli-setup.mdrepack-setup.md詳細
React Native Storybook のセットアップ
React Native プロジェクトに @storybook/react-native v10 を追加します。
重要: プロジェクトのパッケージマネージャーを検出し(yarn.lock、pnpm-lock.yaml、または bun.lockb を確認)、すべてのインストール/実行コマンドで npm の代わりに使用してください。以下の例では npm を使用していますが、適宜置き換えてください(例:npm install の代わりに yarn add、npm run storybook の代わりに yarn storybook)。Expo プロジェクトでは、依存関係をインストールする際に npx expo install(または bunx expo install など)を使用し、Expo が互換性のあるバージョンを解決できるようにしてください。
init コマンドには、以下のフラグを指定した <pm> create storybook を使用してください。フラグの前に -- が必要なのは npm のみです。npx/bunx などは絶対に使用しないでください。
プロジェクトの種類に応じた 4 つのセットアップフロー:
- Expo(ルーターなし) - references/expo-setup.md を参照
- Expo Router を使用する Expo - references/expo-router-setup.md を参照
- React Native CLI(Expo なし) - references/react-native-cli-setup.md を参照
- Re.Pack(rspack/webpack) - references/repack-setup.md を参照
フローの選択
- プロジェクトに
rspack.configまたはwebpack.configがあり、@callstack/repackを使用している -> Re.Pack - プロジェクトに
_layout.tsxを含むapp/ディレクトリがあり、expo-routerを使用している -> Expo Router - プロジェクトで Expo を使用しているが、ファイルベースのルーティングは使用していない -> Expo
- プロジェクトで
@react-native-community/cliを使用しており、Expo を使用していない -> React Native CLI
共通の手順(すべてのフロー)
1. CLI Init を実行する
npm create storybook -- --type react_native --yes
# or: pnpm create storybook --type react_native --yes
# or: bun create storybook --type react_native --yes
これにより依存関係がインストールされ、.rnstorybook/ に main.ts、preview.tsx、index.tsx が作成されます。
2. .rnstorybook/index.tsx で WebSocket を有効にする
生成された .rnstorybook/index.tsx を更新して、WebSocket のサポートを有効にします。リモート制御と Storybook の Web コンパニオンとの同期に必要です。
// .rnstorybook/index.tsx
import AsyncStorage from '@react-native-async-storage/async-storage';
import { view } from './storybook.requires';
const StorybookUIRoot = view.getStorybookUI({
storage: {
getItem: AsyncStorage.getItem,
setItem: AsyncStorage.setItem,
},
enableWebsockets: true,
});
export default StorybookUIRoot;
プロジェクトに @react-native-async-storage/async-storage がない場合は、インストールしてください。
npm install @react-native-async-storage/async-storage
3. main.ts のストーリーの Glob を更新する
CLI は .rnstorybook/main.ts にデフォルトの stories グロブを生成します。既存のグロブはそのまま残し、プロジェクト内で UI コンポーネントが実際に配置されている場所を指すエントリーを追加してください。components/、src/components/、src/、ui/ などのディレクトリを確認してください。
// .rnstorybook/main.ts
const main: StorybookConfig = {
stories: [
'./stories/**/*.stories.?(ts|tsx|js|jsx)', // example stories from init
'../src/components/**/*.stories.?(ts|tsx|js|jsx)', // add based on project structure
],
// ...
};
4. バンドラーを設定する
Metro プロジェクトでは、Metro の設定を withStorybook でラップします。Re.Pack プロジェクトでは、rspack/webpack の設定に StorybookPlugin を追加します。詳しくは、該当するリファレンスファイルを参照してください。
5. エントリーポイントを作成する
Storybook のレンダリング方法はフローごとに異なります。該当するリファレンスファイルを参照してください。
6. 実行する
npm run start
npm run ios # or npm run android
withStorybook のオプション(Metro)
module.exports = withStorybook(config, {
enabled: true, // Remove Storybook from bundle when false
configPath: './.rnstorybook', // Optional and redundant when using the default ./.rnstorybook folder
useJs: false, // Generate .js instead of .ts
docTools: true, // Auto arg extraction
liteMode: false, // Mock default UI deps (use with react-native-ui-lite)
websockets: { port: 7007, host: 'localhost' }, // Remote control
});
StorybookPlugin のオプション(Re.Pack)
new StorybookPlugin({
enabled: true, // Strip Storybook from bundle when false
configPath: './.rnstorybook', // Optional and redundant when using the default ./.rnstorybook folder
useJs: false, // Generate .js instead of .ts
docTools: true, // Auto arg extraction
liteMode: false, // Mock default UI deps (use with react-native-ui-lite)
websockets: 'auto', // 'auto' detects LAN IP, or { port: 7007, host: 'localhost' }
});