← Blog

Next.js هل لا يتم تحديث البيانات الوصفية؟ وهنا لماذا

تقوم بتحديث generateMetadata، وإعادة النشر، وسيظل العنوان أو الصورة القديمة تظهر عند مشاركة الرابط. فيما يلي كيفية معرفة ما إذا كانت طبقة تخزين مؤقت أو خطأ في التعليمات البرمجية.

لست متأكدًا مما إذا كان هذا هو الرمز الخاص بك أم ذاكرة التخزين المؤقت؟

التحقق من ذلك مجانا مع Proovd. فهو يعرض بالضبط البيانات الوصفية التي يعرضها عنوان URL المباشر الخاص بك الآن، بشكل مستقل عن ذاكرة التخزين المؤقت الخاصة بأي نظام أساسي.

إجابة سريعة

  • معظم الحالات هي ذاكرة التخزين المؤقت للبيانات الخاصة بـ Next.js أو ذاكرة التخزين المؤقت CDN التي تخدم HTML قديمًا، وليست خطأً برمجيًا
  • يتم إعادة تشغيل generateMetadata في مكون الخادم فقط عند إعادة التحقق من صحة ذاكرة التخزين المؤقت للجلب الأساسية
  • الباقي عادة ما يكون ذاكرة التخزين المؤقت للنظام الأساسي (Facebook، LinkedIn، وما إلى ذلك)، وليس Next.js. تحقق من كليهما قبل افتراض أي منهما

مثال قابل للتكرار

يبدو هذا صحيحًا ولكنه سيستمر في عرض البيانات الوصفية القديمة بعد تغيير المحتوى:

export async function generateMetadata({ params }) {
  const post = await fetch(`https://api.example.com/posts/${params.slug}`).then(r => r.json());

  return {
    title: post.title,
    openGraph: {
      images: [post.image],
    },
  };
}

يتم تخزين المكالمة fetch هنا مؤقتًا بواسطة ذاكرة التخزين المؤقت لبيانات Next.js بشكل افتراضي. إذا تغير post.title أو post.image في CMS، فلن ترى هذه الوظيفة القيمة الجديدة حتى يتم إعادة التحقق من صحة ذاكرة التخزين المؤقت. مع عدم وجود استراتيجية واضحة، قد يعني ذلك أنه لن يتم ذلك حتى البناء الكامل التالي.

لماذا لا يتم تحديث البيانات الوصفية الخاصة بك

يتم تخزين الجلب الأساسي مؤقتًا

افتراضيًا، يتم تخزين fetch() بالداخل generateMetadata مؤقتًا إلى أجل غير مسمى في جهاز توجيه التطبيق. قم بالإصلاح عن طريق تعيين نافذة إعادة التحقق الصريحة:

const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());

أو قم بإلغاء الاشتراك في التخزين المؤقت بالكامل لهذا الطلب:

const post = await fetch(url, { cache: "no-store" }).then(r => r.json());

يتم إنشاء المسار بشكل ثابت

إذا كان المسار يستخدم generateStaticParams مع عدم تكوين إعادة التحقق، فسيتم دمج المسار بالكامل، بما في ذلك البيانات التعريفية، في وقت الإنشاء. تؤدي إضافة export const revalidate = 3600; على مستوى الصفحة إلى فرض التجديد الدوري.

تخدم ذاكرة التخزين المؤقت CDN أو الحافة HTML القديم

حتى لو كان الإصدار الخاص بك صحيحًا، يمكن لشبكة Vercel's Edge Network أو Cloudflare أو CDN أخرى أمام تطبيقك تقديم استجابة HTML مخبأة تسبق الإصلاح. التحقق من رؤوس الاستجابة:

curl -I https://yoursite.com/blog/post-slug

ابحث عن x-vercel-cache: HIT أو رأس CDN مشابه. يعني HIT أنك تنظر إلى نسخة مخبأة، وليس إلى أحدث عملية نشر.

opengraph-image.ts لا يلتقط بيانات جديدة

