کامپوننت‌های کش‌شونده در Next.js – رندر جزئی، استریمینگ و کنترل دقیق حافظه کش

کامپوننت‌های کش‌شونده در Next.js روشی نوین برای ترکیب سرعت صفحات ایستا با تازگی داده‌های پویا ارائه می‌دهند. با استفاده از رندر جزئی (Partial Prerendering)، مرزهای Suspense، و دستور 'use cache' می‌توان بخش‌هایی از رابط کاربری و داده‌ها را کش کرد و در عین حال تجربه‌ای سریع و تعاملی برای کاربر فراهم ساخت. این مقاله نحوهٔ عملکرد، ابزارهای کنترل، و روش‌های برچسب‌گذاری و بازسازی کش را بررسی می‌کند.

Cache ComponentsPartial PrerenderingSuspenseuse cache

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۳ آبان ۱۴۰۴

مقدمه


کامپوننت‌های کش‌شونده در Next.js امکان ترکیب رندر ایستا و پویا را فراهم می‌کنند. به‌جای انتخاب بین سرعت صفحات ایستا یا تازگی داده‌های پویا، می‌توان بخش‌هایی از رابط کاربری یا داده‌ها را کش کرد و در صورت نیاز، محتوای پویا را به‌صورت استریم بارگذاری کرد. این قابلیت با استفاده از رندر جزئی (Partial Prerendering)، مرزهای Suspense، و دستور 'use cache' پیاده‌سازی می‌شود.


نحوهٔ عملکرد کامپوننت‌های کش‌شونده


با فعال‌سازی این قابلیت، همهٔ مسیرها به‌صورت پویا در نظر گرفته می‌شوند. اما می‌توان بخش‌هایی از صفحه را کش کرد تا در شِل اولیهٔ HTML گنجانده شوند. این شِل به‌سرعت به کاربر ارسال می‌شود و بخش‌های پویا به‌صورت استریم در ادامه بارگذاری می‌شوند.


برای فعال‌سازی، گزینهٔ cacheComponents: true را در فایل next.config.js تنظیم کنید.


سه ابزار اصلی برای کنترل رندر


۱. Suspense برای داده‌های زمان اجرا


کامپوننت‌هایی که از APIهای زمان اجرا مانند cookies()، headers() یا searchParams استفاده می‌کنند باید در مرز <Suspense> قرار گیرند تا سایر بخش‌ها بتوانند ایستا رندر شوند.


۲. Suspense برای داده‌های پویا


کامپوننت‌هایی که داده‌هایی مانند fetch یا db.query() دریافت می‌کنند نیز باید در مرز Suspense قرار گیرند تا امکان استریم فراهم شود.


۳. کش کردن داده‌ها با use cache


با افزودن 'use cache' به کامپوننت سروری یا توابع async می‌توان خروجی آن‌ها را کش کرد:


export async function getProducts() {
  'use cache'
  const data = await db.query('SELECT * FROM products')
  return data
}

استریمینگ و رندر جزئی


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


استفاده از cacheLife


برای تعیین مدت زمان اعتبار کش، از cacheLife استفاده کنید:


export default async function Page() {
  'use cache'
  cacheLife('hours')
  return <div>...</div>
}

نکات مهم و بهترین روش‌ها


  • ورودی توابع کش‌شونده باید قابل سریال‌سازی باشد
  • می‌توان مقادیر غیرسریال‌سازی را دریافت کرد، به شرطی که بررسی نشوند
  • نباید داده‌های زمان اجرا مانند cookies() را به توابع کش‌شونده ارسال کرد

برچسب‌گذاری و بازسازی کش


استفاده از updateTag


برای بازسازی فوری کش در همان درخواست:


export async function getCart() {
  'use cache'
  cacheTag('cart')
  // fetch cart data
}

export async function updateCart(itemId) {
  'use server'
  // update cart
  updateTag('cart')
}

استفاده از revalidateTag


برای بازسازی با تأخیر و رفتار stale-while-revalidate:


export async function getPosts() {
  'use cache'
  cacheTag('posts')
  // fetch posts
}

export async function createPost(post) {
  'use server'
  // create post
  revalidateTag('posts', 'max')
}

جمع‌بندی


