WiX/mag

ویکس مگ / مجله آموزشی ویکس سِوِن

روتینگ ری اکت

روتینگ و مسیریابی در ری اکت: راهنمای جامع

پیمان باقری

پیمان باقری

برنامه نویس و متخصص وب

در هر اپلیکیشن وب پیچیده، روتینگ یا مسیریابی یکی از مهم‌ترین اجزای سیستم است. روتینگ در ری اکت به شما این امکان را می‌دهد که از صفحات مختلف در اپلیکیشن وب خود حرکت کنید بدون اینکه نیاز به بارگذاری مجدد کامل صفحه داشته باشید. این کار نه‌تنها تجربه کاربری را بهبود می‌بخشد بلکه باعث بهینه‌سازی عملکرد اپلیکیشن نیز می‌شود. در ری‌ اکت، این فرایند با استفاده از ابزارهای مختلفی انجام می‌شود که یکی از محبوب‌ترین آنها react-router-dom است. علاوه بر react-router-dom از ابزارهای دیگری همچون Reach Router, NextJS, Gatby و Remix برای ناوبری در ری اکت می توان استفاده کرد. در این مقاله به همه ی این ابزارها خواهیم پرداخت و در نهایت به مقایسه آنها می پردازیم.

 

روتینگ در ری‌ اکت چیست؟

روتینگ (Routing) در ری‌ اکت به فرآیند هدایت و مسیریابی بین صفحات و کامپوننت‌ها در یک اپلیکیشن تک‌صفحه‌ای (SPA) اطلاق می‌شود. به عبارت دیگر، روتینگ به اپلیکیشن اجازه می‌دهد که بدون نیاز به بارگذاری مجدد صفحه، با تغییر آدرس URL، محتوای متفاوتی را نمایش دهد. در این نوع اپلیکیشن‌ها، زمانی که کاربر روی یک لینک کلیک می‌کند، اپلیکیشن به‌جای بارگذاری یک صفحه جدید از سرور، کامپوننت‌های مختلف را با توجه به URL نمایش می‌دهد.

ری‌ اکت به‌طور پیش‌فرض از روتینگ پشتیبانی نمی‌کند و برای پیاده‌سازی آن به کتابخانه‌های جانبی نیاز دارد. یکی از معروف‌ترین و محبوب‌ترین کتابخانه‌ها برای مدیریت روتینگ در ری‌ اکت، react-router-dom است که امکان تعریف مسیرها، تغییرات URL، و رندر کردن کامپوننت‌ها بر اساس مسیرهای مختلف را فراهم می‌کند. این کتابخانه به‌صورت خودکار از URL برای تصمیم‌گیری در مورد کدام کامپوننت را باید در صفحه نمایش داد استفاده می‌کند.

در ری‌ اکت، روتینگ نه تنها برای هدایت کاربر بین صفحات مختلف بلکه برای ایجاد ناوبری پویا و داینامیک در اپلیکیشن‌های پیچیده ضروری است. به‌وسیله روتینگ می‌توان مسیرهای مختلف را به‌صورت شرطی یا براساس داده‌ها یا وضعیت اپلیکیشن ایجاد کرد. برای مثال، می‌توان دسترسی به برخی صفحات را محدود کرده یا مسیرها را برای کاربران مختلف به‌طور داینامیک تغییر داد.

در نهایت، روتینگ در ری‌ اکت از اهمیت زیادی برخوردار است زیرا باعث می‌شود اپلیکیشن به‌صورت سریع، منعطف و مقیاس‌پذیر عمل کند و تجربه کاربری بهتری را برای کاربران فراهم کند. برای پیاده‌سازی روتینگ، از مفاهیمی مانند Routes، Route، Link و NavLink استفاده می‌شود که امکان مدیریت مسیرها، لینک‌ها و ناوبری را فراهم می‌کنند.

 

معرفی react-router-dom

react-router-dom یکی از محبوب‌ترین کتابخانه‌ها برای مدیریت روتینگ و مسیریابی در اپلیکیشن‌های ری‌ اکت است. این کتابخانه به‌طور خاص برای استفاده در اپلیکیشن‌های مبتنی بر وب طراحی شده و امکان مدیریت مسیرها و هدایت کاربر به بخش‌های مختلف اپلیکیشن را فراهم می‌کند. با استفاده از react-router-dom می‌توان مسیرهای مختلف را تعریف کرد و به‌طور داینامیک بر اساس URL، کامپوننت‌های مختلف را نمایش داد.

این کتابخانه به‌طور کلی شامل مجموعه‌ای از کامپوننت‌ها، هوک‌ها و APIها است که برای مدیریت روتینگ در اپلیکیشن‌های ری‌ اکت کاربرد دارند. react-router-dom به‌طور خودکار URL مرورگر را مدیریت کرده و به محض تغییر مسیر، کامپوننت‌های مناسب را بارگذاری می‌کند. به این ترتیب، نیازی به بارگذاری مجدد صفحه وجود ندارد و تجربه کاربری بهبود می‌یابد.

اجزای اصلی react-router-dom

BrowserRouter: این کامپوننت، کامپوننت ریشه‌ای است که باید در اطراف اپلیکیشن ری‌ اکت قرار گیرد. این کامپوننت مدیریت تاریخچه مرورگر را انجام می‌دهد و برای اپلیکیشن‌هایی که از روتینگ مبتنی بر URL استفاده می‌کنند مناسب است.

