クライアントとサーバーのルーティングを橋渡しする Next.js App Router 対 React Router
Wenhao Wang
Dev Intern · Leapcell

はじめに
Web 開発の状況は絶えず変化しており、パフォーマンス、ユーザーエクスペリエンス、開発者の効率性に対するますます高まる要求に対応するために、新しいパラダイムとツールが登場しています。あらゆる Web アプリケーションの基本的な側面であるルーティングは、大幅な進化を遂げています。従来、React Router のようなライブラリが主唱するクライアントサイド ルーティングは、フルページのリロードなしでシームレスなナビゲーションを提供する Single Page Application (SPA) シーンを支配してきました。しかし、Web アプリケーションがより複雑になり、初期ロード パフォーマンスの向上が求められるようになるにつれて、サーバーサイド レンダリング (SSR) とサーバーコンポーネントの概念が大きな注目を集めています。この変化により、クライアントとサーバーの境界線を曖きりにし、ルーティングに対するハイブリッド アプローチを提供する Next.js App Router のようなソリューションが登場しました。この記事では、React Router と Next.js App Router の中心的な違いと類似点を掘り下げ、それらの根本的な原則、実装戦略、および適切なアプリケーション シナリオを比較し、最終的にそれらが最適なルーティング ソリューションを求める最新の Web の探求にそれぞれどのように貢献するかを説明します。
ルーティング パラダイムの理解
詳細に入る前に、これらのルーティング ソリューションの基盤となるコア コンセプトを理解することが重要です。
基本用語
- クライアントサイド ルーティング (CSR): CSR では、ルーティング ロジックは完全にブラウザ内に存在します。ユーザーがナビゲートすると、JavaScript がリクエストをインターセプトし、History API を使用して URL を更新し、フル ページ リフレッシュなしで UI の必要な部分のみを再レンダリングします。これにより、スピーディーな SPA のようなエクスペリエンスが提供されます。
- サーバーサイド レンダリング (SSR): SSR では、サーバーは各リクエストでページの初期 HTML を事前レンダリングします。これは、ユーザーが完全に形成された HTML ドキュメントを受け取ることを意味し、初期ロード時間を短縮し、SEO を向上させます。初期レンダリング後、クライアントサイド JavaScript がページを「ハイドレート」し、インタラクティブなクルーエントサイド ルーティングを可能にします。
- 静的サイト生成 (SSG): SSR と同様ですが、ページはビルド時に事前レンダリングされます。これは、頻繁に変更されないコンテンツに最適であり、CDN から直接ファイルを配信できるため、優れたパフォーマンスを提供します。
- ハイブリッド レンダリング: 開発者がアプリケーションのさまざまな部分に対してレンダリング戦略 (CSR、SSR、SSG) を選択できる柔軟なアプローチであり、特定のニーズに合わせて最適化されます。
- サーバーコンポーネント (RSC): 開発者がサーバーで完全にレンダリングされる React コンポーネントを記述できるようにする React の機能であり、最終的な HTML/CSS と最小限の JavaScript のみをクライアントに送信します。これにより、JavaScript バンドル サイズが大幅に削減され、パフォーマンスが向上します。
- クライアントコンポーネント: クライアントサイドで実行および状態を管理する従来の React コンポーネント。
React Router: クライアントサイドのチャンピオン
React Router は、長年にわたり React アプリケーションでのルーティングの事実上の標準となっており、クライアントサイド ルーティングに完全に焦点を当てています。アプリケーション ナビゲーションを管理するための宣言 API を提供します。
原則と実装:
React Router は、ブラウザの URL の変更をリッスンし、それらの URL を特定の React コンポーネントにマッピングすることによって機能します。内部的に History API
を使用して、フルページ リロードをトリガーすることなくブラウザの履歴を操作します。
例:
// App.js for React Router import React from 'react'; import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom'; import Home from './Home'; import About from './About'; import Contact from './Contact'; function App() { return ( <Router> <nav> <Link to="/">Home</Link> <Link to="/about">About</Link> <Link to="/contact">Contact</Link> </nav> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="/contact" element={<Contact />} /> </Routes> </Router> ); } export default App; // Home.js import React from 'react'; function Home() { return <h2>Welcome to the Home Page!</h2>; } export default Home;
アプリケーション シナリオ: React Router は、プライマリの関心がリッチなクライアントサイドエクスペリエンスであり、初期ロードパフォーマンスがあまり重要でないか、他の手段で処理される SPA で優れています。ダッシュボード、内部ツール、または初期ページロード後にほとんどのデータがフェッチされるアプリケーションに最適です。
Next.js App Router: ハイブリッド フロンティア
Next.js 13 で導入された Next.js App Router は、大幅なパラダイムシフトを表しています。React Server Components (RSC) とファイルシステム ベースのルーティングを活用して、高度に最適化されたハイブリッド レンダリング エクスペリエンスを提供します。
原則と実装:
App Router はファイルシステム ベースのアプローチを使用しており、app
ディレクトリ内のディレクトリ構造は URL 構造を直接反映します。サーバーコンポーネントとクライアントコンポーネントをシームレスに統合し、開発者がアプリケーションの各部分に最適なレンダリング戦略を選択できるようにします。App Router 内のナビゲーションは Link
コンポーネントを活用しており、高速な遷移のためにルートをプリフェッチします。
主な機能:
- ファイルシステム ベースのルーティング: ディレクトリがルートを定義し、特別なファイル (例:
page.js
、layout.js
) が UI を定義します。 - デフォルトでサーバーコンポーネント: `