إذا كنت تستخدم اصطلاح opengraph-image.ts القائم على الملف، فإن Next.js يُنشئ صورة ثابتة في وقت الإنشاء بشكل افتراضي. يخضع المحتوى الديناميكي بداخله لنفس قواعد التخزين المؤقت كأي مكون خادم آخر، لذا قم بإضافة إعادة التحقق الصريحة إذا كان بحاجة إلى البقاء محدثًا.

إنها في الواقع ذاكرة التخزين المؤقت للنظام الأساسي، وليست ملكك

الإنذار الكاذب الأكثر شيوعاً. يمكن أن يقدم تطبيقك بيانات وصفية جديدة تمامًا بينما لا تزال Facebook أو LinkedIn أو Slack تعرض معاينة تم تخزينها مؤقتًا منذ أيام. قم بتأكيد ما يرسله خادمك قبل لمس أي رمز Next.js. راجع دليلنا لمسح ذاكرة التخزين المؤقت لـ OG على كل منصة.

دليل الإصلاح خطوة بخطوة

  1. تشغيل curl -s https://yoursite.com/page | grep -i "og:" لمعرفة ما يرسله خادمك بالفعل
  2. تحقق من وجود رأس CDN مخبأ HIT مع curl -I https://yoursite.com/page
  3. أضف تحقق صريح أو ذاكرة تخزين مؤقت: "no-store" لجلب الداخل generateMetadata
  4. فرض عملية نشر جديدة لاستبعاد ذاكرة التخزين المؤقت للإنشاء التي لا معنى لها
  5. التحقق من النتيجة المباشرة مع Proovd

Next.js مقابل الأطر الأخرى

Framework Common cause Fix pattern
Next.js (App Router) Cached fetch inside generateMetadata, or static build with no ISR revalidate option or cache: "no-store"
Astro Client-only meta tag injection instead of static frontmatter/SSR Move tags into the page's static output
SvelteKit Meta tags set only client-side, not in the server load function Load meta values server-side, pass to the head

قائمة مراجعة الإصلاح السريع

  1. يحتوي إخراج HTML الخام المؤكد على العلامات الصحيحة (وليس فقط DOM للمتصفح)
  2. تمت إضافة إعادة التحقق الصريحة أو ذاكرة التخزين المؤقت: "no-store" لجلبها إلى الداخل generateMetadata
  3. تم التحقق من رؤوس ذاكرة التخزين المؤقت CDN/حافة بحثًا عن إصابة قديمة
  4. تم التأكيد على ما إذا كان المسار ثابتًا تمامًا بدون ISR
  5. استبعد ذاكرة التخزين المؤقت الخاصة بالمنصة الاجتماعية باعتبارها السبب الحقيقي
  6. تم التحقق من الإخراج المباشر النهائي بـ Proovd

الأسئلة المتداولة

لماذا يتم تحديث og:image في المتصفح ولكن ليس على Facebook أو LinkedIn؟

من المحتمل أن تطبيق Next.js الخاص بك يعرض بالفعل العلامة الصحيحة. يعرض النظام الأساسي نسخة تم تخزينها مؤقتًا قبل الإصلاح. استخدم أداة تحديث ذاكرة التخزين المؤقت الخاصة بهذا النظام الأساسي بدلاً من تغيير المزيد من التعليمات البرمجية.

هل يتم إعادة التحقق من الصحة: ​​0 تعطيل التخزين المؤقت بالكامل؟

الإعداد التحقق من الصحة: ​​0 يفرض بشكل فعال العرض الديناميكي لهذا الجلب عند كل طلب، على غرار ذاكرة التخزين المؤقت: "no-store". استخدمه باعتدال لأنه يزيل فائدة الأداء المتمثلة في التخزين المؤقت.

تأكد مما يقدمه تطبيق Next.js فعليًا

تحقق من البيانات الوصفية المباشرة الخاصة بك مجانًا باستخدام Proovd. إنه يعرض بالضبط ما هو موجود في HTML الخاص بك الآن، بشكل مستقل عن ذاكرة التخزين المؤقت لأي نظام أساسي.