getStaticPaths
إذا كانت الصفحة تحتوي على مسارات ديناميكية وتستخدم getStaticProps، فإنها تحتاج إلى تحديد قائمة بالمسارات التي سيتم إنشاؤها بشكل ثابت.
عندما تصدر دالة تسمى getStaticPaths (إنشاء موقع ثابت) من صفحة تستخدم مسارات ديناميكية، فإن Next.js سيقوم بإنشاء جميع المسارات المحددة بواسطة getStaticPaths مسبقًا بشكل ثابت.
import type {
InferGetStaticPropsType,
GetStaticProps,
GetStaticPaths,
} from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticPaths = (async () => {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // انظر قسم "paths" أدناه
],
fallback: true, // false أو "blocking"
}
}) satisfies GetStaticPaths
export const getStaticProps = (async (context) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}) satisfies GetStaticProps<{
repo: Repo
}>
export default function Page({
repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return repo.stargazers_count
}export async function getStaticPaths() {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // انظر قسم "paths" أدناه
],
fallback: true, // false أو "blocking"
}
}
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}
export default function Page({ repo }) {
return repo.stargazers_count
}مرجع واجهة برمجة التطبيقات getStaticPaths يغطي جميع المعلمات والخصائص التي يمكن استخدامها مع getStaticPaths.
متى يجب استخدام getStaticPaths؟
يجب استخدام getStaticPaths إذا كنت تقوم بإنشاء صفحات تستخدم مسارات ديناميكية بشكل مسبق وثابت عندما:
- تأتي البيانات من نظام إدارة محتوى (CMS) بدون واجهة
- تأتي البيانات من قاعدة بيانات
- تأتي البيانات من نظام الملفات
- يمكن تخزين البيانات مؤقتًا بشكل عام (وليست خاصة بالمستخدم)
- يجب إنشاء الصفحة مسبقًا (لتحسين محركات البحث SEO) وتكون سريعة جدًا — حيث يقوم
getStaticPropsبإنشاء ملفاتHTMLوJSON، وكلاهما يمكن تخزينه مؤقتًا بواسطة شبكة توصيل المحتوى (CDN) لتحسين الأداء
متى يتم تشغيل getStaticPaths
سيتم تشغيل getStaticPaths فقط أثناء عملية البناء في بيئة الإنتاج، ولن يتم استدعاؤه أثناء وقت التشغيل. يمكنك التحقق من إزالة الكود المكتوب داخل getStaticPaths من حزمة العميل باستخدام هذه الأداة.
كيف يعمل getStaticProps فيما يتعلق بـ getStaticPaths
- يتم تشغيل
getStaticPropsأثناءnext buildلأيpathsتم إرجاعها أثناء البناء - يتم تشغيل
getStaticPropsفي الخلفية عند استخدامfallback: true - يتم استدعاء
getStaticPropsقبل العرض الأولي عند استخدامfallback: blocking
أين يمكن استخدام getStaticPaths
- يجب استخدام
getStaticPathsمعgetStaticProps - لا يمكن استخدام
getStaticPathsمعgetServerSideProps - يمكنك تصدير
getStaticPathsمن مسار ديناميكي يستخدم أيضًاgetStaticProps - لا يمكن تصدير
getStaticPathsمن ملف غير صفحة (مثل مجلدcomponents) - يجب تصدير
getStaticPathsكدالة مستقلة، وليس كخاصية لمكون الصفحة
التشغيل في كل طلب في وضع التطوير
في وضع التطوير (next dev)، سيتم استدعاء getStaticPaths في كل طلب.
إنشاء المسارات عند الطلب
يسمح لك getStaticPaths بالتحكم في الصفحات التي يتم إنشاؤها أثناء البناء بدلاً من إنشائها عند الطلب باستخدام fallback. إنشاء المزيد من الصفحات أثناء البناء سيؤدي إلى عمليات بناء أبطأ.
يمكنك تأجيل إنشاء جميع الصفحات عند الطلب عن طريق إرجاع مصفوفة فارغة لـ paths. يمكن أن يكون هذا مفيدًا بشكل خاص عند نشر تطبيق Next.js الخاص بك في بيئات متعددة. على سبيل المثال، يمكنك الحصول على عمليات بناء أسرع عن طريق إنشاء جميع الصفحات عند الطلب للمعاينات (وليس لبناء الإنتاج). هذا مفيد للمواقع التي تحتوي على مئات/آلاف الصفحات الثابتة.
export async function getStaticPaths() {
// عندما يكون هذا صحيحًا (في بيئات المعاينة) لا تقم
// بإنشاء أي صفحات ثابتة مسبقًا
// (عمليات بناء أسرع، ولكن تحميل أولي للصفحة أبطأ)
if (process.env.SKIP_BUILD_STATIC_GENERATION) {
return {
paths: [],
fallback: 'blocking',
}
}
// استدعاء نقطة نهاية API خارجية للحصول على المنشورات
const res = await fetch('https://.../posts')
const posts = await res.json()
// الحصول على المسارات التي نريد إنشاؤها مسبقًا بناءً على المنشورات
// في بيئات الإنتاج، قم بإنشاء جميع الصفحات مسبقًا
// (عمليات بناء أبطأ، ولكن تحميل أولي للصفحة أسرع)
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// { fallback: false } يعني أن المسارات الأخرى يجب أن تعرض خطأ 404
return { paths, fallback: false }
}