עברית

גלו את ה-Parallel Routes של Next.js: מדריך מקיף לבניית פריסות עמודים דינמיות וגמישות עם מספר אזורים עצמאיים. למדו על יישום, יתרונות ושיטות עבודה מומלצות.

Next.js Parallel Routes: בניית פריסות עמודים דינמיות

Next.js, פריימוורק ריאקט מוביל, מתפתח כל הזמן כדי לספק למפתחים כלים רבי עוצמה לבניית יישומי רשת מודרניים. אחד המאפיינים המרגשים ביותר שהוצגו בגרסאות האחרונות הוא Parallel Routes (ניתובים מקבילים). מאפיין זה מאפשר לכם לרנדר מספר אזורים עצמאיים בתוך אותה פריסת עמוד, ומציע גמישות ושליטה חסרות תקדים על מבנה האפליקציה וחווית המשתמש שלכם.

מהם Parallel Routes?

באופן מסורתי, נתיב (route) ב-Next.js מתאים לרכיב עמוד יחיד. כאשר אתם מנווטים לנתיב אחר, כל העמוד מרונדר מחדש. Parallel Routes שוברים את הפרדיגמה הזו בכך שהם מאפשרים לכם לרנדר מספר רכיבים בו-זמנית באותה פריסת עמוד, כאשר כל אחד מהם מנוהל על ידי מקטע נתיב עצמאי משלו. חשבו על זה כחלוקת העמוד שלכם לאזורים נפרדים, שלכל אחד מהם יש URL ומחזור חיים משלו, וכולם מתקיימים יחד על מסך אחד.

זה פותח אפשרויות רבות ליצירת ממשקי משתמש מורכבים ודינמיים יותר. לדוגמה, אתם יכולים להשתמש בניתובים מקבילים כדי:

הבנת הקונספט: Slots

הקונספט המרכזי מאחורי Parallel Routes הוא רעיון ה-"slots" (חריצים). Slot הוא אזור בעל שם בתוך פריסת העמוד שלכם, שבו מרונדר מקטע נתיב ספציפי. אתם מגדירים את ה-slots הללו בתיקיית ה-app שלכם באמצעות הסימן @ ואחריו שם ה-slot. לדוגמה, @sidebar מייצג slot בשם "sidebar".

לאחר מכן ניתן לשייך כל slot למקטע נתיב. כאשר המשתמש מנווט לנתיב ספציפי, Next.js ירנדר את הרכיב המשויך למקטע הנתיב הזה לתוך ה-slot המתאים בפריסת העמוד.

יישום: דוגמה מעשית

בואו נדגים כיצד Parallel Routes עובדים עם דוגמה מעשית. דמיינו שאתם בונים אפליקציית מסחר אלקטרוני, ואתם רוצים להציג עמוד פרטי מוצר עם סרגל צד קבוע של עגלת הקניות.

1. מבנה התיקיות

ראשית, בואו נגדיר את מבנה התיקיות עבור האפליקציה שלנו:

app/
  product/
    [id]/
      @cart/
        page.js  // רכיב עגלת הקניות
      page.js      // רכיב פרטי המוצר
    layout.js   // פריסת המוצר
  layout.js     // פריסת השורש

הנה מה שכל קובץ מייצג:

2. פריסת השורש (app/layout.js)

פריסת השורש מכילה בדרך כלל אלמנטים המשותפים לכל האפליקציה, כגון כותרות עליונות ותחתונות.

// app/layout.js
export default function RootLayout({ children }) {
  return (
    
      
        
אפליקציית המסחר האלקטרוני שלי
{children}
© 2024
); }

3. פריסת המוצר (app/product/[id]/layout.js)

זהו החלק המכריע בו אנו מגדירים את ה-slots שלנו. אנו מקבלים את הרכיבים עבור עמוד המוצר הראשי והעגלה כ-props, התואמים ל-page.js ו-@cart/page.js, בהתאמה.

// app/product/[id]/layout.js
export default function ProductLayout({ children, cart }) {
  return (
    
{children}
); }

בדוגמה זו, אנו משתמשים בפריסת flexbox פשוטה כדי למקם את תוכן המוצר הראשי ואת סרגל הצד של העגלה זה לצד זה. ה-prop children יכיל את הפלט המרונדר של app/product/[id]/page.js, וה-prop cart יכיל את הפלט המרונדר של app/product/[id]/@cart/page.js.

4. עמוד פרטי המוצר (app/product/[id]/page.js)

זהו עמוד נתיב דינמי סטנדרטי המציג את פרטי המוצר בהתבסס על הפרמטר id.

