فارسی

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

روتر اپلیکیشن Next.js: SSR در مقابل SSG - یک راهنمای جامع

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

درک اصول اولیه: SSR و SSG

قبل از پرداختن به جزئیات روتر اپلیکیشن Next.js، بیایید درک روشنی از SSR و SSG به دست آوریم.

رندر سمت سرور (SSR)

SSR تکنیکی است که در آن کامپوننت‌های React برای هر درخواست، روی سرور به HTML رندر می‌شوند. سرور، HTML کاملاً رندر شده را به مرورگر کلاینت ارسال می‌کند، که سپس صفحه را هیدراته (hydrate) کرده و آن را تعاملی می‌سازد.

ویژگی‌های کلیدی SSR:

تولید سایت استاتیک (SSG)

از سوی دیگر، SSG شامل پیش‌رندر کردن کامپوننت‌های React به HTML در زمان ساخت (build time) است. فایل‌های HTML تولید شده سپس مستقیماً از یک CDN یا وب سرور ارائه می‌شوند.

ویژگی‌های کلیدی SSG:

SSR در مقابل SSG در روتر اپلیکیشن Next.js: تفاوت‌های کلیدی

روتر اپلیکیشن Next.js پارادایم جدیدی را برای تعریف مسیرها و مدیریت واکشی داده‌ها معرفی می‌کند. بیایید بررسی کنیم که SSR و SSG چگونه در این محیط جدید پیاده‌سازی می‌شوند و تفاوت‌های کلیدی بین آنها چیست.

واکشی داده در روتر اپلیکیشن

روتر اپلیکیشن یک رویکرد یکپارچه برای واکشی داده با استفاده از سینتکس `async/await` در کامپوننت‌های سرور ارائه می‌دهد. این امر فرآیند واکشی داده را بدون توجه به اینکه از SSR یا SSG استفاده می‌کنید، ساده می‌کند.

کامپوننت‌های سرور: کامپوننت‌های سرور نوع جدیدی از کامپوننت‌های React هستند که منحصراً روی سرور اجرا می‌شوند. این به شما امکان می‌دهد تا داده‌ها را مستقیماً در کامپوننت‌های خود بدون نیاز به ایجاد مسیرهای API واکشی کنید.

مثال (SSR):

// app/blog/[slug]/page.js
import { getBlogPost } from './data';

export default async function BlogPost({ params }) {
  const post = await getBlogPost(params.slug);

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>
  );
}

در این مثال، تابع `getBlogPost` داده‌های پست وبلاگ را برای هر درخواست روی سرور واکشی می‌کند. عبارت `export default async function BlogPost` نشان می‌دهد که این یک کامپوننت سرور است.

مثال (SSG):

// app/blog/[slug]/page.js
import { getBlogPost } from './data';

export async function generateStaticParams() {
  const posts = await getAllBlogPosts();
  return posts.map((post) => ({ slug: post.slug }));
}

export default async function BlogPost({ params }) {
  const post = await getBlogPost(params.slug);

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>
  );
}

در اینجا، تابع `generateStaticParams` برای پیش‌رندر کردن پست‌های وبلاگ برای تمام اسلاگ‌های موجود در زمان ساخت استفاده می‌شود. این برای SSG حیاتی است.

استراتژی‌های کشینگ

روتر اپلیکیشن Next.js مکانیزم‌های کشینگ داخلی را برای بهینه‌سازی عملکرد هم برای SSR و هم برای SSG فراهم می‌کند. درک این مکانیزم‌ها حیاتی است.

کش داده: به طور پیش‌فرض، داده‌هایی که با استفاده از `fetch` در کامپوننت‌های سرور واکشی می‌شوند، به طور خودکار کش می‌شوند. این بدان معناست که درخواست‌های بعدی برای همان داده از کش ارائه می‌شوند و بار روی منبع داده شما را کاهش می‌دهند.

کش کامل مسیر: خروجی رندر شده کامل یک مسیر می‌تواند کش شود که عملکرد را بیشتر بهبود می‌بخشد. شما می‌توانید رفتار کش را با استفاده از گزینه `cache` در فایل‌های `route.js` یا `page.js` خود پیکربندی کنید.

مثال (غیرفعال کردن کش):

// app/blog/[slug]/page.js

export const fetchCache = 'force-no-store';

import { getBlogPost } from './data';

export default async function BlogPost({ params }) {
  const post = await getBlogPost(params.slug);

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>
  );
}

در این مورد، `fetchCache = 'force-no-store'` کشینگ را برای این مسیر خاص غیرفعال می‌کند و اطمینان می‌دهد که داده‌ها همیشه به صورت تازه از سرور واکشی می‌شوند.

توابع پویا

شما می‌توانید یک مسیر را در زمان اجرا به عنوان پویا اعلام کنید با تنظیم گزینه پیکربندی `dynamic` برای سگمنت مسیر. این به Next.js اطلاع می‌دهد که آیا یک مسیر از توابع پویا استفاده می‌کند و باید در زمان ساخت به طور متفاوتی با آن رفتار شود.

مثال (سگمنت مسیر پویا):

// app/blog/[slug]/page.js
export const dynamic = 'force-dynamic'; // static by default, unless reading the request

import { getBlogPost } from './data';

export default async function BlogPost({ params }) {
  const post = await getBlogPost(params.slug);

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>
  );
}

بازسازی استاتیک افزایشی (ISR)