Route: این کامپوننت اصلی‌ترین بخش برای تعریف مسیرها در اپلیکیشن است. با استفاده از Route، می‌توان مسیرهایی را مشخص کرد که به هر کدام یک یا چند کامپوننت اختصاص دارد. این کامپوننت به‌طور خودکار با تغییر URL، کامپوننت‌های مربوطه را بارگذاری می‌کند.

Routes: این کامپوننت جدیدتر از Route است و برای گروه‌بندی تمام مسیرهای اپلیکیشن به کار می‌رود. در نسخه‌های جدید react-router، از Routes برای مدیریت چندین Route استفاده می‌شود.

Link و NavLink: این دو کامپوننت برای ایجاد لینک‌هایی در اپلیکیشن استفاده می‌شوند که به مسیری خاص اشاره دارند. Link برای مسیرهای ساده و NavLink برای ایجاد لینک‌هایی که بتوانند استایل فعال را برای لینک انتخاب شده اعمال کنند، مناسب است.

useNavigate: این هوک برای ناوبری برنامه‌نویسی و تغییر مسیر به‌طور داینامیک استفاده می‌شود. به‌جای استفاده از لینک‌ها، می‌توانید از این هوک برای هدایت به مسیرهای مختلف در واکنش به اتفاقات مختلف (مانند ارسال فرم‌ها یا کلیک روی دکمه‌ها) استفاده کنید.

ویژگی‌های کلیدی react-router-dom

  • مسیریابی پویا: react-router-dom اجازه می‌دهد مسیرها را به‌صورت داینامیک مدیریت کنید. برای مثال، می‌توان پارامترهای URL را به‌طور خودکار دریافت کرد و به آن‌ها دسترسی پیدا کرد.
  • نقشه‌برداری مسیرهای تو در تو: می‌توان مسیرهای تو در تو (nested routes) تعریف کرد که در داخل کامپوننت‌های دیگر قرار می‌گیرند. این ویژگی بسیار مفید است برای مدیریت بخش‌های مختلف اپلیکیشن که نیاز به روتینگ خاص خود دارند.
  • حفاظت از مسیرها: می‌توانید مسیرها را برای کاربران خاص محدود کنید. به‌عنوان مثال، مسیرهای ورود به برخی صفحات می‌توانند فقط برای کاربران وارد شده باز شوند.

 

نصب و راه‌اندازی کتابخانه react-router-dom

برای استفاده از react-router-dom  در پروژه‌های ری‌ اکت، باید ابتدا این کتابخانه را نصب کرده و سپس آن را در پروژه تنظیم کنید. این بخش شامل مراحل نصب، پیکربندی و بررسی نکات مهم مربوط به راه‌اندازی است.

برای نصب react-router-dom، از npm یا yarn استفاده کنید. این کتابخانه باید به عنوان یک وابستگی به پروژه اضافه شود.

نصب با npm:

npm install react-router-dom

نصب با yarn:

yarn add react-router-dom

اگر پروژه از نسخه‌های جدید ری‌ اکت (React 18 به بعد) استفاده می‌کند، اطمینان حاصل کنید که از نسخه مناسب react-router-dom استفاده می‌کنید (نسخه 6 یا بالاتر).

 

مراحل و نحوه استفاده از react-router-dom

بعد از نصب react-router-dom باید ابتدا BrowserRouter رو به ریشه ی اپلیکیشن اضافه کرده و سپس روت ها (مسیرها) و لینک ها را برای ناوبری وارد می کنیم.

  1. اضافه کردن BrowserRouter

اولین قدم برای استفاده از react-router-dom، پیچیدن کامپوننت ریشه (Root Component) با BrowserRouter است. این کامپوننت وظیفه مدیریت تاریخچه مرورگر و مسیریابی اپلیکیشن را برعهده دارد.

برای این کار، در فایل index.js تغییرات زیر را اعمال کنید:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import App from "./App";

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById("root")
);

اگر از React 18 استفاده می‌کنید، باید از متد جدید createRoot استفاده کنید:

import React from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App";

const root = createRoot(document.getElementById("root"));
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);
  1. تعریف مسیرها با Routes و Route

بعد از اضافه کردن BrowserRouter، باید مسیرها را در فایل اصلی (مانند App.js) تعریف کنید. این کار با استفاده از کامپوننت‌های Routes و Route انجام می‌شود.

نمونه ساده:

import React from "react";
import { Routes, Route } from "react-router-dom";
import Home from "./pages/Home";
import About from "./pages/About";

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
    </Routes>
  );
}

export default App;
  • path: مسیر URL که باید به یک کامپوننت خاص نگاشت شود.
  • element: کامپوننتی که در آن مسیر نمایش داده می‌شود.
  1. تعریف مسیر پیش‌فرض و صفحات خطا با Switch

در نسخه‌های قدیمی‌تر از react-router-dom (نسخه 5)، به جای Routes از Switch استفاده می‌شد. این ابزار از بالا به پایین مسیرها را بررسی کرده و اولین مسیر منطبق را رندر می‌کرد.

نمونه استفاده از Switch:

import React from "react";
import { Switch, Route } from "react-router-dom";
import Home from "./pages/Home";
import About from "./pages/About";
import NotFound from "./pages/NotFound";

function App() {
  return (
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route component={NotFound} />
    </Switch>
  );
}

