تحسين محركات البحث في Gatsby

دليل لتحسين موقع Gatsby للبحث: مسارات العرض الأربعة SSG وDSG وSSR والمسارات الخاصة بالعميل، وHead API الحديثة، وخرائط الموقع ووسوم canonical وSEO الصور وكلفة React على Core Web Vitals ومخاطر الصيانة.

نُشر أول مرة: 26 يونيو 2026 · آخر تحديث: 22 أغسطس 2026 · Advanced
اللغات
دليل واحد في هذه الصفحة

يوفر Gatsby أربعة خيارات للعرض: SSG الافتراضي الذي يعرض الصفحات مسبقًا إلى HTML ثابت عند gatsby build، وDSG الذي ينشئ الصفحة عند أول طلب، وSSR الذي يعرضها لكل طلب عبر Gatsby Functions، ومسارات خاصة بالعميل تُعرض في المتصفح بالكامل. تعتمد معظم مواقع Gatsby على SSG، لذلك تحصل الزواحف على HTML كامل من أول جلب بلا انتظار طابور عرض، لكن هذا الأساس لا ينطبق تلقائيًا على بقية المسارات. وبصرف النظر عن المسار، يرسل Gatsby وقت تشغيل React كاملًا بنحو 200KB أو أكثر ويرطبه لدى العميل، وهي كلفة على Core Web Vitals لا على قابلية الزحف. الطريقة الحالية لإدارة البيانات الوصفية هي Gatsby Head API المدمجة منذ v4.19. ومن المشكلات المتكررة تكرار وسم canonical، وتسرب المسودات والصفحات اليتيمة إلى الخريطة، وغياب النص البديل، وقصر إنشاء الخريطة على الإنتاج، وحاجة مسارات DSG وSSR والمسارات الخاصة بالعميل إلى فحوص صريحة، وتباطؤ صيانة الإطار منذ استحواذ Netlify عام 2023.

الخلاصة — لدى Gatsby أربعة أنماط عرض: SSG الافتراضي وDSG وSSR والمسارات العاملة لدى العميل، ولا تضع كلها المحتوى في HTML الخام بالطريقة نفسها. يعرض SSG الصفحة وقت gatsby build؛ ويؤجل DSG التوليد إلى أول طلب؛ وينشئ SSR الصفحة لكل طلب؛ ولا تعرض المسارات الخاصة بالعميل محتوى خاصًا بالمسار قبل JavaScript. أيًا كان المسار، يرطب Gatsby الصفحة بحزمة React كاملة تقارب 200KB أو أكثر، وهي كلفة أداء لا زحف. النهج الحالي للبيانات الوصفية هو Gatsby Head API المدمج منذ v4.19 بدل gatsby-plugin-react-helmet. وتشمل الأخطاء المتكررة تكرار canonical، وتسرب المسودات والصفحات اليتيمة إلى الخرائط، وعدم معرفة أن الخريطة لا تُنشأ إلا في الإنتاج، وغياب alt في GatsbyImage، وعدم اتساق الشرطة المائلة، وعدم اختبار مسارات DSG وSSR والمسارات الخاصة بالعميل في الإنتاج. ومنذ استحواذ Netlify عام 2023 تباطأت الصيانة بشدة.

أنماط عرض Gatsby الأربعة وأثرها في SEO

تعالج Google صفحات JavaScript على ثلاث مراحل: الزحف ثم العرض ثم الفهرسة، ويجري العرض في مرور منفصل داخل طابور باستخدام Chromium بلا واجهة. وتوضح Google السبب في عدم الاعتماد عليه: “Server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.” (ترجمة) «يظل العرض على الخادم أو المسبق فكرة ممتازة لأنه يسرع الموقع للمستخدمين والزواحف، وليست كل الروبوتات قادرة على تشغيل JavaScript».

