loading.js و not-found.js در Next.js — رابط کاربری استریم‌شده، بازخورد فوری، و 404های دل‌نشین

Next.js با استفاده از فایل loading.js امکان نمایش رابط کاربری فوری هنگام بارگذاری را فراهم می‌کند و با فایل‌های not-found.js و global-not-found.js مدیریت خطاهای 404 را به‌صورت ظریف انجام می‌دهد. این مقاله نحوهٔ ساخت حالت‌های بارگذاری، صفحات 404 سفارشی، و بهینه‌سازی تجربه کاربری و SEO را آموزش می‌دهد.

loading.jsnot-found.jsglobal-not-found.jsSuspense

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

۱. loading.js — رابط کاربری فوری با Suspense


فایل loading.js امکان نمایش رابط کاربری جایگزین را هنگام بارگذاری بخش‌های مسیر فراهم می‌کند. این فایل به‌صورت خودکار page.js و فرزندان آن را درون <Suspense> قرار می‌دهد.

// app/feed/loading.tsx
export default function Loading() {
  return <p>در حال بارگذاری...</p>
}

نکات مهم:

  • استفاده از UI سبک مثل اسکلت یا spinner
  • می‌تواند Server یا Client Component باشد
  • پیش‌بارگذاری برای ناوبری سریع‌تر
  • layoutهای مشترک در حین بارگذاری قابل تعامل باقی می‌مانند

استفاده دستی از Suspense:

// app/dashboard/page.tsx
import { Suspense } from 'react'
import { PostFeed, Weather } from './Components'

export default function Posts() {
  return (
    <section>
      <Suspense fallback={<p>در حال بارگذاری فید...</p>}>
        <PostFeed />
      </Suspense>
      <Suspense fallback={<p>در حال بارگذاری هوا...</p>}>
        <Weather />
      </Suspense>
    </section>
  )
}

۲. SEO و رفتار استریم


  • metadata: قبل از شروع استریم حل می‌شود
  • کد وضعیت: همیشه 200 برای پاسخ‌های استریم‌شده
  • Soft 404: با تگ noindex در HTML جلوگیری می‌شود

۳. not-found.js — صفحه 404 در سطح مسیر


فایل not-found.js برای نمایش UI سفارشی هنگام فراخوانی notFound() در یک segment استفاده می‌شود.

// app/not-found.tsx
import Link from 'next/link'

export default function NotFound() {
  return (
    <div>
      <h2>یافت نشد</h2>
      <p>منبع مورد نظر پیدا نشد</p>
      <Link href="/">بازگشت به خانه</Link>
    </div>
  )
}

استریم در برابر غیر استریم:

  • استریم‌شده: وضعیت 200 + تگ noindex
  • غیر استریم: وضعیت 404 واقعی

مثال async:

export default async function NotFound() {
  const headersList = await headers()
  const domain = headersList.get('host')
  const data = await getSiteData(domain)

  return (
    <div>
      <h2>یافت نشد: {data.name}</h2>
      <p>منبع مورد نظر پیدا نشد</p>
      <p><Link href="/blog">مشاهده همه پست‌ها</Link></p>
    </div>
  )
}

۴. global-not-found.js — صفحه 404 سراسری


فایل global-not-found.js برای تعریف صفحه 404 سراسری برای مسیرهایی که با هیچ route مطابقت ندارند استفاده می‌شود.

// app/global-not-found.tsx
import './globals.css'
import { Inter } from 'next/font/google'

const inter = Inter({ subsets: ['latin'] })

export default function GlobalNotFound() {
  return (
    <html lang="en" className={inter.className}>
      <body>
        <h1>404 - صفحه یافت نشد</h1>
        <p>این صفحه وجود ندارد.</p>
      </body>
    </html>
  )
}

فعال‌سازی در next.config.ts:

const nextConfig = {
  experimental: {
    globalNotFound: true,
  },
}

موارد استفاده:

  • چند root layout مانند (admin) و (shop)
  • segmentهای داینامیک سطح بالا مانند [country]

جمع‌بندی


با استفاده از loading.js، not-found.js و global-not-found.js، Next.js امکان مدیریت رابط کاربری استریم‌شده و خطاهای 404 را به‌صورت حرفه‌ای فراهم می‌کند. این قابلیت‌ها تجربه کاربری، سرعت ناوبری، و SEO را بهبود می‌بخشند و اپلیکیشن شما را سریع، پاسخ‌گو و قابل اعتماد می‌سازند.


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

مقالات مرتبط

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

ادامه