export default App;
  • exact: مشخص می‌کند که مسیر باید دقیقاً با URL تطابق داشته باشد.
  • صفحه 404: مسیر بدون path به عنوان صفحه پیش‌فرض برای URLهای ناشناخته استفاده می‌شود.

توجه: در نسخه‌های جدیدتر react-router-dom، از Routes و Route استفاده می‌شود و نیازی به exact یا Switch نیست. به جای آن، تمامی رفتارها به صورت خودکار مدیریت می‌شوند.

  1. ساخت لینک‌ها و ناوبری با Link و NavLink

برای مسیریابی بین صفحات، می‌توانید از Link و NavLink استفاده کنید. این کامپوننت‌ها به جای تگ HTML <a> استفاده می‌شوند و مزیت اصلی آن‌ها جلوگیری از بارگذاری مجدد صفحه است.

استفاده از Link:

import React from "react";
import { Link } from "react-router-dom";

function Navigation() {
  return (
    <nav>
      <Link to="/">خانه</Link>
      <Link to="/about">درباره ما</Link>
    </nav>
  );
}

export default Navigation;

استفاده از NavLink (برای لینک‌های فعال):

NavLink به شما امکان می‌دهد استایل یا کلاس خاصی برای لینک فعال تنظیم کنید:

import React from "react";
import { NavLink } from "react-router-dom";

function Navigation() {
  return (
    <nav>
      <NavLink 
        to="/" 
        className={({ isActive }) => (isActive ? "active-link" : "")}>
        خانه
      </NavLink>
      <NavLink 
        to="/about" 
        className={({ isActive }) => (isActive ? "active-link" : "")}>
        درباره ما
      </NavLink>
    </nav>
  );
}

export default Navigation;
  • isActive: مشخص می‌کند که آیا لینک به مسیر فعلی منطبق است یا نه.
  • می‌توانید برای لینک فعال استایل خاصی تنظیم کنید:
.active-link {
  font-weight: bold;
  color: blue;
}

 

در این بخش، با اصول اولیه استفاده از react-router-dom آشنا شدیم:

  1. BrowserRouter برای مدیریت مسیریابی در سطح بالا.
  2. تعریف مسیرها با Routes و Route.
  3. ایجاد مسیر پیش‌فرض و صفحات خطا.
  4. استفاده از Link و NavLink برای ناوبری بین صفحات.

این مفاهیم پایه‌ای، شما را برای مسیریابی ساده در پروژه‌های ری‌ اکت آماده می‌کند. در بخش‌های بعدی، به ویژگی‌های پیشرفته مانند مسیریابی تو در تو، پارامترها و مسیرهای محافظت‌شده خواهیم پرداخت.

 

ویژگی‌های پیشرفته در مسیریابی با react-router-dom

  1. مسیریابی تو در تو (Nested Routing)

یکی از قابلیت‌های قدرتمند react-router-dom، امکان تعریف مسیرهای تو در تو است. این ویژگی زمانی مفید است که یک کامپوننت شامل چند بخش داخلی باشد که نیازمند مسیریابی مجزا هستند.

مثال:

import React from "react";
import { Routes, Route, Outlet, Link } from "react-router-dom";

function Dashboard() {
  return (
    <div>
      <h1>داشبورد</h1>
      <nav>
        <Link to="analytics">آنالیز</Link>
        <Link to="reports">گزارش‌ها</Link>
      </nav>
      <Outlet />
    </div>
  );
}

function Analytics() {
  return <h2>صفحه آنالیز</h2>;
}

function Reports() {
  return <h2>صفحه گزارش‌ها</h2>;
}

function App() {
  return (
    <Routes>
      <Route path="dashboard" element={<Dashboard />}>
        <Route path="analytics" element={<Analytics />} />
        <Route path="reports" element={<Reports />} />
      </Route>
    </Routes>
  );
}

export default App;
  • Outlet: کامپوننتی که مسیرهای تو در تو در آن رندر می‌شوند.
  • در این مثال، وقتی به /dashboard/analytics بروید، کامپوننت Analytics داخل Dashboard نمایش داده می‌شود.
  1. پارامترها در مسیرها

برای ارسال داده‌ها از طریق URL، می‌توان از پارامترهای پویا استفاده کرد. این پارامترها به شما امکان می‌دهند مسیری را برای یک آیتم خاص (مانند کاربر یا محصول) تنظیم کنید.

مثال:

import React from "react";
import { Routes, Route, useParams } from "react-router-dom";

function ProductDetail() {
  const { id } = useParams();
  return <h2>جزئیات محصول با شناسه: {id}</h2>;
}

function App() {
  return (
    <Routes>
      <Route path="product/:id" element={<ProductDetail />} />
    </Routes>
  );
}

export default App;
  • :id: یک پارامتر پویا است که می‌تواند در URL تغییر کند.
  • useParams: هوک مخصوص دریافت پارامترهای مسیر.

استفاده:

رفتن به آدرس /product/123 خروجی زیر را تولید می‌کند:

جزئیات محصول با شناسه: 123
  1. جستجو در URL (Query Strings)

علاوه بر پارامترهای پویا، می‌توانید داده‌ها را از طریق Query Strings ارسال کنید.

مثال:

import React from "react";
import { useSearchParams } from "react-router-dom";

function SearchPage() {
  const [searchParams] = useSearchParams();
  const query = searchParams.get("q");
  return <h2>نتایج جستجو برای: {query}</h2>;
}