لا تكون كل صفحات Gatsby HTML ثابتًا منشأ وقت البناء؛ بل يختار كل قالب أو صفحة أحد أربعة مسارات Evidence for this claim gatsby build writes production output, including generated HTML, to the public directory. Scope: Gatsby production builds. Confidence: high · Verified: Gatsby CLI: build :

  • SSG، مولد المواقع الثابتة، وهو الافتراضي. ينتج gatsby build HTML كاملًا في /public، فيحتوي جلب Googlebot الأول على النص والروابط والبيانات الوصفية. وهذا المسار الآمن قليل المخاطر لمعظم الصفحات.
  • DSG، التوليد الثابت المؤجل. يؤجل إنشاء الصفحة إلى أول طلب، وهو مفيد للمواقع الضخمة ذات الصفحات قليلة الزيارات. لا يكشف سجل البناء وحده ما يراه الزاحف؛ افحص الطلب الأول والسلوك بعد التخزين المؤقت.
  • SSR، العرض على الخادم. تُنشأ الصفحة لكل طلب عبر Gatsby Functions وبيانات وقت الطلب. اختبر في الإنتاج حالة الاستجابة ورؤوس التخزين والمهلات وما يراه الزاحف عند الاستجابة الفارغة أو الخطأ.
  • المسارات الخاصة بالعميل. تُعرض بالكامل في المتصفح ولا تحمل محتوى خاصًا بالمسار في HTML الأولي، مثل تطبيق React يعمل لدى العميل وحده. لا تفترض أن Google أو أي زاحف يرى محتوى الصفحة قبل تشغيل JavaScript؛ تعامل معها بوصفها معتمدة على JS تصميميًا. يناسب ذلك المحتوى المحمي أو المتطلب للمصادقة، لكنه لا يناسب محتوى تريد فهرسته بنصه.

يجري ترطيب React عبر ReactDOMClient.hydrateRoot() فوق الناتج لإضافة التفاعل، بغض النظر عن مسار العرض. وهذه مسألة منفصلة عن مصدر إنشاء الصفحة.

بعكس SSG وDSG وSSR، يقدم تطبيق React العميل الخالص <div id="root"> فارغًا ويعتمد على المتصفح أو العارض لبناء الصفحة. تشحن معظم صفحات Gatsby HTML ذا معنى، وهي ميزة فهرسة حقيقية لكنها خاصية لكل صفحة لا ضمانًا من الإطار. لا تضمن أنماط العرض وأدوات الصور Core Web Vitals أو الفهرسة أو الترتيب؛ افحص ناتج الإنتاج الفعلي لكل مسار.

المشكلة المشتركة بين SSG وDSG وSSR هي الأداء لا قابلية الزحف: يرسل Gatsby بيئة React كاملة ويرطبها في كل صفحة.

Gatsby Head API مقابل gatsby-plugin-react-helmet

هذا أهم سؤال لتحديد ما إذا كان التنفيذ حديثًا.

النهج القديم — gatsby-plugin-react-helmet. كان تعيين <title> والوصف ووسوم الرأس يجري عبر react-helmet وهذه الإضافة التي تمنحه دعم SSR. بدونها لا تظهر الوسوم إلا بعد JavaScript، لا في HTML الخام. يعمل النهج، لكنه يعاني مشكلات مع React Hooks والعرض المتزامن، وخطأ عنوان التبويب الخلفي الذي يعالج بـdefer={false}.

النهج الحديث — Gatsby Head API منذ v4.19. يضيف Gatsby عناصر الرأس عبر تصدير مسمى Head من ملف صفحة أو قالب. Evidence for this claim Gatsby pages and templates can export a named Head function to add head elements. Scope: Gatsby Head API. Confidence: high · Verified: Gatsby: Head API

export const Head = () => (
  <>
    <title>Page Title</title>
    <meta name="description" content="..." />
  </>
)

تتلقى الواجهة خصائص مفيدة مثل location.pathname وparams وdata من استعلام GraphQL وpageContext، وتزيل تكرار الوسوم التي تشترك في id بحيث يفوز الأخير. لكن تشغيل Head API وreact-helmet معًا قد يسبب تعارضًا. تعمل في ملفات الصفحات والقوالب فقط لا المكونات العادية. مزاياها: لا حزمة خارجية ولا Provider وترتيب حتمي مع بث React 18. استخدمها للمشاريع الجديدة وخطط لترحيل القديمة.

