cra-to-next-migration について
Create React App アプリを Next.js に移行するチーム向けのスキルです。優先度別のルールでルーティング、レンダリング、データ、スタイル、デプロイを扱い、最低対象バージョンを Next.js 16 としています。
主な機能
- 0117 カテゴリーにわたる優先度付き移行ルール
- 02CRA から Next.js App Router への移行案内
- 03ルーティングとデータ取得の変換
- 04レンダリング、コンポーネント、スタイルの指針
- 05環境設定、テスト、デプロイを網羅
活用シーン
- 01React Router アプリをファイルベースルーティングへ移行
- 02クライアント側のデータ取得をサーバーレンダリングへ移行
- 03CRA プロジェクトの設定と依存関係を更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vercel-labs/ migration-skills --skill cra-to-next-migrationインストール後、Claude Code で/cra-to-next-migrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
rules/api-cors.mdapi-headers-cookies.mdapi-http-methods.mdapi-middleware.mdapi-query-params.mdapi-rate-limiting.mdapi-request-body.mdapi-response-types.mdapi-route-handlers.mdassets-absolute-urls.mdassets-favicon.mdassets-manifest.mdassets-public-folder.mdassets-static-imports.mdbuild-bundle-analysis.mdbuild-docker.mdbuild-output.mdbuild-scripts.mdbuild-standalone.mdbuild-static-export.mdbuild-vercel.mdcomponents-boundary-placement.mdcomponents-children-pattern.mdcomponents-composition.mdcomponents-context-providers.mdcomponents-interleaving.mdcomponents-props-serialization.mdcomponents-server-default.mdcomponents-third-party.mdcomponents-use-client.md詳細
CRA から Next.js への移行ガイド
Create React App プロジェクトを Next.js に移行するための包括的なガイドです。ルーティング、データ取得、コンポーネント、スタイリング、デプロイを取り上げます。移行の影響度に応じて優先順位付けされた、17 のカテゴリーにわたる 148 のルールが含まれています。移行が正常に完了した後も、アプリケーションは移行前と同じように動作する必要があります。
適用するタイミング
次のような場合に、これらのガイドラインを参照してください。
- 既存の CRA アプリケーションを Next.js に移行する
- React Router のルートをファイルベースのルーティングに変換する
- クライアント中心のアプリで Server Components を採用する
- クライアントサイドレンダリングから SSR/SSG に移行する
- Next.js 用に環境変数を更新する
- Next.js 組み込みの機能で画像やフォントを最適化する
バージョンポリシー
Next.js 16.x 以降を使用してください。Next.js 14.x または 15.x は使用しないでください。
移行を始める前に、現在の最新バージョンを確認してください。
npm info next version
minor/patch アップデート用にキャレットを付け、package.json には最新バージョンを使用してください。この移行ガイドでサポートされる最小バージョンは ^16.0.0 です。
優先度別のルールカテゴリー
| 優先度 | カテゴリー | 影響度 | プレフィックス | ルール数 |
|---|---|---|---|---|
| 1 | プロジェクトのセットアップ | CRITICAL | setup- | 6 |
| 2 | 依存関係 | CRITICAL | deps- | 1 |
| 3 | ルーティング | CRITICAL | routing- | 17 |
| 4 | データ取得 | CRITICAL | data- | 11 |
| 5 | コンポーネント | HIGH | components- | 9 |
| 6 | 環境変数 | HIGH | env- | 6 |
| 7 | スタイリング | HIGH | styling- | 12 |
| 8 | パブリックアセット | MEDIUM | assets- | 5 |
| 9 | 画像 | MEDIUM | images- | 8 |
| 10 | フォント | MEDIUM | fonts- | 6 |
| 11 | SEO とメタデータ | MEDIUM | seo- | 9 |
| 12 | API ルート | MEDIUM | api- | 9 |
| 13 | 状態管理 | MEDIUM | state- | 8 |
| 14 | インテグレーション | MEDIUM | integrations- | 1 |
| 15 | テスト | LOW | testing- | 9 |
| 16 | ビルドとデプロイ | LOW | build- | 7 |
| 17 | よくある落とし穴 | HIGH | gotchas- | 24 |
クイックリファレンス
1. プロジェクトのセットアップ(CRITICAL)
setup-initial-structure- CRA のフォルダー構造を Next.js App Router に変換するsetup-package-json- 依存関係とスクリプトを更新するsetup-next-config- next.config.js を作成して設定するsetup-typescript- TypeScript の設定を移行するsetup-eslint- Next.js 用に ESLint を更新するsetup-gitignore- Next.js 用に .gitignore を更新する
2. 依存関係(CRITICAL)
deps-react19-compatibility- React 19 との互換性のために依存関係をアップグレードする
3. ルーティング(CRITICAL)
routing-basic-pages- コンポーネントをファイルベースのルートに変換しますrouting-dynamic-routes- 動的セグメントには [param] 構文を使用しますrouting-catch-all-routes- キャッチオールルートには [...slug] を使用しますrouting-optional-catch-all- オプションのキャッチオールには [[...slug]] を使用しますrouting-route-groups- 整理には (group) フォルダーを使用しますrouting-parallel-routes- 並列ルートには @slot を使用しますrouting-intercepting-routes- インターセプトルートには (..) を使用しますrouting-link-component- react-router の Link を next/link に置き換えますrouting-programmatic-navigation- useNavigate を useRouter に置き換えますrouting-use-params- useParams を Next.js の params に置き換えますrouting-use-search-params- useSearchParams を適切に置き換えますrouting-nested-layouts- ネストされたルートをレイアウトに変換しますrouting-loading-states- サスペンス用に loading.tsx を追加しますrouting-error-boundaries- エラー処理用に error.tsx を追加しますrouting-not-found- 404 ページ用に not-found.tsx を追加しますrouting-hash-based- クライアント専用アプリのハッシュベースルーティングに対応しますrouting-protected-routes- 保護されたルートのパターンを実装します
4. データ取得(CRITICAL)
data-useeffect-to-rsc- useEffect によるデータ取得をサーバーコンポーネントに変換しますdata-useeffect-to-ssr- useEffect を getServerSideProps に変換しますdata-useeffect-to-ssg- useEffect を getStaticProps に変換しますdata-client-fetch- 適切なパターンを使ってクライアント側のデータ取得を維持しますdata-server-actions- データ変更にはサーバーアクションを使用しますdata-revalidation- データ再検証の戦略を設定しますdata-streaming- データのストリーミングには Suspense を使用しますdata-parallel-fetching- サーバー上でデータを並列に取得しますdata-sequential-fetching- データの順次依存関係を処理しますdata-caching- fetch のキャッシュ動作を設定しますdata-client-library-init- useEffect 内でクライアント専用ライブラリを初期化します
5. コンポーネント(HIGH)
components-use-client- クライアントコンポーネントには 'use client' ディレクティブを追加しますcomponents-server-default- サーバーコンポーネントがデフォルトであることを理解しますcomponents-boundary-placement- クライアント境界を戦略的に配置しますcomponents-composition- クライアント側の JavaScript を最小限に抑えるため、コンポジションを使用しますcomponents-interleaving- サーバーコンポーネントとクライアントコンポーネントを交互に配置しますcomponents-props-serialization- props がシリアライズ可能であることを確認しますcomponents-children-pattern- サーバーコンポーネントを子として渡しますcomponents-context-providers- Context プロバイダーを適切に処理しますcomponents-third-party- サードパーティのクライアントコンポーネントをラップします
6. 環境変数(HIGH)
env-prefix-change- REACTAPP を NEXTPUBLIC に変更しますenv-server-only- サーバー専用にはプレフィックスのない変数を使用しますenv-runtime-config- 必要に応じてランタイム設定を使用しますenv-local-files- .env ファイルの読み込み順序を理解しますenv-build-time- ビルド時と実行時の環境変数の違いを理解しますenv-validation- 必須の環境変数を検証します
7. スタイリング(HIGH)
styling-global-css- グローバル CSS を app/layout.tsx に移動しますstyling-css-modules- CSS Modules はわずかな変更で動作しますstyling-sass- Sass のサポートを設定しますstyling-tailwind- Tailwind CSS を設定しますstyling-css-in-js- CSS-in-JS ライブラリに対応しますstyling-styled-components- SSR 用に styled-components を設定しますstyling-emotion- SSR 用に Emotion を設定しますstyling-component-styles- コンポーネントのスタイルを適切にインポートしますstyling-postcss- PostCSS を設定しますstyling-scss-global-syntax- :global は CSS Modules 内でのみ使用しますstyling-css-import-order- レイアウト内の CSS のインポート順序を制御しますstyling-dark-mode-hydration- ハイドレーションの不一致を起こさずにダークモードに対応します
8. 公開アセット(MEDIUM)
assets-public-folder- public フォルダーは同じように動作しますassets-static-imports- アセットには静的インポートを使用しますassets-absolute-urls- public プレフィックスを付けずにアセットを参照しますassets-favicon- favicon を app ディレクトリに配置しますassets-manifest- ウェブアプリマニフェストを設定します
9. 画像(MEDIUM)
images-next-image- img を next/image に置き換えるimages-required-dimensions- width と height を指定するimages-fill-prop- レスポンシブ画像には fill を使用するimages-priority- LCP 画像には priority を使用するimages-placeholder- ぼかしプレースホルダーを設定するimages-remote-patterns- リモート画像のドメインを設定するimages-loader- カスタム画像ローダーを設定するimages-optimization- 自動最適化について理解する
10. フォント(MEDIUM)
fonts-next-font- 最適化には next/font を使用するfonts-google-fonts- Google Fonts を適切に読み込むfonts-local-fonts- ローカルフォントファイルを読み込むfonts-variable-fonts- 可変フォントを設定するfonts-font-display- font-display 戦略を設定するfonts-preload- フォントの自動プリロードについて理解する
11. SEO とメタデータ(MEDIUM)
seo-metadata-api- react-helmet ではなく Metadata API を使用するseo-dynamic-metadata- 動的なメタデータを生成するseo-opengraph- Open Graph メタデータを設定するseo-twitter-cards- Twitter Card メタデータを設定するseo-json-ld- 構造化データ(JSON-LD)を追加するseo-canonical- canonical URL を設定するseo-robots- robots メタタグを設定するseo-sitemap- sitemap.xml を生成するseo-head-component- next/head から Metadata へ移行する
12. API ルート(MEDIUM)
api-route-handlers- app/api に Route Handlers を作成するapi-http-methods- HTTP メソッド用の名前付き関数をエクスポートするapi-request-body- リクエストボディを適切に解析するapi-query-params- クエリパラメーターにアクセスするapi-headers-cookies- ヘッダーと Cookie にアクセスするapi-response-types- 適切なレスポンスタイプを返すapi-middleware- ミドルウェアのパターンを実装するapi-cors- CORS を適切に設定するapi-rate-limiting- レート制限を実装する
13. 状態管理(MEDIUM)
state-context-client- Context には 'use client' が必要state-zustand- Zustand はハイドレーションに注意して使用するstate-redux- Next.js 用に Redux を設定するstate-jotai- Jotai を適切に設定するstate-recoil- Recoil を適切に設定するstate-url-state- 共有可能な状態には URL を使用するstate-server-state- RSC でクライアント側の状態を最小限に抑えるstate-persistence- 状態の永続化を処理する
14. インテグレーション(MEDIUM)
integrations-sentry- Sentry のエラー監視を移行する
15. テスト(LOW)
testing-jest-config- Jest の設定を更新するtesting-react-testing-library- RTL は同じように動作するtesting-server-components- Server Components をテストするtesting-client-components- Client Components をテストするtesting-async-components- 非同期コンポーネントをテストするtesting-mocking- Next.js モジュールをモックするtesting-e2e-cypress- Next.js 用に Cypress を設定するtesting-e2e-playwright- Next.js 用に Playwright を設定するtesting-api-routes- API Route Handlers をテストする
16. ビルドとデプロイ(LOW)
build-scripts- ビルドスクリプトを更新するbuild-output- ビルド出力について理解するbuild-standalone- スタンドアロン出力を設定するbuild-static-export- 静的エクスポートを設定するbuild-bundle-analysis- バンドルサイズを分析するbuild-vercel- Vercel にデプロイするbuild-docker- Docker のデプロイを設定する
17. よくある落とし穴(HIGH)
gotchas-window-undefined- SSR で window/document を扱うgotchas-hydration-mismatch- ハイドレーションの不一致を修正するgotchas-use-effect-timing- Next.js で useEffect を理解するgotchas-router-ready- クエリパラメーターには router.isReady を確認するgotchas-dynamic-imports- next/dynamic を適切に使用するgotchas-api-routes-edge- Edge と Node.js のランタイムgotchas-middleware- ミドルウェアはエッジで実行されるgotchas-static-generation- 静的レンダリングと動的レンダリングgotchas-redirect- リダイレクトを適切に処理するgotchas-headers- レスポンスヘッダーを設定するgotchas-cookies- RSC で Cookie を扱うgotchas-turbopack- Turbopack の互換性に関する問題を扱うgotchas-empty-modules- isolatedModules の空のモジュールエクスポートを修正するgotchas-nullish-coalescing- Nullish coalescing の実行時エラーを修正するgotchas-react19-class-components- React 19 のクラスコンポーネントの this バインディングを修正するgotchas-react19-ref-prop- React 19 の ref プロパティの変更に対応するgotchas-websocket-optional-deps- WebSocket のネイティブ依存関係のバンドルに対応するgotchas-auth-race-conditions- 認証/API の競合状態を防ぐgotchas-auth-state-gating- ロールを確認する前に認証状態を待つgotchas-configuration-idempotency- useRef で設定の冪等性を確保するgotchas-hydration-nested-interactive- インタラクティブ要素の入れ子を避けるgotchas-router-push-timing- レンダリング中に router.push を呼び出さないgotchas-infinite-rerender- 無限の再レンダリングループを防ぐgotchas-provider-hierarchy- プロバイダーの階層を正しく設定する
移行前チェックリスト
移行を始める前に、特別な対応が必要なパターンがないかコードベースをスキャンします。
# Check for WebSocket libraries (needs webpack fallback config)
grep -E "(socket\.io|\"ws\")" package.json
# Check for SCSS :export syntax (may need --webpack flag)
grep -r ":export" --include="*.scss" src/
# Check for SVG ReactComponent imports (needs SVGR config)
grep -r "ReactComponent" --include="*.ts" --include="*.tsx" src/
# List all REACT_APP_ environment variables
grep -roh "REACT_APP_[A-Z_]*" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" src/ | sort -u
# Check for Redux extraReducers using object notation (must convert to builder pattern for RTK v2)
grep -r "extraReducers:" --include="*.js" --include="*.jsx" --include="*.ts" --include="*.tsx" src/
# Check for /app/ paths that need updating if using (app) route group
grep -rE "(href|to|push|replace|redirect).*['\"]\/app\/" --include="*.js" --include="*.jsx" --include="*.ts" --include="*.tsx" src/
スキャン結果と参照ルール:
| スキャン結果 | 読むべきルール |
|---|---|
| package.json に socket.io または ws がある | gotchas-websocket-optional-deps, setup-next-config |
SCSS ファイルに :export がある | gotchas-turbopack |
ReactComponent SVG インポート | assets-static-imports |
REACT_APP_ 変数が見つかった | env-prefix-change |
extraReducers: が見つかった | state-redux(RTK v2 では builder コールバックが必要) |
ナビゲーションに /app/ パスがある | routing-route-groups(ルートグループに合わせてパスを更新) |
使用方法
詳しい説明とコード例については、個々のルールファイルを読んでください。
rules/setup-initial-structure.md
rules/routing-basic-pages.md
rules/data-useeffect-to-rsc.md
各ルールファイルには、次の内容が含まれています。
- 移行手順の簡単な説明
- CRA の「移行前」コード例
- Next.js の「移行後」コード例
- 補足情報と注意点
移行の順序
最良の結果を得るには、次の順序で移行してください。
- セットアップ - Next.js のプロジェクト構成を初期化する
- ルーティング - React Router をファイルベースのルーティングに変換する
- 環境変数 - 環境変数のプレフィックスを更新する
- コンポーネント - 必要な箇所に 'use client' ディレクティブを追加する
- データ取得 - useEffect をサーバーパターンに変換する
- スタイリング - グローバル CSS を移動し、CSS-in-JS を設定する
- 画像とフォント - Next.js の最適化を採用する
- SEO - Metadata API に移行する
- API ルート - Route Handlers を作成する
- テスト - テスト設定を更新する
移行後の検証チェックリスト
移行後、アプリケーションが正しく動作することを確認します。
コア機能:
-
npm run devでエラーなく Next.js 開発サーバーが起動する -
npm run buildが正常に完了する -
npm startで本番ビルドが実行される - メインアプリケーションが正しく表示される
- すべてのルートにアクセスできる
クライアント側の機能:
- localStorage/sessionStorage による永続化が機能する
- ダークモードまたはテーマの切り替えが機能し、設定が保持される
- クライアント側のインタラクティブ機能(フォーム、ボタン、モーダル)が機能する
- ブラウザーの戻る/進むナビゲーションが正しく機能する
ルーティング(該当する場合):
- ハッシュベースのルーティングが機能する(例:
#room=abc,key=xyz) - クエリパラメーターが正しく読み取られる
- 動的ルートが正しいパラメーターで表示される
- 無効なルートで 404 ページが表示される
リアルタイム機能(該当する場合):
- WebSocket 接続が正常に確立される
- リアルタイムの共同作業または更新が機能する
- 切断後の再接続が機能する
インテグレーション(該当する場合):
- エラー監視(Sentry)でエラーが捕捉される
- 分析トラッキングが正しく実行される
- サードパーティー認証(OAuth、Firebase)が機能する
- ファイルのアップロードが機能する
PWA(該当する場合):
- サービスワーカーが登録される(本番ビルド)
- アプリをインストールできる
- オフライン機能が想定どおりに動作する
パフォーマンス:
- コンソールにハイドレーションの不一致に関する警告が表示されない
- 画像が読み込まれ、最適化されている
- FOUT/FOIT の問題なくフォントが読み込まれる
- 予期しないコンソールエラーや警告がない