function App() {
  return (
    <Routes>
      <Route path="search" element={<SearchPage />} />
    </Routes>
  );
}

export default App;

استفاده:

رفتن به آدرس /search?q=react خروجی زیر را تولید می‌کند:

نتایج جستجو برای: react
  1. مسیرهای محافظت‌شده (Protected Routes)

برای محدود کردن دسترسی به مسیرهای خاص (مانند داشبورد یا پنل ادمین)، از Protected Routes استفاده می‌شود. این مسیرها معمولاً با توجه به وضعیت احراز هویت مدیریت می‌شوند.

مثال:

import React from "react";
import { Routes, Route, Navigate } from "react-router-dom";

function ProtectedRoute({ isAuthenticated, children }) {
  return isAuthenticated ? children : <Navigate to="/login" />;
}

function Dashboard() {
  return <h2>داشبورد</h2>;
}

function Login() {
  return <h2>صفحه ورود</h2>;
}

function App() {
  const isAuthenticated = false; // این مقدار باید از context یا state مدیریت شود

  return (
    <Routes>
      <Route path="/login" element={<Login />} />
      <Route
        path="/dashboard"
        element={
          <ProtectedRoute isAuthenticated={isAuthenticated}>
            <Dashboard />
          </ProtectedRoute>
        }
      />
    </Routes>
  );
}

export default App;
  • Navigate: کاربران غیرمجاز را به مسیر دیگری هدایت می‌کند.
  • در این مثال، اگر کاربر احراز هویت نشده باشد، به /login هدایت می‌شود.
  1. Lazy Loading و تقسیم‌بندی کدها (Code Splitting)

برای بهینه‌سازی عملکرد اپلیکیشن، می‌توانید کامپوننت‌ها را به صورت Lazy بارگذاری کنید.

مثال:

import React, { lazy, Suspense } from "react";
import { Routes, Route } from "react-router-dom";

const Home = lazy(() => import("./pages/Home"));
const About = lazy(() => import("./pages/About"));

function App() {
  return (
    <Suspense fallback={<div>در حال بارگذاری...</div>}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Suspense>
  );
}

export default App;
  • lazy: کامپوننت‌ها را به صورت پویا بارگذاری می‌کند.
  • Suspense: کامپوننتی که یک وضعیت پیش‌فرض (مانند “در حال بارگذاری”) تا زمان بارگذاری نهایی نشان می‌دهد.
  1. مدیریت NotFound Pages (صفحات 404)

برای مدیریت مسیرهای نامعتبر، می‌توانید یک صفحه خطا تنظیم کنید.

مثال:

function NotFound() {
  return <h2>صفحه مورد نظر یافت نشد</h2>;
}

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}

export default App;
  • مسیر * تمامی URLهای نامعتبر را مدیریت می‌کند.

با استفاده از ویژگی‌های پیشرفته react-router-dom، می‌توانید اپلیکیشن‌های ری‌ اکت را به صورت مدرن و بهینه توسعه دهید. مسیریابی تو در تو، پارامترها، مسیرهای محافظت‌شده و Lazy Loading تنها بخشی از ابزارهای قدرتمند این کتابخانه هستند که توسعه‌دهندگان را در ایجاد تجربه کاربری بهتر یاری می‌دهند.

 

مدیریت روتینگ در اپلیکیشن‌های بزرگ

در اپلیکیشن‌های بزرگ، مسیریابی (Routing) پیچیده‌تر می‌شود زیرا باید تعداد زیادی از مسیرها، ماژول‌ها، و سطوح دسترسی مدیریت شوند. برای طراحی یک سیستم روتینگ پایدار و قابل نگهداری در چنین اپلیکیشن‌هایی، نیاز به استفاده از استراتژی‌ها و ابزارهای پیشرفته است.

ساختاردهی مسیرها به صورت ماژولار

یکی از بهترین رویکردها برای مدیریت روتینگ در اپلیکیشن‌های بزرگ، سازمان‌دهی مسیرها در فایل‌های جداگانه و ماژولار است. این روش باعث می‌شود که هر بخش از اپلیکیشن به صورت مستقل مدیریت شود و تغییرات در یک بخش، تأثیری روی سایر بخش‌ها نداشته باشد.

مثال:

// فایل routes/dashboardRoutes.js
import Dashboard from "../pages/Dashboard";
import Analytics from "../pages/Analytics";
import Reports from "../pages/Reports";

export const dashboardRoutes = [
  { path: "/dashboard", element: <Dashboard /> },
  { path: "/dashboard/analytics", element: <Analytics /> },
  { path: "/dashboard/reports", element: <Reports /> },
];

// فایل routes/appRoutes.js
import Home from "../pages/Home";
import Login from "../pages/Login";
import { dashboardRoutes } from "./dashboardRoutes";

export const appRoutes = [
  { path: "/", element: <Home /> },
  { path: "/login", element: <Login /> },
  ...dashboardRoutes,
];

نحوه استفاده:

import { Routes, Route } from "react-router-dom";
import { appRoutes } from "./routes/appRoutes";

function App() {
  return (
    <Routes>
      {appRoutes.map((route, index) => (
        <Route key={index} path={route.path} element={route.element} />
      ))}
    </Routes>
  );
}

export default App;

مزایا:

  • مدیریت آسان مسیرها
  • امکان تغییر یا افزودن مسیرهای جدید بدون تأثیر بر سایر بخش‌ها
  • خوانایی بیشتر کد