روتر اپلیکیشن، بازسازی استاتیک افزایشی (ISR) را به عنوان یک رویکرد ترکیبی ارائه می‌دهد که مزایای SSR و SSG را با هم ترکیب می‌کند. ISR به شما امکان می‌دهد صفحات را به صورت استاتیک تولید کنید و در عین حال بتوانید آنها را در پس‌زمینه در یک بازه زمانی مشخص به‌روزرسانی کنید.

ISR چگونه کار می‌کند:

  1. اولین درخواست به یک صفحه، تولید استاتیک را فعال می‌کند.
  2. درخواست‌های بعدی از کش تولید شده به صورت استاتیک ارائه می‌شوند.
  3. در پس‌زمینه، Next.js صفحه را پس از یک بازه زمانی مشخص (زمان revalidate) بازسازی می‌کند.
  4. پس از اتمام بازسازی، کش با نسخه جدید صفحه به‌روز می‌شود.

پیاده‌سازی ISR:

برای فعال کردن ISR، باید گزینه `revalidate` را در تابع `getStaticProps` خود (در دایرکتوری `pages`) یا گزینه‌های `fetch` (در دایرکتوری `app`) پیکربندی کنید.

مثال (ISR در روتر اپلیکیشن):

// app/blog/[slug]/page.js
import { getBlogPost } from './data';

export default async function BlogPost({ params }) {
  const post = await getBlogPost(params.slug);

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>
  );
}

export const revalidate = 60; // Revalidate every 60 seconds

این مثال ISR را طوری پیکربندی می‌کند که پست وبلاگ هر 60 ثانیه یکبار بازسازی شود. این کار محتوای استاتیک شما را بدون نیاز به ساخت مجدد کل سایت، تازه نگه می‌دارد.

انتخاب استراتژی مناسب: یک راهنمای عملی

انتخاب بین SSR، SSG و ISR به نیازهای خاص اپلیکیشن شما بستگی دارد. در اینجا یک چارچوب تصمیم‌گیری ارائه شده است:

چه زمانی از SSR استفاده کنیم:

مثال: یک وب‌سایت خبری با مقالات دائماً به‌روز شده و هشدارهای اخبار فوری. همچنین برای فیدهای شبکه‌های اجتماعی که در زمان واقعی تازه‌سازی می‌شوند مناسب است.

چه زمانی از SSG استفاده کنیم:

مثال: یک وب‌سایت پورتفولیوی شخصی که مهارت‌ها و پروژه‌های شما را به نمایش می‌گذارد. صفحه «درباره ما» یک شرکت، که به ندرت تغییر می‌کند.

چه زمانی از ISR استفاده کنیم:

مثال: یک وب‌سایت تجارت الکترونیک با قیمت محصولات که روزانه به‌روز می‌شود. وبلاگی که مقالات جدید چند بار در هفته منتشر می‌شوند.

بهترین شیوه‌ها برای پیاده‌سازی SSR و SSG در روتر اپلیکیشن Next.js

برای اطمینان از عملکرد بهینه و قابلیت نگهداری، این بهترین شیوه‌ها را هنگام پیاده‌سازی SSR و SSG در روتر اپلیکیشن Next.js دنبال کنید:

ملاحظات پیشرفته

توابع Edge

Next.js همچنین از توابع Edge پشتیبانی می‌کند که به شما امکان می‌دهد توابع بدون سرور را در شبکه لبه اجرا کنید. این می‌تواند برای کارهایی مانند تست A/B، احراز هویت و شخصی‌سازی مفید باشد.

میدل‌ور (Middleware)

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

بین‌المللی‌سازی (i18n)

هنگام ساخت اپلیکیشن‌های جهانی، بین‌المللی‌سازی حیاتی است. Next.js پشتیبانی داخلی برای i18n فراهم می‌کند و به شما امکان می‌دهد به راحتی نسخه‌های محلی‌سازی شده وب‌سایت خود را ایجاد کنید.

مثال (تنظیم i18n):

// next.config.js
module.exports = {
  i18n: {
    locales: ['en', 'fr', 'es', 'de'],
    defaultLocale: 'en',
  },
}

نمونه‌های دنیای واقعی

بیایید چند نمونه از دنیای واقعی را در نظر بگیریم که چگونه شرکت‌های مختلف از SSR، SSG و ISR با Next.js استفاده می‌کنند:

نتیجه‌گیری

روتر اپلیکیشن Next.js یک پلتفرم قدرتمند و انعطاف‌پذیر برای ساخت اپلیکیشن‌های وب مدرن ارائه می‌دهد. درک تفاوت‌های بین SSR و SSG، به همراه مزایای ISR، برای تصمیم‌گیری آگاهانه در مورد استراتژی رندرینگ شما حیاتی است. با در نظر گرفتن دقیق نیازهای خاص اپلیکیشن خود و پیروی از بهترین شیوه‌ها، می‌توانید عملکرد، سئو و تجربه کاربری را بهینه کنید و در نهایت یک اپلیکیشن وب موفق بسازید که به مخاطبان جهانی پاسخ می‌دهد.

به یاد داشته باشید که به طور مداوم عملکرد اپلیکیشن خود را نظارت کنید و استراتژی رندرینگ خود را در صورت نیاز تطبیق دهید. چشم‌انداز توسعه وب دائماً در حال تحول است، بنابراین به‌روز ماندن با آخرین روندها و فناوری‌ها برای موفقیت ضروری است.