کامپوننت‌های کش‌شونده در Next.js امکان کنترل دقیق رندر و حافظه کش را فراهم می‌کنند. با ترکیب مرزهای Suspense، استریمینگ، و دستور 'use cache' می‌توان اپلیکیشن‌هایی سریع، پویا و قابل نگهداری ساخت که هم تجربه کاربری عالی دارند و هم عملکرد بهینه.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

مسیریابی پیشرفته و هوک‌های عملکرد در Next.js — راهنمای توسعه‌دهنده برای App Router

Next.js مجموعه‌ای غنی از هوک‌های کلاینت و ابزارهای کش و ناوبری را در اختیار توسعه‌دهندگان قرار می‌دهد. از خواندن پارامترهای مسیر تا گزارش Web Vitals و مدیریت کش، این مقاله مهم‌ترین ابزارهای App Router را با مثال‌های کاربردی معرفی می‌کند.

ادامه

مدیریت احراز هویت و کش در Next.js — راهنمای توسعه‌دهنده برای امنیت و عملکرد پویا

Next.js با معرفی قابلیت‌های آزمایشی جدید، امکان کنترل دقیق‌تر دسترسی و کش داده‌ها را فراهم کرده است. تابع unauthorized برای مدیریت خطای 401 و هدایت کاربران به صفحه ورود، unstable_cache برای کش هوشمند عملیات سنگین، updateTag برای بازسازی آنی داده‌ها، و useLinkStatus برای نمایش وضعیت ناوبری استفاده می‌شوند. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات مهم بررسی می‌کند.

ادامه

redirect و refresh در Next.js — ریدایرکت‌های هوشمند و تازه‌سازی مسیر در Server Actions

تابع redirect در Next.js برای هدایت کاربر به مسیر جدید استفاده می‌شود و بسته به نوع استفاده، پاسخ HTTP با وضعیت 307 یا 303 ارسال می‌کند. این تابع در Server Components، Client Components، Route Handlers و Server Actions قابل استفاده است. تابع refresh نیز برای تازه‌سازی مسیر کلاینت از درون Server Action استفاده می‌شود. این مقاله نحوه استفاده از هر دو تابع را با مثال‌های کاربردی و نکات مهم توضیح می‌دهد.

ادامه

Next.js با معرفی NextRequest و NextResponse، APIهای Request و Response مرورگر را گسترش داده و ابزارهای قدرتمندی برای مدیریت کوکی‌ها، هدرها، ریدایرکت‌ها، بازنویسی مسیرها و پاسخ‌های JSON فراهم کرده است. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات امنیتی توضیح می‌دهد.

Next.js با معرفی NextRequest و NextResponse، APIهای Request و Response مرورگر را گسترش داده و ابزارهای قدرتمندی برای مدیریت کوکی‌ها، هدرها، ریدایرکت‌ها، بازنویسی مسیرها و پاسخ‌های JSON فراهم کرده است. این مقاله نحوه استفاده از این ابزارها را با مثال‌های کاربردی و نکات امنیتی توضیح می‌دهد.

ادامه

headers، ImageResponse، notFound و permanentRedirect در Next.js — مدیریت درخواست‌ها، تولید تصویر، خطا و ریدایرکت

Next.js ابزارهای قدرتمندی برای مدیریت درخواست‌ها و پاسخ‌ها در کامپوننت‌های سروری فراهم کرده است. تابع headers برای خواندن هدرهای HTTP ورودی، ImageResponse برای تولید تصاویر داینامیک، notFound برای نمایش صفحه خطای 404، و permanentRedirect برای ریدایرکت دائمی کاربران استفاده می‌شوند. این مقاله نحوه استفاده از هر یک را با مثال‌های کاربردی توضیح می‌دهد.

ادامه

راهنمای کامل استفاده از metadata و generateMetadata در Next.js

در نسخه‌های مدرن Next.js، مدیریت metadata صفحات بسیار قدرتمندتر و ساده‌تر شده است. metadata به‌صورت خودکار در تگ <head> صفحات تزریق می‌شود و نقش مهمی در SEO، اشتراک‌گذاری اجتماعی و تجربه کاربری دارد. این مقاله دو روش اصلی تعریف metadata را بررسی می‌کند: استفاده از آبجکت ثابت metadata و تابع داینامیک generateMetadata.

ادامه