বাংলা

Next.js-এ স্কেলেবল এবং ডাইনামিক UI তৈরি করুন। আমাদের গাইড রুট গ্রুপ এবং জটিল ড্যাশবোর্ডের জন্য প্যারালাল রুট কভার করে। এখনই আপনার দক্ষতা বাড়ান!

Next.js অ্যাপ রাউটার আয়ত্ত করা: রুট গ্রুপ এবং প্যারালাল রুট আর্কিটেকচারের গভীরে

Next.js অ্যাপ রাউটারের প্রকাশনাটি এই জনপ্রিয় রিয়্যাক্ট ফ্রেমওয়ার্ক দিয়ে ওয়েব অ্যাপ্লিকেশন তৈরির পদ্ধতিতে একটি যুগান্তকারী পরিবর্তন এনেছে। পেজেস রাউটারের ফাইল-ভিত্তিক প্রথা থেকে সরে এসে, অ্যাপ রাউটার একটি আরও শক্তিশালী, নমনীয় এবং সার্ভার-কেন্দ্রিক মডেল চালু করেছে। এই বিবর্তন আমাদের আরও বেশি নিয়ন্ত্রণ এবং সংগঠনের সাথে অত্যন্ত জটিল এবং পারফরম্যান্ট ইউজার ইন্টারফেস তৈরি করতে সক্ষম করে। এর মধ্যে প্রবর্তিত সবচেয়ে যুগান্তকারী বৈশিষ্ট্যগুলো হলো রুট গ্রুপস এবং প্যারালাল রুটস

যেসব ডেভেলপার এন্টারপ্রাইজ-গ্রেড অ্যাপ্লিকেশন তৈরি করতে চান, তাদের জন্য এই দুটি ধারণা আয়ত্ত করা কেবল উপকারীই নয়—অপরিহার্য। এগুলো লেআউট ম্যানেজমেন্ট, রুট অর্গানাইজেশন এবং ড্যাশবোর্ডের মতো ডাইনামিক, মাল্টি-প্যানেল ইন্টারফেস তৈরির সাধারণ আর্কিটেকচারাল চ্যালেঞ্জগুলো সমাধান করে। এই গাইডটি বিশ্বব্যাপী ডেভেলপারদের জন্য রুট গ্রুপস এবং প্যারালাল রুটসের একটি বিশদ আলোচনা প্রদান করে, যেখানে মৌলিক ধারণা থেকে শুরু করে উন্নত বাস্তবায়ন কৌশল এবং সেরা অনুশীলনগুলো তুলে ধরা হয়েছে।

Next.js অ্যাপ রাউটার বোঝা: একটি দ্রুত পুনরালোচনা

আমরা বিস্তারিত আলোচনার আগে, অ্যাপ রাউটারের মূল নীতিগুলো সংক্ষেপে জেনে নেওয়া যাক। এর আর্কিটেকচারটি একটি ডিরেক্টরি-ভিত্তিক সিস্টেমের উপর নির্মিত যেখানে ফোল্ডারগুলো URL সেগমেন্ট নির্ধারণ করে। এই ফোল্ডারগুলোর মধ্যে থাকা বিশেষ ফাইলগুলো সেই সেগমেন্টের UI এবং আচরণ নির্ধারণ করে:

এই কাঠামো, রিয়্যাক্ট সার্ভার কম্পোনেন্টস (RSCs) এর ডিফল্ট ব্যবহারের সাথে মিলিত হয়ে, একটি সার্ভার-ফার্স্ট অ্যাপ্রোচকে উৎসাহিত করে যা পারফরম্যান্স এবং ডেটা-ফেচিং প্যাটার্নকে উল্লেখযোগ্যভাবে উন্নত করতে পারে। রুট গ্রুপস এবং প্যারালাল রুটস হলো উন্নত প্রথা যা এই ভিত্তির উপর নির্মিত।

রুট গ্রুপসের রহস্যভেদ: আপনার প্রজেক্টকে সুস্থ এবং স্কেলেবল করার জন্য সংগঠিত করা