// app/product/[id]/page.js
export default async function ProductDetails({ params }) {
  const { id } = params;
  // שליפת נתוני המוצר על בסיס ID
  const product = await fetchProduct(id);

  return (
    

פרטי המוצר

{product.name}

{product.description}

מחיר: ${product.price}

); } async function fetchProduct(id) { // החליפו בלוגיקת שליפת הנתונים האמיתית שלכם return new Promise(resolve => setTimeout(() => { resolve({ id, name: `מוצר ${id}`, description: `תיאור של מוצר ${id}`, price: 99.99 }); }, 500)); }

5. רכיב עגלת הקניות (app/product/[id]/@cart/page.js)

רכיב זה מייצג את עגלת הקניות, אשר תרונדר ב-slot @cart.

// app/product/[id]/@cart/page.js
export default function ShoppingCart() {
  return (
    

עגלת קניות

פריטים בעגלה: 3

); }

הסבר

כאשר משתמש מנווט אל /product/123, Next.js יבצע את הפעולות הבאות:

  1. ירנדר את פריסת השורש (app/layout.js).
  2. ירנדר את פריסת המוצר (app/product/[id]/layout.js).
  3. בתוך פריסת המוצר, ירנדר את רכיב פרטי המוצר (app/product/[id]/page.js) לתוך ה-prop children.
  4. בו-זמנית, ירנדר את רכיב עגלת הקניות (app/product/[id]/@cart/page.js) לתוך ה-prop cart.

התוצאה היא עמוד פרטי מוצר עם סרגל צד קבוע של עגלת קניות, והכל מרונדר בתוך פריסת עמוד אחת.

יתרונות השימוש ב-Parallel Routes

שיקולים ושיטות עבודה מומלצות

שימוש מתקדם: רינדור מותנה ו-Slots דינמיים

ניתובים מקבילים אינם מוגבלים להגדרות slot סטטיות. ניתן גם להשתמש ברינדור מותנה וב-slots דינמיים כדי ליצור פריסות גמישות עוד יותר.

רינדור מותנה

אתם יכולים לרנדר רכיבים שונים ב-slot באופן מותנה על בסיס תפקידי משתמש, סטטוס אימות או גורמים אחרים.

// app/product/[id]/layout.js
import { getUserRole } from '../../utils/auth';

export default async function ProductLayout({ children, cart }) {
  const userRole = await getUserRole();

  return (
    
{children}
); } function AdminPanel() { return (

פאנל ניהול

נהל את פרטי המוצר כאן.

); }

בדוגמה זו, אם למשתמש יש תפקיד 'admin', ירונדר רכיב AdminPanel ב-slot @cart במקום עגלת הקניות.

Slots דינמיים

אף על פי שזה פחות נפוץ, ניתן *באופן תיאורטי* לבנות שמות של slots באופן דינמי, אך הדבר בדרך כלל לא מומלץ בשל מורכבות והשלכות ביצועים פוטנציאליות. עדיף להישאר עם slots מוגדרים מראש ומובנים היטב. אם עולה הצורך ב-"slots" דינמיים, שקלו פתרונות חלופיים כמו שימוש ברכיבי ריאקט סטנדרטיים עם props ורינדור מותנה.

דוגמאות מהעולם האמיתי ומקרי שימוש

בואו נבחן כמה דוגמאות מהעולם האמיתי לאופן שבו ניתן להשתמש בניתובים מקבילים בסוגים שונים של אפליקציות:

סיכום

Next.js Parallel Routes הם תכונה רבת עוצמה הפותחת עולם חדש של אפשרויות לבניית יישומי רשת דינמיים וגמישים. בכך שהם מאפשרים לכם לרנדר מספר אזורים עצמאיים באותה פריסת עמוד, ניתובים מקבילים מאפשרים לכם ליצור חוויות משתמש מרתקות יותר, להגביר את השימוש החוזר בקוד ולפשט את תהליך הפיתוח. בעוד שחשוב לקחת בחשבון מורכבויות פוטנציאליות ולעקוב אחר שיטות עבודה מומלצות, שליטה בניתובים מקבילים יכולה לשפר משמעותית את כישורי הפיתוח שלכם ב-Next.js ולאפשר לכם לבנות יישומי רשת חדשניים באמת.

ככל ש-Next.js ממשיך להתפתח, Parallel Routes יהפכו ללא ספק לכלי חשוב יותר ויותר עבור מפתחים המעוניינים לפרוץ את גבולות האפשרי באינטרנט. התנסו עם המושגים המתוארים במדריך זה וגלו כיצד Parallel Routes יכולים לשנות את גישתכם לבניית יישומי רשת מודרניים.