بارگذاری پویا وLazy Loading

در اپلیکیشن‌های بزرگ، بارگذاری تمام کامپوننت‌ها به صورت هم‌زمان می‌تواند باعث کاهش عملکرد شود. برای حل این مشکل، از Lazy Loading و Code Splitting استفاده می‌شود.

پیاده‌سازی:

import React, { lazy, Suspense } from "react";
import { Routes, Route } from "react-router-dom";

const Home = lazy(() => import("../pages/Home"));
const Dashboard = lazy(() => import("../pages/Dashboard"));
const Analytics = lazy(() => import("../pages/Analytics"));

function App() {
  return (
    <Suspense fallback={<div>در حال بارگذاری...</div>}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/dashboard/analytics" element={<Analytics />} />
      </Routes>
    </Suspense>
  );
}

export default App;

مزایا:

  • کاهش زمان بارگذاری اولیه اپلیکیشن
  • بهبود عملکرد در دستگاه‌های کندتر
  • کاهش مصرف منابع سیستم

مدیریت سطوح دسترسی (Role-Based Access Control)

در اپلیکیشن‌های پیچیده، مسیرهای خاصی نیازمند دسترسی ویژه برای کاربران مختلف هستند. برای این کار، می‌توان از مفهوم Role-Based Access Control (RBAC) استفاده کرد.

پیاده‌سازی:

import React from "react";
import { Navigate } from "react-router-dom";

function ProtectedRoute({ role, requiredRole, children }) {
  if (role !== requiredRole) {
    return <Navigate to="/unauthorized" />;
  }
  return children;
}

function App() {
  const userRole = "admin"; // باید از Context یا state گرفته شود

  return (
    <Routes>
      <Route path="/dashboard" element={<ProtectedRoute role={userRole} requiredRole="admin"><Dashboard /></ProtectedRoute>} />
      <Route path="/unauthorized" element={<Unauthorized />} />
    </Routes>
  );
}

مزایا:

  • امنیت بیشتر
  • جلوگیری از دسترسی غیرمجاز به بخش‌های حساس
  • انعطاف‌پذیری بالا در مدیریت سطوح دسترسی

مدیریت مسیرهای پویا (Dynamic Routing)

در اپلیکیشن‌های بزرگ، ممکن است نیاز به مسیرهای پویا باشد که داده‌ها را در زمان اجرا تنظیم می‌کنند.

پیاده‌سازی:

import React, { useState, useEffect } from "react";
import { Routes, Route } from "react-router-dom";

function App() {
  const [dynamicRoutes, setDynamicRoutes] = useState([]);

  useEffect(() => {
    // شبیه‌سازی دریافت مسیرها از API
    const fetchRoutes = async () => {
      const routes = [
        { path: "/page1", element: <Page1 /> },
        { path: "/page2", element: <Page2 /> },
      ];
      setDynamicRoutes(routes);
    };
    fetchRoutes();
  }, []);

  return (
    <Routes>
      {dynamicRoutes.map((route, index) => (
        <Route key={index} path={route.path} element={route.element} />
      ))}
    </Routes>
  );
}

export default App;

مزایا:

  • انعطاف‌پذیری بالا برای تغییر مسیرها در زمان اجرا
  • امکان مدیریت مسیرها از طریق API

نمایش مسیرهای فعال (Active Routes)

برای نشان دادن مسیر فعال در نوار ناوبری، می‌توان از NavLink استفاده کرد. این ویژگی برای اپلیکیشن‌هایی که ناوبری پیچیده دارند، ضروری است.

مثال:

import { NavLink } from "react-router-dom";

function Navigation() {
  return (
    <nav>
      <NavLink to="/" activeClassName="active">صفحه اصلی</NavLink>
      <NavLink to="/dashboard" activeClassName="active">داشبورد</NavLink>
    </nav>
  );
}

ارزیابی عملکرد روتینگ

برای نظارت بر عملکرد روتینگ در اپلیکیشن‌های بزرگ، می‌توانید از ابزارهایی مانند React Profiler و Performance Monitoring Tools استفاده کنید. این ابزارها به شما کمک می‌کنند تا مسیرهایی را که بارگذاری آن‌ها زمان‌بر است شناسایی کرده و بهینه‌سازی کنید.

نکات کلیدی برای مدیریت روتینگ در اپلیکیشن‌های بزرگ

  1. سازمان‌دهی مسیرها: مسیرها را در فایل‌های جداگانه و ماژولار مدیریت کنید.
  2. Lazy Loading: کامپوننت‌های بزرگ را به صورت پویا بارگذاری کنید.
  3. استفاده از Context یا State: برای مدیریت سطوح دسترسی و اطلاعات پویا از Context API یا ابزارهای مدیریت استیت استفاده کنید.
  4. دقت در امنیت: دسترسی به مسیرهای حساس را کنترل کنید.
  5. مستندسازی مسیرها: مسیرها و وابستگی‌های آن‌ها را مستند کنید تا نگهداری و توسعه آسان‌تر شود.

با رعایت این نکات، می‌توانید اپلیکیشن‌های پیچیده با ساختار روتینگ منظم و کارآمد طراحی کنید که هم مقیاس‌پذیر و هم قابل نگهداری باشد.

 

مزایا و معایب استفاده از React Router DOM