একটি অ্যাপ্লিকেশন বড় হওয়ার সাথে সাথে রুটের সংখ্যা নিয়ন্ত্রণহীন হয়ে পড়তে পারে। আপনার হয়তো মার্কেটিং-এর জন্য কিছু পেজ, ব্যবহারকারী প্রমাণীকরণের জন্য অন্য একটি সেট, এবং মূল অ্যাপ্লিকেশন ড্যাশবোর্ডের জন্য তৃতীয় একটি সেট থাকতে পারে। যৌক্তিকভাবে, এগুলো আলাদা বিভাগ, কিন্তু আপনি কীভাবে আপনার URL কাঠামোকে জটিল না করে ফাইল সিস্টেমে এগুলোকে সংগঠিত করবেন? রুট গ্রুপস ঠিক এই সমস্যারই সমাধান করে।

রুট গ্রুপস কী?

রুট গ্রুপ হলো একটি কৌশল যা আপনার ফাইল এবং রুট সেগমেন্টগুলোকে যৌক্তিক গ্রুপে সংগঠিত করে URL কাঠামোকে প্রভাবিত না করে। আপনি একটি ফোল্ডারের নামকে প্রথম বন্ধনীর মধ্যে মুড়ে একটি রুট গ্রুপ তৈরি করতে পারেন, যেমন, (marketing) বা (app)

বন্ধনীর মধ্যে থাকা ফোল্ডারের নামটি শুধুমাত্র সাংগঠনিক উদ্দেশ্যে ব্যবহৃত হয়। Next.js URL পাথ নির্ধারণ করার সময় এটিকে সম্পূর্ণ উপেক্ষা করে। উদাহরণস্বরূপ, app/(marketing)/about/page.js-এ থাকা ফাইলটি /about URL-এ পরিবেশন করা হবে, /(marketing)/about-এ নয়।

রুট গ্রুপসের মূল ব্যবহার এবং সুবিধা

যদিও সাধারণ সংগঠন একটি সুবিধা, রুট গ্রুপসের আসল শক্তি হলো অ্যাপ্লিকেশনকে আলাদা, শেয়ার্ড লেআউটসহ বিভিন্ন বিভাগে ভাগ করার ক্ষমতা।

১. রুট সেগমেন্টের জন্য বিভিন্ন লেআউট তৈরি করা

এটি সবচেয়ে সাধারণ এবং শক্তিশালী ব্যবহারের ক্ষেত্র। একটি ওয়েব অ্যাপ্লিকেশন কল্পনা করুন যার দুটি প্রধান বিভাগ রয়েছে:

রুট গ্রুপস ছাড়া, এই বিভাগগুলিতে বিভিন্ন রুট লেআউট প্রয়োগ করা জটিল হতো। রুট গ্রুপস দিয়ে, এটি অবিশ্বাস্যভাবে সহজ। আপনি প্রতিটি গ্রুপের ভিতরে একটি অনন্য layout.js ফাইল তৈরি করতে পারেন।

এই পরিস্থিতির জন্য একটি সাধারণ ফাইল কাঠামো নিচে দেওয়া হলো:

app/
├── (marketing)/
│   ├── layout.js      // মার্কেটিং হেডার/ফুটার সহ পাবলিক লেআউট
│   ├── page.js        // '/' এ রেন্ডার হয়
│   └── about/
│       └── page.js    // '/about' এ রেন্ডার হয়
├── (app)/
│   ├── layout.js      // সাইডবার সহ ড্যাশবোর্ড লেআউট
│   ├── dashboard/
│   │   └── page.js    // '/dashboard' এ রেন্ডার হয়
│   └── settings/
│       └── page.js    // '/settings' এ রেন্ডার হয়
└── layout.js          // রুট লেআউট (যেমন, <html> এবং <body> ট্যাগের জন্য)

এই আর্কিটেকচারে:

২. একটি সেগমেন্টকে শেয়ার্ড লেআউট থেকে বাদ দেওয়া