تدعم الأنماط الأربعة تصدير Head، لكن وقت وصول مخرجاته إلى HTML القابل للجلب يختلف: تُضمّن في SSG وقت البناء، وتُنشأ في DSG عند أول طلب وفي SSR لكل طلب، ولا تظهر في HTML الأولي للمسار الخاص بالعميل. فلا تساوِ بين «أضفت تصدير Head» و«توجد هذه البيانات في HTML الخام لكل مسار»؛ افحص ناتج الإنتاج الفعلي عبر view-source: أوcurl لكل مسار عرض مستخدم، لا لصفحة ممثلة واحدة فقط.

خطأ «الوسوم في DevTools لا المصدر». من أعراض Gatsby SEO المعروفة أن يظهر العنوان ووسوم meta في Chrome DevTools لكنها تغيب عن view-source:. تعرض DevTools DOM بعد الترطيب، أي بعد تشغيل JavaScript، بينما يعرض view-source: HTML الخام. إذا لم تظهر الوسوم إلا في DevTools، فإن مكون SEO يُعرض لدى العميل بدل تضمينه في ناتج Gatsby الثابت، وغالبًا لأنه استُخدم كمكون عادي لا بوصفه تصدير Head للصفحة أو داخله. تحقق دائمًا من HTML الخام لا DevTools.

توصيل مكون SEO بطبقة GraphQL

طبقة بيانات Gatsby هي GraphQL، ومنها تغذي بيانات الصفحات الوصفية.

  • يجلب useStaticQuery القيم العامة من siteMetadata، مثل العنوان والوصف وsiteUrl في gatsby-config.js.
  • تمرر استعلامات GraphQL للصفحة الخاصية data مباشرة إلى تصدير Head.
  • النمط المعتاد هو قيمة الصفحة أوsiteMetadata احتياطية.

يبدو تصدير Head الذي يتلقى بيانات الصفحة هكذا:

export const Head = ({ data }) => (
  <>
    <title>{data.post.title}</title>
    <meta name="description" content={data.post.excerpt} />
  </>
)

خرائط الموقع: gatsby-plugin-sitemap ومزالقها

ثبّت gatsby-plugin-sitemap واضبطها في gatsby-config.js. ومن المزالق:

  • تنشئ sitemap-index.xml لا /sitemap.xml؛ أرسل عنوان الفهرس إلى Search Console، ولا ترسل /sitemap.xml متوقعًا أن يُحل.
  • تعمل في بناء الإنتاج فقط ولا تفعل شيئًا في gatsby develop. اختبر عبر gatsby build && gatsby serve.
  • يضيف createLinkInHead: true افتراضيًا مرجع الخريطة إلى الرأس.
  • تستبعد دائمًا /dev-404-page و/404 و/offline-plugin-app-shell-fallback.
  • تتجاهل Google <priority> و<changefreq>؛ ركز على <lastmod> الدقيق.
  • الحد الافتراضي لـentryLimit هو 45٬000 عنوان URL لكل ملف.

استبعاد المسودات مسؤوليتك. يبني Gatsby كل ما يجده، فتدخل المسودة الخريطة ما لم ترشحها في gatsby-node.js عبر GraphQL، مثل استبعاد ما لا يحمل تاريخ نشر. لا تخفها داخل مكون React؛ عندها تكون قد بُنيت وأُدرجت بالفعل.

