انتقال‌های سمت کلاینت در Next.js – بهینه‌سازی ناوبری با prefetch، loading و history API

Next.js با استفاده از انتقال‌های سمت کلاینت، تجربه‌ای روان و سریع برای ناوبری بین صفحات فراهم می‌کند. این مقاله نحوهٔ عملکرد <Link>، دلایل کندی ناوبری، راهکارهایی مانند loading.tsx، prefetch روی hover، و استفاده از history API برای به‌روزرسانی URL بدون بارگذاری مجدد را بررسی می‌کند.

client-side transitionsloading.tsxuseLinkStatuswindow.history

~3 min read · Updated Oct 25, 2025

مقدمه


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


مزایای انتقال سمت کلاینت


  • حفظ لایه‌ها و UI مشترک
  • جایگزینی صفحه فعلی با حالت بارگذاری یا صفحه جدید
  • احساس اپلیکیشن کلاینتی در اپلیکیشن‌های سروری

دلایل کندی ناوبری و راهکارها


۱. مسیرهای پویا بدون loading.tsx


در مسیرهای پویا، اگر فایل loading.tsx وجود نداشته باشد، کاربر باید منتظر پاسخ سرور بماند. افزودن این فایل باعث پیش‌بارگذاری جزئی و نمایش UI موقتی می‌شود:


// app/blog/[slug]/loading.tsx
export default function Loading() {
  return <LoadingSkeleton />;
}

۲. نبود generateStaticParams


اگر مسیر پویا قابل پیش‌پردازش باشد ولی تابع generateStaticParams تعریف نشده باشد، مسیر به‌صورت پویا در زمان درخواست رندر می‌شود:


export async function generateStaticParams() {
  const posts = await fetch('https://.../posts').then((res) => res.json())
  return posts.map((post) => ({ slug: post.slug }))
}

۳. شبکه‌های کند


در شبکه‌های ضعیف، ممکن است پیش‌بارگذاری قبل از کلیک کامل نشود. برای بازخورد فوری، از هوک useLinkStatus استفاده کنید:


// app/ui/loading-indicator.tsx
'use client'
import { useLinkStatus } from 'next/link'

export default function LoadingIndicator() {
  const { pending } = useLinkStatus()
  return (
    <span aria-hidden className={`link-hint ${pending ? 'is-pending' : ''}`} />
  )
}

۴. غیرفعال‌سازی prefetch


برای کاهش مصرف منابع، می‌توان prefetch را غیرفعال کرد یا فقط هنگام hover فعال ساخت:


// app/ui/hover-prefetch-link.tsx
'use client'
import Link from 'next/link'
import { useState } from 'react'

function HoverPrefetchLink({ href, children }) {
  const [active, setActive] = useState(false)
  return (
    <Link
      href={href}
      prefetch={active ? null : false}
      onMouseEnter={() => setActive(true)}
    >
      {children}
    </Link>
  )
}

۵. تأخیر در hydration


کامپوننت <Link> باید ابتدا hydrate شود تا بتواند پیش‌بارگذاری کند. برای بهبود:


  • استفاده از @next/bundle-analyzer برای کاهش حجم باندل
  • انتقال منطق از کلاینت به سرور

استفاده از History API


Next.js اجازه استفاده از window.history.pushState و replaceState را برای به‌روزرسانی URL بدون بارگذاری مجدد می‌دهد:


مثال: مرتب‌سازی لیست محصولات


'use client'
import { useSearchParams } from 'next/navigation'

export default function SortProducts() {
  const searchParams = useSearchParams()
  function updateSorting(sortOrder) {
    const params = new URLSearchParams(searchParams.toString())
    params.set('sort', sortOrder)
    window.history.pushState(null, '', `?${params.toString()}`)
  }
}

مثال: تغییر زبان اپلیکیشن


'use client'
import { usePathname } from 'next/navigation'

export function LocaleSwitcher() {
  const pathname = usePathname()
  function switchLocale(locale) {
    const newPath = `/${locale}${pathname}`
    window.history.replaceState(null, '', newPath)
  }
}

جمع‌بندی


انتقال‌های سمت کلاینت در Next.js باعث ناوبری سریع، حفظ وضعیت و تجربه کاربری روان می‌شوند. با استفاده از loading.tsx، useLinkStatus، و History API می‌توان مسیرهای پویا را بهینه کرد و بازخورد فوری به کاربر ارائه داد.


Written & researched by Dr. Shahin Siami

Related Articles

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

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

Continue

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

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

Continue

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

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

Continue

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

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

Continue

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

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

Continue

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

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

Continue