কখনো কখনো, একটি নির্দিষ্ট পেজ বা বিভাগকে প্যারেন্ট লেআউট থেকে সম্পূর্ণরূপে মুক্ত করার প্রয়োজন হয়। একটি সাধারণ উদাহরণ হলো চেকআউট প্রক্রিয়া বা একটি বিশেষ ল্যান্ডিং পেজ যেখানে মূল সাইটের নেভিগেশন থাকা উচিত নয়। আপনি রুটটিকে এমন একটি গ্রুপে রেখে এটি অর্জন করতে পারেন যা উচ্চ-স্তরের লেআউট শেয়ার করে না। যদিও এটি জটিল শোনায়, এর মানে হলো একটি রুট গ্রুপকে তার নিজস্ব টপ-লেভেল layout.js দেওয়া যা রুট লেআউট থেকে `children` রেন্ডার করে না।

বাস্তব উদাহরণ: একটি মাল্টি-লেআউট অ্যাপ্লিকেশন তৈরি করা

চলুন উপরে বর্ণিত মার্কেটিং/অ্যাপ কাঠামোর একটি সংক্ষিপ্ত সংস্করণ তৈরি করি।

১. রুট লেআউট (app/layout.js)

এই লেআউটটি খুবই সাধারণ এবং প্রতিটি পেজে প্রযোজ্য। এটি অপরিহার্য HTML কাঠামো নির্ধারণ করে।

// app/layout.js
export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

২. মার্কেটিং লেআউট (app/(marketing)/layout.js)

এই লেআউটে একটি পাবলিক-ফেসিং হেডার এবং ফুটার অন্তর্ভুক্ত রয়েছে।

// app/(marketing)/layout.js
export default function MarketingLayout({ children }) {
  return (
    <div>
      <header>Marketing Header</header>
      <main>{children}</main>
      <footer>Marketing Footer</footer>
    </div>
  );
}

৩. অ্যাপ ড্যাশবোর্ড লেআউট (app/(app)/layout.js)

এই লেআউটের একটি ভিন্ন কাঠামো রয়েছে, যেখানে প্রমাণীকৃত ব্যবহারকারীদের জন্য একটি সাইডবার রয়েছে।

// app/(app)/layout.js
export default function AppLayout({ children }) {
  return (
    <div style={{ display: 'flex' }}>
      <aside style={{ width: '200px', borderRight: '1px solid #ccc' }}>
        Dashboard Sidebar
      </aside>
      <main style={{ flex: 1, padding: '20px' }}>{children}</main>
    </div>
  );
}

এই কাঠামোর সাথে, /about-এ নেভিগেট করলে পেজটি `MarketingLayout` দিয়ে রেন্ডার হবে, যখন /dashboard-এ নেভিগেট করলে এটি `AppLayout` দিয়ে রেন্ডার হবে। URL পরিষ্কার এবং অর্থপূর্ণ থাকে, এবং আমাদের প্রজেক্টের ফাইল কাঠামো পুরোপুরি সংগঠিত এবং স্কেলেবল হয়।

প্যারালাল রুটস দিয়ে ডাইনামিক UI আনলক করা

যেখানে রুট গ্রুপস একটি অ্যাপ্লিকেশনের বিভিন্ন বিভাগ সংগঠিত করতে সাহায্য করে, সেখানে প্যারালাল রুটস একটি ভিন্ন চ্যালেঞ্জ মোকাবেলা করে: একটি একক লেআউটের মধ্যে একাধিক, স্বাধীন পেজ ভিউ প্রদর্শন করা। এটি জটিল ড্যাশবোর্ড, সোশ্যাল মিডিয়া ফিড বা যেকোনো UI-এর জন্য একটি সাধারণ প্রয়োজনীয়তা যেখানে বিভিন্ন প্যানেলকে একযোগে রেন্ডার এবং পরিচালনা করতে হয়।

প্যারালাল রুটস কী?