مزایای React Router DOM

  1. سازگاری کامل با ری‌ اکت

    React Router DOM به‌صورت اختصاصی برای ری‌ اکت طراحی شده است و به همین دلیل سازگاری بالایی با ساختار و کامپوننت‌های ری‌ اکت دارد. این سازگاری به توسعه‌دهندگان اجازه می‌دهد که به راحتی مسیرها را مدیریت کنند و از قابلیت‌های قدرتمند ری‌ اکت در کنار این کتابخانه استفاده کنند.

  2. پشتیبانی از روتینگ داینامیک و انعطاف‌پذیر

    این ابزار امکان تعریف مسیرها و ناوبری داینامیک را فراهم می‌کند. توسعه‌دهندگان می‌توانند به‌سادگی مسیرهایی ایجاد کنند که بر اساس وضعیت یا داده‌ها تغییر کنند، مانند رندرینگ مسیرهای مبتنی بر کاربر یا سطح دسترسی.

  3. مستندات قوی و جامعه کاربری بزرگ

    React Router DOM یکی از پرکاربردترین ابزارهای روتینگ در ری‌ اکت است و به همین دلیل از مستندات جامع و جامعه کاربری گسترده‌ای برخوردار است. این امر به توسعه‌دهندگان کمک می‌کند تا به سرعت با آن آشنا شوند و در صورت نیاز از منابع آموزشی متعدد استفاده کنند.

  4. پشتیبانی از SPA (تک صفحه‌ای)

    این کتابخانه برای مدیریت اپلیکیشن‌های تک‌صفحه‌ای (Single Page Application) ایده‌آل است و امکان مدیریت مسیریابی بدون نیاز به بارگذاری مجدد صفحه را فراهم می‌کند.

  5. امکانات پیشرفته

    ویژگی‌هایی مانند رندرینگ شرطی، استفاده از Nested Routes (مسیرهای تو در تو)، محافظت از مسیرها (Protected Routes)، و lazy loading از جمله قابلیت‌های پیشرفته‌ای است که مدیریت روتینگ را در پروژه‌های بزرگ آسان‌تر می‌کند.

  6. تعریف ساده لینک‌ها و ناوبری

    کامپوننت‌هایی مانند <Link> و <NavLink> فرآیند ایجاد لینک‌ها و مدیریت حالت‌های ناوبری را بسیار ساده و کارآمد می‌کنند.

معایب React Router DOM

  1. پیچیدگی در پروژه‌های بزرگ

    با افزایش تعداد مسیرها و پیچیدگی اپلیکیشن، مدیریت ساختار روتینگ ممکن است دشوار شود. بدون برنامه‌ریزی و سازمان‌دهی مناسب، کدهای مربوط به مسیرها ممکن است غیرقابل نگهداری شوند.

  2. نیاز به یادگیری اولیه

    هرچند استفاده از React Router DOM ساده به نظر می‌رسد، ولی برای درک کامل مفاهیمی مانند nested routes، dynamic routing و lazy loading، نیاز به یادگیری و تجربه بیشتری وجود دارد.

  3. حذف قابلیت‌های قدیمی

    با هر به‌روزرسانی، برخی از قابلیت‌های قدیمی‌تر ممکن است حذف شوند (مانند Switch در نسخه‌های جدید)، که می‌تواند موجب ناسازگاری با کدهای نوشته‌شده در نسخه‌های قبلی شود و نیاز به تغییرات در کد را ایجاد کند.

  4. نیاز به مدیریت دستی

    برخلاف برخی از ابزارهای مدیریت وضعیت یا روتینگ پیشرفته‌تر مانند Next.js، در React Router DOM همه چیز باید به‌صورت دستی تعریف شود، که ممکن است زمان بیشتری برای تنظیمات اولیه و نگهداری لازم داشته باشد.

  5. عدم مدیریت خودکار وضعیت

    React Router DOM ابزار اختصاصی مدیریت وضعیت ارائه نمی‌دهد و برای ذخیره یا مدیریت داده‌های مربوط به مسیرها باید از ابزارهای دیگری مانند Redux یا Context API استفاده کنید.

  6. عدم پشتیبانی از SSR به صورت پیش‌فرض

    این کتابخانه به‌صورت پیش‌فرض برای Client-Side Rendering طراحی شده است و برای استفاده از Server-Side Rendering (SSR) باید تنظیمات اضافی انجام دهید یا از ابزارهایی مانند Next.js استفاده کنید.

با در نظر گرفتن مزایا و معایب React Router DOM، این ابزار یکی از بهترین انتخاب‌ها برای مسیریابی در اپلیکیشن‌های ری‌ اکت است، به شرطی که نیازهای پروژه به دقت بررسی و ساختار مناسبی برای مدیریت مسیرها طراحی شود.

 

ابزارهای پیشرفته برای مدیریت روتینگ در ری‌ اکت

ری‌ اکت، علاوه بر ابزارهای داخلی، فریم‌ورک‌ها و کتابخانه‌های پیشرفته‌ای را برای مدیریت بهتر و بهینه‌تر روتینگ در پروژه‌های مختلف معرفی کرده است. در این بخش به معرفی این ابزارها می‌پردازیم:

1. Next.js

یک فریم‌ورک همه‌کاره که مدیریت روتینگ پیش‌فرض را در کنار قابلیت‌هایی مانند رندرینگ سمت سرور (SSR)، تولید صفحات استاتیک (SSG)، و رندرینگ ترکیبی ارائه می‌دهد. Next.js برای پروژه‌هایی با مقیاس بزرگ و نیازمند SEO ایده‌آل است. این فریم‌ورک همچنین با ساختار پوشه‌بندی ساده و رویکرد فایل‌بیس روتینگ شناخته می‌شود.

