Next.jsとExpoでコードを共有する最適なモノレポ構成は?
モジュール境界とバンドラー設定によります。最も安全な設計は、pnpmとTurborepoを用いてDBモデル、バリデーション、API契約をヘッドレスな内部パッケージに分離することです。Next.js 16サーバー側でDrizzle ORMを直接実行し、Expoモバイルアプリは型安全なHTTPエンドポイント経由で通信し、expo-secure-storeで認証トークンを保護します。supastackはこの構成をあらかじめ完備しており、MetroとTurbopackの競合を起こしません。
クロスプラットフォームSaaSの難所:バンドラーの不整合
プッシュ通知やホーム画面への配置により、モバイルアプリがユーザー維持率やエンゲージメントを飛躍的に向上させることは周知の事実です。しかし、Next.jsとReact Native Expoを単一モノレポで同居させるのは容易ではありません。
Next.jsはNode.jsやEdge環境を前提としたTurbopack/Webpackで動作し、ExpoはReact Native向けのMetroバンドラーで動作します。安易にコードを共有しようとすると、MetroがNode固有のcryptoを読み込んでクラッシュしたり、TurbopackがReact Nativeの構文で停止したりします。鍵となるのは明確なパッケージ分離です。
統合認証の仕組み:WebのCookieとモバイルのSecureStore
Webとモバイルではセッションの保持手法が異なります。Webブラウザでは、Next.jsがHTTP-onlyのCookieを発行し、CSRF保護とServer Componentのシームレスなハイドレーションを実現します。
一方モバイル環境ではCookieが不安定なため、OAuth完了時にセキュアなBearerトークンを取得し、expo-secure-store経由でiOS KeychainやAndroid Keystoreに保存します。モバイルからのリクエストにはAuthorization: Bearer <token>を付与し、共通のBetter Authミドルウェアで検証します。
CI/CDとリリースパイプライン:Vercel、EAS Build、バージョン同期
Webとモバイルを1つのリポジトリで管理することで、リリースの足並みを揃えられます。@supastack/dbでスキーマ変更が行われると、Next.jsバックエンドはVercelやCloud Runへ即座にデプロイされます。
同時に、Expo Application Services(EAS Build)がApple TestFlightやGoogle Play向けのバイナリを自動生成します。共有パッケージのバージョンを固定することで、複数リポジトリ管理で頻発するバージョンの食い違いを防ぐことができます。