প্যারালাল রুটস আপনাকে একই লেআউটের মধ্যে এক বা একাধিক পেজ একই সাথে রেন্ডার করার অনুমতি দেয়। এই রুটগুলো স্লট নামক একটি বিশেষ ফোল্ডার কনভেনশন ব্যবহার করে সংজ্ঞায়িত করা হয়। স্লটগুলো @folderName সিনট্যাক্স ব্যবহার করে তৈরি করা হয়। এগুলো URL কাঠামোর অংশ নয়; পরিবর্তে, এগুলো স্বয়ংক্রিয়ভাবে নিকটতম শেয়ার্ড প্যারেন্ট `layout.js` ফাইলে প্রপস হিসাবে পাস করা হয়।

উদাহরণস্বরূপ, যদি আপনার একটি লেআউট থাকে যেখানে একটি টিম অ্যাক্টিভিটি ফিড এবং একটি অ্যানালিটিক্স চার্ট পাশাপাশি প্রদর্শন করার প্রয়োজন হয়, তবে আপনি দুটি স্লট সংজ্ঞায়িত করতে পারেন: `@team` এবং `@analytics`।

মূল ধারণা: স্লটস

স্লটগুলোকে আপনার লেআউটের মধ্যে নামযুক্ত স্থানধারক হিসেবে ভাবুন। লেআউট ফাইলটি স্পষ্টভাবে এই স্লটগুলোকে প্রপস হিসাবে গ্রহণ করে এবং কোথায় রেন্ডার করতে হবে তা নির্ধারণ করে।

এই লেআউট কম্পোনেন্টটি বিবেচনা করুন:

// একটি লেআউট যা দুটি স্লট গ্রহণ করে: 'team' এবং 'analytics'
export default function DashboardLayout({ children, team, analytics }) {
  return (
    <div>
      {children}
      <div style={{ display: 'flex' }}>
        {team}
        {analytics}
      </div>
    </div>
  );
}

এখানে, `children`, `team`, এবং `analytics` সবগুলোই স্লট। `children` একটি অন্তর্নিহিত স্লট যা ডিরেক্টরিতে থাকা স্ট্যান্ডার্ড `page.js`-এর সাথে সঙ্গতিপূর্ণ। `team` এবং `analytics` হলো সুস্পষ্ট স্লট যা ফাইল সিস্টেমে `@` উপসর্গ দিয়ে তৈরি করতে হবে।

মূল বৈশিষ্ট্য এবং সুবিধা

একটি বাস্তব-বিশ্বের পরিস্থিতি: একটি জটিল ড্যাশবোর্ড তৈরি করা

আসুন /dashboard URL-এ একটি ড্যাশবোর্ড ডিজাইন করি। এতে একটি প্রধান কন্টেন্ট এলাকা, একটি টিম অ্যাক্টিভিটি প্যানেল এবং একটি পারফরম্যান্স অ্যানালিটিক্স প্যানেল থাকবে।

ফাইল কাঠামো:

app/
└── dashboard/
    ├── @analytics/
    │   ├── page.js          // অ্যানালিটিক্স স্লটের জন্য UI
    │   └── loading.js     // বিশেষ করে অ্যানালিটিক্সের জন্য লোডিং UI
    ├── @team/
    │   └── page.js          // টিম স্লটের জন্য UI
    ├── layout.js            // যে লেআউট স্লটগুলোকে অর্কেস্ট্রেট করে
    └── page.js              // অন্তর্নিহিত 'children' স্লট (প্রধান কন্টেন্ট)

১. ড্যাশবোর্ড লেআউট (app/dashboard/layout.js)

এই লেআউটটি তিনটি স্লট গ্রহণ করে এবং সাজায়।

// app/dashboard/layout.js
export default function DashboardLayout({ children, analytics, team }) {
  const isLoggedIn = true; // আসল প্রমাণীকরণ লজিক দিয়ে প্রতিস্থাপন করুন

  return isLoggedIn ? (
    <div>
      <h1>Main Dashboard</h1>
      {children}
      <div style={{ marginTop: '20px', display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '20px' }}>
        <div style={{ border: '1px solid blue', padding: '10px' }}>
          <h2>Team Activity</h2>
          {team}
        </div>
        <div style={{ border: '1px solid green', padding: '10px' }}>
          <h2>Performance Analytics</h2>
          {analytics}
        </div>
      </div>
    </div>
  ) : (
    <div>Please log in to view the dashboard.</div>
  );
}