شروع پروژه:

npx create-next-app@latest

2. Remix

Remix یک فریم‌ورک جدید و قدرتمند است که برای مدیریت داده‌ها و روتینگ بهینه طراحی شده است. ویژگی‌های منحصربه‌فرد آن شامل روت‌های تو در تو، بارگذاری موازی داده‌ها، و پشتیبانی قوی از فرم‌ها و تعاملات سمت سرور است. Remix برای اپلیکیشن‌های پیچیده و تعاملی توصیه می‌شود.

شروع پروژه:

npx create-remix

3. Gatsby

اگر قصد ساخت وب‌سایت‌های استاتیک و سریع دارید، Gatsby یک گزینه عالی است. این ابزار برای پروژه‌هایی که نیازمند ادغام با سیستم‌های مدیریت محتوا (CMS) هستند، مناسب است. Gatsby به لطف استفاده از GraphQL، قابلیت‌های فوق‌العاده‌ای برای فچ کردن داده‌ها فراهم می‌کند.

شروع پروژه:

npx create-gatsby

4. Expo

Expo برای توسعه اپلیکیشن‌های یونیورسال وب، iOS، و اندروید طراحی شده است. این ابزار علاوه بر امکان مدیریت استایل و تعاملات نیتیو، یکپارچگی خوبی با ری‌ اکت دارد و توسعه اپلیکیشن‌های موبایلی را ساده‌تر می‌کند.

شروع پروژه:

npx create-expo-app

5. Reach Router

Reach Router یک کتابخانه روتینگ سبک و سریع برای اپلیکیشن‌های ری‌ اکت است که تمرکز ویژه‌ای روی دسترس‌پذیری و سادگی دارد. این کتابخانه بیشتر برای پروژه‌های کوچک و متوسط مناسب است و امکان مدیریت مسیرها را به‌راحتی فراهم می‌کند.

ویژگی‌ها:

  • دسترس‌پذیری بالا برای کاربران با نیازهای خاص
  • سادگی در استفاده و API کم‌حجم
  • پشتیبانی از روت‌های تو در تو

برای استفاده از Reach Router، ابتدا آن را با دستور زیر نصب کرده:

npm install @reach/router

سپس می‌توانید از آن برای روتینگ در اپلیکیشن ری‌ اکت خود استفاده کنید:

import { Router } from '@reach/router';
import Home from './Home';
import About from './About';

function App() {
  return (
    <Router>
      <Home path="/" />
      <About path="about" />
    </Router>
  );
}

چرا از این ابزارها استفاده کنیم؟

هر یک از این فریم‌ورک‌ها با ویژگی‌ها و قابلیت‌های خاص خود، توسعه‌دهندگان را قادر می‌سازند تا چالش‌های مدیریت روتینگ در پروژه‌های کوچک و بزرگ را به‌خوبی مدیریت کنند. استفاده از این ابزارها می‌تواند باعث کاهش پیچیدگی، بهبود عملکرد، و افزایش انعطاف‌پذیری اپلیکیشن‌ها شود.

 

مقایسه React Router با ابزارهای دیگر روتینگ (Reach Router, Gatsby, Remix, NextJs)

React Router یکی از شناخته‌شده‌ترین و پرکاربردترین ابزارهای روتینگ در ری‌ اکت است که به‌طور گسترده برای مدیریت مسیرها و ناوبری در اپلیکیشن‌های تک‌صفحه‌ای (SPA) استفاده می‌شود. با این حال، ابزارهای دیگری مانند Next.js، Remix، Gatsby و Reach Router نیز در دسترس هستند که ویژگی‌ها و مزایای خاص خود را دارند. در این بخش، مقایسه‌ای از این ابزارها ارائه می‌دهیم تا بتوانید بر اساس نیازهای پروژه خود، بهترین انتخاب را داشته باشید.

ویژگی‌ها React Router Next.js Remix Gatsby Reach Router
ساختار روتینگ مبتنی بر کدنویسی فایل‌بیس فایل‌بیس با قابلیت روت‌های تو در تو فایل‌بیس مبتنی بر کدنویسی ساده و API‌های نوین
رندرینگ فقط CSR (رندرینگ سمت کلاینت) CSR + SSR + SSG CSR + SSR CSR + SSG فقط CSR
مدیریت داده‌ها مستقل از مدیریت داده ابزارهای داخلی برای SSR و SSG مدیریت بهینه با بارگذاری داده‌ها استفاده از GraphQL مستقل از مدیریت داده‌ها
سازگاری با پروژه‌های کوچک مناسب ممکن است بیش از نیاز باشد مناسب مناسب مناسب
مناسب برای پروژه‌های بزرگ پیچیده‌تر در مدیریت ایده‌آل ایده‌آل مناسب اما محدود در SSR مناسب برای پروژه‌های ساده‌تر
تعامل با سئو محدود عالی عالی عالی مناسب، اما نیازمند پیکربندی
کاربردها اپلیکیشن‌های تک‌صفحه (SPA) اپلیکیشن‌های پیچیده و چندمنظوره اپلیکیشن‌های تعاملی و داده‌محور وب‌سایت‌های استاتیک و سریع اپلیکیشن‌های تک‌صفحه‌ای ساده و سبک

