発行:
バックエンドとの連携
Next.js のようなフルスタックフレームワークとは異なり、ViteとReact Routerを使って構築する純粋な SPA (Single Page Application) は、 「フロントエンド(UI)」と「バックエンド(データ処理)」を明確に切り分ける アーキテクチャが一般的です。
フロントエンドとバックエンドの物理的分離
SPAとして動作するReactアプリは、公開時には単なる「JavaScriptファイル」の塊となります。
データベースへの直接アクセスは不可
ブラウザ上で動くJavaScriptから、データベース(MySQL, PostgreSQLなど)へ直接接続することはできません。セキュリティ上のリスクが極めて高いからです。
仲介としてのAPIサーバー
データベースへのアクセスやユーザー認証といった「重たい処理・秘密の処理」は、別のサーバー(APIサーバー)で行い、Reactアプリはそのサーバーと通信(HTTP通信)することでデータを取得します。
API通信の実装パターン
データの取得には標準の fetch APIを使うのが最もシンプルです。
loader内での非同期通信
React Routerの loader は、この非同期通信を記述する場所として最適です。
src/loaders/postLoader.jsexport const postLoader = async ({ params }) => { // 環境変数からベースURLを取得 const API_BASE = import.meta.env.VITE_API_BASE_URL; const response = await fetch(`${API_BASE}/posts/${params.id}`); if (!response.ok) { throw new Error("データの取得に失敗しました"); } return response.json(); };
CORSの壁を乗り越える
SPA開発者が必ずと言っていいほど直面するのが CORS (Cross-Origin Resource Sharing) エラーです。
CORSエラーが起きる理由
ブラウザには「異なるドメイン間の通信を制限する」というセキュリティポリシーがあります。
- フロント:
http://localhost:5173 - バック:
http://localhost:8000
このようにポート番号が違うだけでも別ドメインとみなされ、ブラウザが通信をブロックします。
解決策としてのバックエンド設定
このエラーは、 バックエンド(サーバー側)で「このフロントエンドからのアクセスを許可する」というレスポンスヘッダーを付与する ことで解決します。
- Node.js/Express :
corsミドルウェアを使用。 - Go/Python : 各フレームワークのCORS設定を適用。
まとめ
SPA構成を維持しつつバックエンドと連携するには、認証(JWTなど)や環境変数の正しい管理も重要になってきます。まずはシンプルな fetch から始め、外部の世界と接続される体験を味わってみましょう。