২. স্লট পেজ (যেমন, app/dashboard/@analytics/page.js)

প্রতিটি স্লটের `page.js` ফাইলে সেই নির্দিষ্ট প্যানেলের UI থাকে।

// app/dashboard/@analytics/page.js
async function getAnalyticsData() {
  // একটি নেটওয়ার্ক অনুরোধ সিমুলেট করুন
  await new Promise(resolve => setTimeout(resolve, 3000));
  return { views: '1.2M', revenue: '$50,000' };
}

export default async function AnalyticsPage() {
  const data = await getAnalyticsData();
  return (
    <div>
      <p>Page Views: {data.views}</p>
      <p>Revenue: {data.revenue}</p>
    </div>
  );
}

// app/dashboard/@analytics/loading.js
export default function Loading() {
  return <p>Loading analytics data...</p>;
}

এই সেটআপের সাথে, যখন একজন ব্যবহারকারী /dashboard-এ নেভিগেট করে, Next.js `DashboardLayout` রেন্ডার করবে। লেআউটটি dashboard/page.js, dashboard/@team/page.js, এবং dashboard/@analytics/page.js থেকে রেন্ডার করা কন্টেন্টকে প্রপস হিসেবে গ্রহণ করবে এবং সে অনুযায়ী তাদের স্থাপন করবে। গুরুত্বপূর্ণভাবে, অ্যানালিটিক্স প্যানেলটি ড্যাশবোর্ডের বাকি অংশের রেন্ডারিং ব্লক না করে ৩ সেকেন্ডের জন্য তার নিজস্ব `loading.js` স্টেট দেখাবে।

`default.js` দিয়ে অমিল রুট হ্যান্ডলিং

একটি গুরুত্বপূর্ণ প্রশ্ন দেখা দেয়: যদি Next.js বর্তমান URL-এর জন্য একটি স্লটের সক্রিয় অবস্থা পুনরুদ্ধার করতে না পারে তবে কী হবে? উদাহরণস্বরূপ, একটি প্রাথমিক লোড বা একটি পেজ রিলোডের সময়, URLটি /dashboard হতে পারে, যা @team বা @analytics স্লটের ভিতরে কী দেখাতে হবে তার জন্য নির্দিষ্ট নির্দেশনা দেয় না। ডিফল্টরূপে, Next.js একটি 404 এরর রেন্ডার করবে।

এটি প্রতিরোধ করতে, আমরা প্যারালাল রুটের ভিতরে একটি default.js ফাইল তৈরি করে একটি ফলব্যাক UI প্রদান করতে পারি।

উদাহরণ:

// app/dashboard/@analytics/default.js
export default function DefaultAnalyticsPage() {
  return (
    <div>
      <p>No analytics data selected.</p>
    </div>
  );
}

এখন, যদি অ্যানালিটিক্স স্লটটি অমিল থাকে, Next.js একটি 404 পেজের পরিবর্তে `default.js`-এর কন্টেন্ট রেন্ডার করবে। এটি একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা তৈরির জন্য অপরিহার্য, বিশেষ করে একটি জটিল প্যারালাল রুট সেটআপের প্রাথমিক লোডের সময়।

উন্নত আর্কিটেকচারের জন্য রুট গ্রুপ এবং প্যারালাল রুট একত্রিত করা

অ্যাপ রাউটারের আসল শক্তি উপলব্ধি করা যায় যখন আপনি এর বৈশিষ্ট্যগুলো একত্রিত করেন। রুট গ্রুপ এবং প্যারালাল রুট sofisticated এবং অত্যন্ত সংগঠিত অ্যাপ্লিকেশন আর্কিটেকচার তৈরি করতে সুন্দরভাবে একসাথে কাজ করে।

ব্যবহারের ক্ষেত্র: একটি মাল্টি-মোডাল কন্টেন্ট ভিউয়ার

