ساخت وضعیت‌های بارگذاری معنادار در Next.js – استریمینگ، پیش‌بارگذاری و دریافت موازی داده‌ها

در Next.js می‌توان با استفاده از مرزهای Suspense، دریافت موازی داده‌ها، و پیش‌بارگذاری هوشمند، وضعیت‌های بارگذاری معنادار طراحی کرد. این مقاله نحوهٔ نمایش فوری UI موقتی، جلوگیری از تأخیر در رندر، و استفاده از تکنیک‌هایی مانند Promise.all و preload را برای بهبود تجربه کاربری بررسی می‌کند.

loading stateparallel data fetchingSuspensepreload

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

مقدمه


وضعیت بارگذاری فوری (Instant Loading State) رابطی موقتی است که بلافاصله پس از ناوبری به کاربر نمایش داده می‌شود. برای تجربهٔ کاربری بهتر، توصیه می‌شود از اسکلت‌ها، اسپینرها یا بخش‌هایی از رابط نهایی مانند عکس کاور یا عنوان استفاده شود تا کاربر حس کند اپلیکیشن در حال پاسخ‌گویی است.


دریافت ترتیبی داده‌ها


در دریافت ترتیبی، کامپوننت‌های تو در تو هرکدام دادهٔ خود را جداگانه دریافت می‌کنند و این درخواست‌ها deduplicate نمی‌شوند. اگر کامپوننتی به خروجی کامپوننت دیگر وابسته باشد، این الگو مفید است.


مثلاً کامپوننت <Playlists> فقط پس از دریافت اطلاعات <Artist> شروع به دریافت داده می‌کند:


// app/artist/[username]/page.tsx
export default async function Page({ params }) {
  const { username } = await params
  const artist = await getArtist(username)

  return (
    <>
      <h1>{artist.name}</h1>
      <Suspense fallback={<div>Loading...</div>}>
        <Playlists artistID={artist.id} />
      </Suspense>
    </>
  )
}

async function Playlists({ artistID }) {
  const playlists = await getArtistPlaylists(artistID)
  return (
    <ul>
      {playlists.map((playlist) => (
        <li key={playlist.id}>{playlist.name}</li>
      ))}
    </ul>
  )
}

دریافت موازی داده‌ها


در دریافت موازی، درخواست‌ها هم‌زمان آغاز می‌شوند. در Next.js، صفحات و لایه‌ها به‌صورت پیش‌فرض موازی رندر می‌شوند، اما درون یک کامپوننت، درخواست‌های پشت سر هم همچنان ترتیبی هستند.


برای دریافت موازی، ابتدا درخواست‌ها را آغاز کرده و سپس با Promise.all آن‌ها را await کنید:


// app/artist/[username]/page.tsx
export default async function Page({ params }) {
  const { username } = await params

  const artistData = getArtist(username)
  const albumsData = getAlbums(username)

  const [artist, albums] = await Promise.all([artistData, albumsData])

  return (
    <>
      <h1>{artist.name}</h1>
      <Albums list={albums} />
    </>
  )
}

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


پیش‌بارگذاری داده‌ها


می‌توان داده‌ها را قبل از بلاک شدن مسیر، با تابع preload() آغاز کرد. این کار باعث می‌شود هنگام رندر کامپوننت، داده‌ها از قبل آماده باشند:


// app/item/[id]/page.tsx
export default async function Page({ params }) {
  const { id } = await params
  preload(id)
  const isAvailable = await checkIsAvailable()
  return isAvailable ? <Item id={id} /> : null
}

export const preload = (id) => {
  void getItem(id)
}

export async function Item({ id }) {
  const result = await getItem(id)
  // ...
}

کش کردن توابع دریافت داده


برای کش کردن توابع دریافت داده، می‌توان از cache در React و پکیج server-only استفاده کرد:


// utils/get-item.ts
import { cache } from 'react'
import 'server-only'
import { getItem } from '@/lib/data'

export const preload = (id) => {
  void getItem(id)
}

export const getItem = cache(async (id) => {
  // ...
})

جمع‌بندی


با استفاده از وضعیت‌های بارگذاری معنادار، دریافت موازی داده‌ها، و پیش‌بارگذاری هوشمند، می‌توان تجربه‌ای سریع، روان و قابل اعتماد برای کاربر در Next.js فراهم کرد. استفاده از مرزهای <Suspense> و کش سروری باعث بهینه‌سازی رندر و کاهش زمان انتظار می‌شود.


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

مقالات مرتبط

مسیریابی پیشرفته و هوک‌های عملکرد در 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.

ادامه