تحتاج مسارات DSG وSSR والمسارات الخاصة بالعميل قرارًا صريحًا بشأن الخريطة. تعكس gatsby-plugin-sitemap ما تستطيع رؤيته وقت البناء. توجد صفحة SSG كملف ثابت فتكون مؤهلة طبيعيًا للإدراج، بينما لا يوجد HTML لصفحة DSG قبل أول طلب، ولا HTML ثابت أصلًا لصفحة SSR، ولا محتوى خاص بالمسار في HTML الأولي للمسار الخاص بالعميل. لا تفترض إدراج أي منها، أو وجوب إدراجه، لمجرد وجود المسار؛ قرر لكل صفحة هل تنتمي إلى الخريطة، ثم تحقق من أن sitemap-index.xml الناتج يعكس القرار الفعلي لا مجرد تخمين وقت البناء.

robots.txt: إضافة gatsby-plugin-robots-txt

تنشئ gatsby-plugin-robots-txt ملف robots.txt وقت البناء وتقرأ process.env.GATSBY_ACTIVE_ENV ثم process.env.NODE_ENV، ما يتيح قواعد مختلفة لكل بيئة. الاستخدام التقليدي هو حظر الزواحف في معاينات Netlify وفروعه لمنع فهرسة staging مع إبقاء الإنتاج مفتوحًا.

عناوين canonical وخطأ التكرار

يوجد نهجان صالحان:

  1. تضيف gatsby-plugin-canonical-urls وسم canonical لكل صفحة. اضبط stripQueryString: true كي لا تعامل /blog?tag=foo و/blog كصفحتين منفصلتين.
  2. استخدم Head API لتعيين canonical من location.pathname بنفسك:
export const Head = ({ location }) => (
  <link rel="canonical" href={`https://example.com${location.pathname}`} />
)

خطأ canonical المزدوج. إذا استخدمت gatsby-plugin-canonical-urls ووسم react-helmet معًا، فستنتج وسمَي <link rel="canonical">. اختر آلية واحدة. ولـreact-helmet توجد gatsby-plugin-react-helmet-canonical-urls؛ ومع Head API ضع canonical هناك واحذف الإضافة.

الشرطة المائلة الختامية. قد تصل صفحات Gatsby بالشكلين، ويستخدم <Link> توجيه History API لدى العميل متجاوزًا تحويلات 301 على الخادم. اختر صيغة واحدة، وافرضها لدى المستضيف أوCDN، واجعل canonical متسقًا معها.

SEO الصور: gatsby-plugin-image

تعد gatsby-plugin-image من نقاط قوة Gatsby، ولها مكونان:

  • StaticImage للصور ذات المسار المعروف والثابت وقت البناء.
  • GatsbyImage للصور الديناميكية القادمة من GraphQL.

تنشئ تلقائيًا أحجامًا متعددة وصيغ WebP وAVIF وتحميلًا كسولًا ونقاط توقف 750/1080/1366/1920px. كما تولد عناصر نائبة ضبابية أو بلون سائد أوSVG متتبع تحجز المساحة وتمنع Cumulative Layout Shift. الأبعاد تمنع CLS، والصيغ الحديثة والتحميل الكسول يساعدان LCP.

الشيء الوحيد الذي لا تفعله هو كتابة النص البديل. تقع هذه المسؤولية عليك في كل صورة، ويعد غياب alt عن GatsbyImage من أكثر أخطاء Gatsby SEO شيوعًا. وإذا كنت تنتقل من حزمة gatsby-image القديمة، فاستخدم: npx gatsby-codemods gatsby-plugin-image.

البيانات المنظمة (JSON-LD)

صيغة Google المفضلة للبيانات المنظمة هي JSON-LD، والطريقة النظيفة لإضافتها في Gatsby الحديث هي Head API مع وسم script:

export const Head = ({ data }) => (
  <script type="application/ld+json">
    {JSON.stringify({
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": data.post.title,
    })}
  </script>
)

توفر gatsby-plugin-next-seo مكونات JSON-LD جاهزة إن لم ترد كتابتها يدويًا. وللتوضيح: gatsby-plugin-manifest ليست إضافة بيانات منظمة؛ فهي تنشئ بيان تطبيق PWA، مثل الأيقونات ولون السمة، ولا علاقة لها بـschema.

حزمة React وCore Web Vitals