مقایسه در کاربردها و عملکرد ابزارهای روتینگ ری اکت

  1. React Router: مناسب‌ترین انتخاب برای اپلیکیشن‌های تک‌صفحه‌ای (SPA) که نیازی به قابلیت‌هایی مانند SSR یا SSG ندارند. امکانات گسترده برای مدیریت مسیرها و ناوبری داینامیک از نقاط قوت آن است.
  2. Next.js: بهترین انتخاب برای پروژه‌های پیچیده‌تر که نیاز به رندرینگ سمت سرور (SSR) یا رندرینگ استاتیک (SSG) دارند. این فریم‌ورک قابلیت‌هایی مانند فایل‌بیس روتینگ، مدیریت داده‌ها و بهینه‌سازی SEO را در اختیار توسعه‌دهندگان قرار می‌دهد.
  3. Remix: یک فریم‌ورک پیشرفته برای مدیریت داده‌ها و بارگذاری بهینه که به‌ویژه برای اپلیکیشن‌های تعاملی طراحی شده است. این ابزار از روت‌های تو در تو و ساختار فایل‌بیس برای رندرینگ استفاده می‌کند.
  4. Gatsby: مناسب برای وب‌سایت‌های استاتیک و سریع است که به‌خصوص در SEO عملکرد خوبی دارند. از GraphQL برای مدیریت داده‌ها بهره می‌برد.
  5. Reach Router: ابزار جدیدی است که به‌ویژه برای پروژه‌های ساده و کوچک مناسب است. این ابزار با طراحی ساده و API‌های نوین، برای توسعه‌دهندگانی که به دنبال راه‌حل‌هایی کارآمد و سریع برای مدیریت مسیرها هستند، مناسب می‌باشد.

کدام ابزار روتینگ ری اکت برای شما مناسب است؟

  • اگر یک SPA ساده می‌سازید، React Router یا Reach Router انتخاب‌های بهتری هستند.
  • برای پروژه‌های پیچیده که نیاز به SEO بهینه‌شده یا رندرینگ سمت سرور دارند، فریم‌ورک‌های Next.js و Remix بهترین گزینه‌ها هستند.
  • اگر هدف شما ساخت وب‌سایت‌های استاتیک سریع و بهینه‌شده است، Gatsby به دلیل استفاده از GraphQL و توانمندی‌های SSR و SSG، انتخاب خوبی خواهد بود.

با توجه به ویژگی‌ها و نیازهای خاص پروژه‌ها، انتخاب ابزار مناسب روتینگ می‌تواند تأثیر زیادی در عملکرد و بهینه‌سازی اپلیکیشن شما داشته باشد. React Router به‌عنوان ابزاری شناخته‌شده و با امکانات گسترده، برای بسیاری از پروژه‌ها مناسب است، در حالی که ابزارهایی مانند Next.js و Remix به‌ویژه برای پروژه‌های پیچیده‌تر و نیازمند بهینه‌سازی SEO مناسب‌ترند. Reach Router هم به عنوان یک گزینه ساده و کارآمد برای اپلیکیشن‌های کوچک‌تر انتخابی عالی است.

 

جمع بندی:

در این مقاله، به بررسی ابزارهای مختلف روتینگ در ری‌ اکت و ویژگی‌های آن‌ها پرداختیم. React Router به‌عنوان یکی از ابزارهای پرکاربرد برای روتینگ در اپلیکیشن‌های تک‌صفحه‌ای (SPA) معرفی شد. همچنین، ابزارهای پیشرفته‌تری مانند Next.js، Remix، Gatsby و Reach Router که هرکدام ویژگی‌ها و کاربردهای خاص خود را دارند، برای پروژه‌های پیچیده‌تر و نیازمند رندرینگ سمت سرور (SSR) و بهینه‌سازی SEO بررسی شدند.

با توجه به ویژگی‌های هر یک از این ابزارها، انتخاب مناسب‌ترین گزینه بستگی به نیازهای خاص پروژه شما دارد. برای پروژه‌های ساده و تک‌صفحه‌ای، React Router و Reach Router گزینه‌های مناسبی هستند. برای پروژه‌های پیچیده‌تر که نیاز به رندرینگ سمت سرور و مدیریت بهینه داده‌ها دارند، ابزارهایی مانند Next.js و Remix پیشنهاد می‌شوند. همچنین، اگر به‌دنبال ساخت وب‌سایت‌های استاتیک سریع و بهینه‌شده هستید، Gatsby به دلیل استفاده از GraphQL و قابلیت‌های SSR و SSG، انتخاب بسیار خوبی خواهد بود.

انتخاب ابزار مناسب روتینگ می‌تواند تأثیر زیادی بر عملکرد، مدیریت مسیرها و ناوبری در اپلیکیشن شما داشته باشد. بنابراین، قبل از انتخاب، بهتر است ویژگی‌ها و نیازهای پروژه خود را به‌دقت بررسی کنید تا بهترین ابزار روتینگ را برای پروژه خود انتخاب کنید.

 

مطالعه بیشتر در رفرنس های خارجی:

React Pages Router (react.dev)

React Router (w3schools.com)

React Router Dom (reactrouter.com)

Routing Fundamentals (nextjs.org)

لیست کامل مقالات ” ری اکت ” ویکس سِوِن در لینک زیر :

ری اکت چیست؟