একটি মিডিয়া গ্যালারি বা ডকুমেন্ট ভিউয়ারের মতো একটি প্ল্যাটফর্ম কল্পনা করুন যেখানে ব্যবহারকারী একটি আইটেম দেখতে পারে এবং ব্যাকগ্রাউন্ড পেজের কনটেক্সট না হারিয়ে এর বিবরণ দেখতে একটি মোডাল উইন্ডো খুলতে পারে। এটিকে প্রায়শই "ইন্টারসেপ্টিং রুট" বলা হয় এবং এটি প্যারালাল রুটের উপর নির্মিত একটি শক্তিশালী প্যাটার্ন।

আসুন একটি ফটো গ্যালারি তৈরি করি। যখন আপনি একটি ফটোতে ক্লিক করেন, এটি একটি মোডালে খোলে। কিন্তু যদি আপনি পেজটি রিফ্রেশ করেন বা সরাসরি ফটোর URL-এ নেভিগেট করেন, তবে এটি সেই ফটোর জন্য একটি ডেডিকেটেড পেজ দেখানো উচিত।

ফাইল কাঠামো:

app/
├── @modal/(..)(..)photos/[id]/page.js  // মোডালের জন্য ইন্টারসেপ্ট করা রুট
├── photos/
│   └── [id]/
│       └── page.js                  // ডেডিকেটেড ফটো পেজ
├── layout.js                        // রুট লেআউট যা @modal স্লট গ্রহণ করে
└── page.js                          // প্রধান গ্যালারি পেজ

ব্যাখ্যা:

এই প্যাটার্নটি প্যারালাল রুট (`@modal` স্লট) এবং উন্নত রাউটিং কনভেনশনগুলিকে একত্রিত করে একটি নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতা তৈরি করে যা ম্যানুয়ালি বাস্তবায়ন করা খুব জটিল হতো।

সেরা অনুশীলন এবং সাধারণ ভুল

রুট গ্রুপসের সেরা অনুশীলন

প্যারালাল রুটসের সেরা অনুশীলন

এড়িয়ে চলার মতো সাধারণ ভুল

উপসংহার: ওয়েব অ্যাপ্লিকেশনগুলির ভবিষ্যৎ নির্মাণ

Next.js অ্যাপ রাউটার, রুট গ্রুপস এবং প্যারালাল রুটসের মতো বৈশিষ্ট্য সহ, আধুনিক ওয়েব ডেভেলপমেন্টের জন্য একটি শক্তিশালী এবং স্কেলেবল ভিত্তি প্রদান করে। রুট গ্রুপস কোড সংগঠিত করার এবং URL সেমান্টিক্সে আপস না করে স্বতন্ত্র লেআউট প্রয়োগ করার জন্য একটি মার্জিত সমাধান সরবরাহ করে। প্যারালাল রুটস স্বাধীন স্টেটসহ ডাইনামিক, মাল্টি-প্যানেল ইন্টারফেস তৈরির ক্ষমতা আনলক করে, যা আগে কেবল জটিল ক্লায়েন্ট-সাইড স্টেট ম্যানেজমেন্টের মাধ্যমে অর্জন করা সম্ভব ছিল।

এই শক্তিশালী আর্কিটেকচারাল প্যাটার্নগুলি বোঝা এবং একত্রিত করার মাধ্যমে, আপনি সাধারণ ওয়েবসাইটগুলির বাইরে গিয়ে sofisticated, পারফরম্যান্ট এবং রক্ষণাবেক্ষণযোগ্য অ্যাপ্লিকেশন তৈরি করা শুরু করতে পারেন যা আজকের ব্যবহারকারীদের চাহিদা পূরণ করে। শেখার বক্ররেখাটি ক্লাসিক পেজেস রাউটারের চেয়ে খাড়া হতে পারে, তবে অ্যাপ্লিকেশন আর্কিটেকচার এবং ব্যবহারকারীর অভিজ্ঞতার ক্ষেত্রে এর প্রতিদান বিশাল। আপনার পরবর্তী প্রজেক্টে এই ধারণাগুলি নিয়ে পরীক্ষা শুরু করুন এবং Next.js-এর সম্পূর্ণ সম্ভাবনা আনলক করুন।