هنا يظهر ضعف Gatsby الحقيقي مقارنة بالمولدات عديمة JavaScript.

  • الترطيب الكامل، افتراضي Gatsby 1–4، يرطب شجرة React كلها ويرسل بيئة React أكبر من 200KB لكل صفحة. لا يضر ذلك الزحف لأن HTML معروض مسبقًا، لكنه يؤثر قطعًا في سرعة التحميل وCWV.
  • الترطيب الجزئي، تجريبي في Gatsby 5، يرطب المكونات الموسومة بـ"use client" فقط ويترك الباقي HTML ثابتًا، فيقلل JavaScript ويحسن TTI وCWV مباشرة. لكن له قيود حقيقية: يعمل في بناء الإنتاج فقط، وما يزال تجريبيًا، ولا يتوافق مع emotion وstyled-components وgatsby-plugin-offline.

الخلاصة: حمولة JavaScript في Gatsby مشكلة أداء لا فهرسة. ما يزال Googlebot يعرض JavaScript لتقييم إشارات تجربة الصفحة، ولذلك قد تضر الحزمة CWV حتى إن فُهرس المحتوى جيدًا.

Gatsby مقابل Astro في SEO

إذا كنت تختار إطارًا ثابتًا اليوم، فهذه أهم مقارنة لـSEO.

البعدGatsbyAstro
JavaScript المرسلأكثر من 200KB، بيئة React كاملةنحو 5KB، للجزر التفاعلية فقط
نموذج العرضSSG ثمSPA بترطيب كاملSSG ثمMPA بلا ترطيب افتراضيًا
سرعة بناء 40 صفحة2–3 دقائقأقل من 10 ثوان
منظومة إضافات SEOناضجة، gatsby-plugin-*تنمو
أثر ميزانية الزحفأعلى بسبب JavaScriptأقل
مستقبل الإطارغير مؤكد بعد تباطؤ النشاط تحت Netlifyنشط وينمو

يعرض كلاهما HTML قابلًا للفهرسة مسبقًا، فتتعادل هذه النقطة. الفرق ضريبة JavaScript؛ ترسل جزر Astro جزءًا صغيرًا منه. وتصف مقارنة Vaihe ذلك: “Reduced JavaScript execution conserves crawl budget and accelerates page scanning.” (ترجمة) «تقليل تنفيذ JavaScript يحافظ على ميزانية الزحف ويسرع فحص الصفحات». تنبيه تاريخي لصالح Gatsby: كانت معالجة الصور في Astro تفتقر إلى width/height تلقائيًا وقت المقارنة، فتظهر تحذيرات Lighthouse؛ راجع وثائق Astro الحالية لاحتمال معالجة ذلك.

للسياق العام، راجع مركز مولدات المواقع الثابتة.

الحقيقة الصريحة: مسار صيانة Gatsby

لن أجمل الوضع ولن أهوّله.

استحوذت Netlify على Gatsby Inc. في فبراير 2023. أُوقف Gatsby Cloud ونُقل العملاء إلى Netlify، وقالت الشركة إن الاستحواذ «لن يؤثر في Gatsby JS». لكن النشاط تباطأ بوضوح. وترى مناقشة GitHub مجتمعية واسعة القراءة، رقم #39062، أن Gatsby مهجور فعليًا: التزامات قليلة، ولا دعم React 19، وخريطة طريق 2024 غير منفذة، وإيقاف خدمة القياس. ويصف القائمون الوضع بأنه إصلاحات أمنية وتحديثات محدودة للتبعيات وإصلاح أخطاء سهلة.

المعنى لفرق SEO. لا توجد حالة طوارئ في موقع Gatsby قائم؛ فهو يبني ويُفهرس ويعمل. الخطر هو تآكل المنظومة مع الوقت، لأن SEO يعتمد على إضافات الخريطة والصور وcanonical، وقد تنكسر الإضافات القديمة، مثل gatsby-source-shopify مع إهمال API، فتضعف الفهرسة بصمت. أما في مشروع جديد فوازن ذلك جديًا؛ الأطر التي ينتقل إليها الناس هي Astro وNext.js.

قائمة تحقق الإنتاج لكل مسار عرض

لا تثبت جلسة gatsby develop محلية، ولا حتى سجل gatsby build نظيف، ما يتلقاه الزاحف. لأن SSG وDSG وSSR ومسارات العميل تنشئ HTML بطرق مختلفة، افحص كل مسار في الإنتاج بدل افتراض أن صفحة ممثلة تكفي:

  • محتوى HTML الخام. اجلب URL إنتاجيًا حقيقيًا لكل مسار عرض مستخدم عبر curl -s <url> أوview-source:، لا DevTools، وتأكد من وجود المحتوى والعنوان ووسوم meta التي سيراها الزاحف.
  • بيانات تصدير Head. تأكد من وصول وسوم تصدير Head إلى HTML الخام للمسار المعني. قد توجد الوسوم في الشفرة في جميع الحالات، لكن الجلب الإنتاجي وحده يثبت وصولها إلى الاستجابة عبر DSG أوSSR.
  • حالة HTTP. افحص رمز الاستجابة، خصوصًا لمسارات SSR وDSG؛ فقد تفشل الصفحة بالرمز 500 عند أول طلب أو تحت الحمل رغم نجاحها محليًا.
  • التخزين المؤقت. SSG ملف ثابت؛ وDSG يخزن بعد أول طلب، فاختبر الطلب الثاني؛ وتتوقف استجابات SSR على الرؤوس والاستضافة، فتحقق من عدم تقديم محتوى قديم أوخاص بمستخدم إلى آخر.
  • سلوك الفشل والحالة الفارغة. في صفحات SSR وDSG التي تعتمد بيانات وقت الطلب أو الطلب الأول، افحص ما يراه الزاحف عند فشل جلب البيانات أو عودتها فارغة؛ فحالة الخطأ غير المعالجة ليست الصفحة التي اختبرتها محليًا ببيانات سليمة.
  • إنشاء الخريطة والاستثناءات. أكد أن الإنشاء لا يحدث إلا في بناء الإنتاج (gatsby build && gatsby serve، لا gatsby develop)، وأن المسودات والمسارات الخاصة بالعميل وكل ما قررت استبعاده غائب فعلًا عن sitemap-index.xml الناتج، لا عن نيتك فحسب.

لا شيء من ذلك اختياري لكل مسار؛ نجاح gatsby build يثبت ناتج SSG فقط، لا DSG أوSSR أوالمسار الخاص بالعميل.

أخطاء Gatsby SEO الشائعة

  1. الاستمرار في gatsby-plugin-react-helmet بدل الانتقال إلى Head API.
  2. ظهور الوسوم في DevTools لا مصدر الصفحة؛ يعمل مكون SEO لدى العميل، فافحص view-source:.
  3. المسودات في الخريطة؛ رشحها في gatsby-node.js عبر GraphQL لا داخل React.
  4. صفحات يتيمة من src/pages؛ يحول Gatsby كل ملف هناك إلى مسار فتدخل الملفات القديمة الخريطة.
  5. وسما canonical بسبب تشغيل gatsby-plugin-canonical-urls وreact-helmet معًا.
  6. عدم اتساق الشرطة الختامية لأن توجيه <Link> لدى العميل يتجاوز تحويل الخادم.
  7. عدم إزالة استعلامات canonical؛ اضبط stripQueryString: true.
  8. غياب alt عن GatsbyImage؛ لا يُنشأ تلقائيًا.
  9. إرسال /sitemap.xml بدل /sitemap-index.xml الحقيقي.
  10. اختبار الخريطة في gatsby develop؛ لا تُنشأ إلا في gatsby build.
  11. تبديل noindex عبر حالة React؛ ربما عالج Google HTML الخام بالفعل، وإذا رأى noindex فيه فقد يتجاوز العرض. أبق قرار noindex في HTML الثابت أو رؤوس الخادم.

لأساسيات عرض JavaScript، راجع مركز JavaScript SEO الأعلى.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.