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

كيفية إعداد موقع Astro لتحسين محركات البحث: HTML الثابت الافتراضي، بنية الجزر والترطيب الانتقائي، Server Islands، View Transitions، خرائط المواقع والوسوم الأساسية، ولماذا لا تضمن إعدادات الإطار وحدها قابلية الزحف أو الفهرسة أو الترتيب أو Core Web Vitals.

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

يُعد Astro من أقوى اختيارات الأطر لتحسين محركات البحث لأنه يصيّر الصفحات مسبقًا إلى HTML ثابت افتراضيًا — فيكون محتواك في HTML الخام عند أول زحف، من دون انتظار طابور تصيير لذلك المسار. ولا ترطّب الجزر إلا المكوّنات التي تحددها بتوجيه client، لذلك تُرسل معظم الصفحة من دون JavaScript ترطيب خاص بها (مع أن Astro قد يضيف نصوص الصفحة وJavaScript للموجّه في مواضع أخرى) — ولا يضمن أي من ذلك وحده قابلية الزحف أو الفهرسة أو الترتيب، لذا تحقق من المسارات المنشورة. كما تحقق مواقع Astro أرقامًا قوية في Core Web Vitals. لكن Astro يولّد HTML نظيفًا ولا يكتب لك الوسوم الوصفية أو العناوين الأساسية أو خريطة الموقع أو البيانات المنظمة — فهذه خطوات بناء مقصودة، كما أن اكتشاف خريطة الموقع يستهدف المسارات المولّدة ثابتًا، لذلك تحتاج عناوين URL وقت التشغيل إلى معالجة صريحة. وتكون Server Islands (التي تتطلب adapter) وView Transitions آمنة لـ SEO عندما تفهم ما يجلبه الزاحفون فعلًا. وأشغّل patrickstox.com على Astro، لذلك فهذه هي الحزمة التي أعيش معها فعلًا.

الخلاصة — بُنية Astro مهيأة جيدًا لتحسين محركات البحث: تُصيَّر الصفحات ونقاط النهاية مسبقًا إلى HTML ثابت افتراضيًا، لذلك لا توجد موجة انتظار في طابور التصيير لهذا المحتوى — لكن هذا افتراض افتراضي، وليس ضمانًا شاملًا، كما أن HTML الثابت أو المولّد من الخادم لا يثبت وحده قابلية الزحف أو الفهرسة أو الترتيب أو Core Web Vitals لعناوين URL المنشورة. تقوم بنية الجزر بترطيب المكوّنات التي تحددها فقط بتوجيه client:* — وكل ما عدا ذلك يرسل HTML من دون JavaScript خاص بالترطيب، مع أن نصوص الصفحة والجزر الأخرى وتحسينات الموجّه قد تضيف JavaScript في مواضع أخرى من الصفحة. لا ينشئ Astro وسومًا وصفية أو عناوين canonical أو خرائط مواقع أو بيانات منظمة تلقائيًا — صِل هذه الأشياء صراحةً، ويفضل التحقق منها باستخدام Content Collections + Zod. وتخدم Server Islands (التي تتطلب adapter) الغلاف الثابت مع محتوى احتياطي في المستند الأولي، ثم تجلب المحتوى المؤجل بصورة مستقلة — تحقّق مما يجلبه روبوت زحف معين فعلًا بدل الافتراض. وتستخدم View Transitions الدالة history.pushState وهي آمنة لتحسين محركات البحث؛ إذ يزحف Google إلى صفحات MPA الأساسية بصورة عادية. أشغّل patrickstox.com على Astro، والميزات أدناه هي ما أستخدمه فعلًا — وقد تحققت منها مقابل الموقع المنشور، لا في بيئة التطوير المحلية فحسب.

Evidence for this claim Astro prerenders pages as static HTML by default and only sends client JavaScript for explicitly hydrated components. Scope: Astro default static output and islands architecture. Confidence: high · Verified: Astro: Why Astro

لماذا يتجاوز Astro مشكلة تصيير JavaScript بالكامل

السبب الكامل لصعوبة تحسين محركات البحث في JavaScript هو الموجة الثانية. يجلب Google أولًا HTML الخام لصفحتك، ثم يضع الصفحة في طابور تصيير داخل Chromium عديم الرأس لاحقًا — وهذا الطابور هو موضع الخطر. وتصف وثائق Google الأمر بوضوح: “Googlebot queues all pages with a 200 HTTP status code for rendering unless a robots meta tag tells Google not to index the page. The page may stay on this queue for a few seconds, but it can take longer than that.” (ترجمة) «يضع Googlebot كل الصفحات ذات رمز حالة HTTP 200 في طابور التصيير ما لم تخبر وسمة robots meta Google بعدم فهرسة الصفحة. وقد تبقى الصفحة في هذا الطابور بضع ثوانٍ، لكن الأمر قد يستغرق أطول من ذلك.» أما في تطبيق SPA المصيَّر من جهة العميل، فلا يظهر محتواك حتى تعمل موجة التصيير تلك.

وضع الإخراج الافتراضي في Astro هو static: تُصيَّر الصفحات ونقاط النهاية مسبقًا إلى ملف HTML مكتمل وقت البناء. لذلك، في مسار يعمل بهذا الوضع الافتراضي، يكون HTML الخام هو الصفحة المصيَّرة. Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering ولا توجد موجة ثانية ينبغي انتظارها لهذا المسار، إذ لا شيء متبقيًا للتنفيذ. يرى Googlebot المحتوى الكامل في الجلب الأول. وكما يقول Joost de Valk (مؤسس Yoast): “From an SEO perspective, static HTML on a CDN is a better starting point than most CMSes will ever give you.” (ترجمة) «من منظور تحسين محركات البحث، يُعد HTML الثابت على CDN نقطة بداية أفضل مما ستمنحك إياه معظم أنظمة إدارة المحتوى.»

لكن ذلك هو الافتراضي — وليس خاصية شاملة لكل مسار. اضبط output: 'server' في astro.config.mjs لينقلب الافتراضي إلى التصيير عند الطلب (سنتناول ذلك أدناه)؛ وحتى في مشروع افتراضيه static، يتيح adapter لمسار منفرد الانسحاب باستخدام export const prerender = false. لا يضمن أي من ذلك النتيجة بفضل البنية وحدها: فـ HTML الثابت أو المولّد من الخادم والجزر وadapters لا تضمن وحدها قابلية الزحف أو الفهرسة أو الترتيب أو Core Web Vitals — إذ تعتمد هذه الأمور على المسار المنشور وروبوت الزحف المحدد، لذلك تحقّق منها بدل افتراض أن الإطار يتولاها.

يساعد هذا أيضًا مع برامج الزحف التي لا تستطيع التصيير إطلاقًا. تقول Google بوضوح إن “not all bots can run JavaScript” (ترجمة) «ليست كل الروبوتات قادرة على تشغيل JavaScript» — وهذه هي حقيقة 2026 بالنسبة إلى معظم روبوتات الذكاء الاصطناعي وكثير من الأدوات الخارجية. ومخرجات Astro القائمة على HTML قابلة للقراءة من كل واحد منها حيث صُيِّرت مسبقًا فعلًا، لا من Googlebot وحده. (هذه هي النقطة نفسها التي أطرحها في SEO for a headless CMS: وضع التصيير هو المنتج.)

بنية الجزر: JavaScript حيث تطلبه فقط

يصيّر Astro مكوّناتك إلى HTML، ويرسل — على حد تعبيره — “just HTML & CSS, stripping out all client-side JavaScript automatically.” (ترجمة) «HTML وCSS فحسب، مع إزالة كل JavaScript من جهة العميل تلقائيًا». التفاعل اختياري. تحدد مكوّنًا بتوجيه client:* — مثل client:load أو client:idle أو client:visible — ولا تُرطّب JavaScript إلا تلك الجزيرة. أما كل ما عداها فيظل HTML ثابتًا. Evidence for this claim Astro client directives selectively hydrate interactive islands while other components remain static HTML. Scope: Astro islands and client directives. Confidence: high · Verified: Astro: Islands

وهذا قريب من المثالي لتحسين محركات البحث. فالمحتوى الذي يحتاج Googlebot إلى فهرسته هو HTML عادي، ولا تثقل عليه أدواتك التفاعلية. ويُعد client:visible مفيدًا خصوصًا: إذ لا يبدأ مكوّن أسفل الجزء المرئي بالترطيب حتى يُمرَّر إليه، فلا يحجب LCP أبدًا. ويعود المفهوم إلى Jason Miller (مبتكر Preact)، الذي وصف “rendering HTML pages on the server, and inject[ing] placeholders or slots around highly dynamic regions” (ترجمة) بأنه «تصيير صفحات HTML على الخادم، وحقن عناصر نائبة أو فتحات حول المناطق عالية الديناميكية» للترطيب الانتقائي.

هناك دقيقتان تستحقان الدقة، لأن تغطية المنافسين تميل إلى طمس الفرق بينهما:

  • client:only حيوان مختلف. بخلاف client:load وclient:idle وclient:visible، يتخطى مكوّن client:only التصيير من الخادم بالكامل — فلا ينتج HTML على الخادم إطلاقًا. وأي محتوى قابل للفهرسة يوضع فقط داخل مكوّن client:only لن يكون في المستند الذي يجلبه Googlebot؛ بل لا يوجد إلا بعد أن يرطبه المتصفح. لا تضع المحتوى الرئيسي هناك.
  • هذا ترطيب انتقائي، وليس قابلية للاستئناف. يعيد Astro تشغيل شيفرة العميل لكل جزيرة من الصفر في المتصفح؛ ولا يستأنف حالة تنفيذ جرى تسلسلها على الخادم كما يفعل نموذج قابلية الاستئناف (مثل نموذج Qwik). يخلط الكتّاب بين الأمرين — لكنهما آليتان مختلفتان.
Evidence for this claim A client:only component skips server rendering, so indexable content placed only inside it cannot be assumed to exist in the initial page HTML. Scope: client and server islands Confidence: high · Verified: Template directives reference

والمكوّن غير المرطَّب ليس صورة JavaScript الكاملة في الصفحة. فعبارة «Zero JS» تصف مكوّنًا واحدًا من دون توجيه client:* — ويمكن لـ Astro مع ذلك إرسال وسوم <script> على مستوى الصفحة، وموجّه View Transitions، وجزر أخرى في مواضع أخرى من الصفحة نفسها. صِف ما يُرسل لكل مكوّن/مسار، لا بوصف شامل للصفحة.

ما الذي لا يفعله Astro تلقائيًا

ينشئ Astro HTML دلاليًا نظيفًا — ولا شيء آخر من ناحية تحسين محركات البحث. لا توجد بيانات وصفية أو canonical أو خريطة موقع أو بيانات منظمة من الصندوق. وخرافة أن «Astro محسّن تلقائيًا لتحسين محركات البحث» هي خرافة فعلًا. أنت تملك:

  • الوسوم الوصفية (العنوان والوصف وOpen Graph وTwitter)
  • عناوين URL الأساسية
  • خريطة الموقع (عبر التكامل الرسمي)
  • البيانات المنظمة / JSON-LD
  • robots.txt

Astro أفضل أساس استخدمته، لكنه أساس لا بيت مكتمل.

خريطة الموقع: @astrojs/sitemap

ثبّتها باستخدام npx astro add sitemap. فهي تزحف إلى مساراتك المولّدة ثابتًا وتصدر sitemap-index.xml وملفات sitemap-0.xml مجزأة وقت البناء. ثمة أمران يوقعان الناس في المشكلات:

Evidence for this claim Astro's official sitemap integration generates sitemap files from statically generated routes. Scope: Astro @astrojs/sitemap integration. Confidence: high · Verified: Astro: Sitemap integration
  • يجب ضبط site: في astro.config.mjs. فبدونه ينشئ التكامل لا شيء بصمت. وهذا هو السبب الأكثر شيوعًا لسؤال «أين خريطة موقعي؟».
  • يجب إضافة سطر خريطة الموقع إلى robots.txt بنفسك. لا يفعل Astro ذلك.

وللتحكم، تستبعد filter() المسارات (صفحات المعاينة/المسودات — وهذا هو الاستخدام الذي أخصصه له في هذا الموقع)، وتتيح لك serialize() ضبط lastmod وchangefreq وpriority، كما يصدر الخيار i18n إدخالات hreflang في خريطة الموقع. هذا ما تحدده وثائق @astrojs/sitemap الحالية — تحقّق منه مقابل الإصدار المثبت لديك إذا كنت على إصدار أقدم، فقد تغير سلوك التكامل عبر الإصدارات الرئيسية من قبل.

النطاق الذي يربك الناس: يستهدف اكتشاف التكامل المسارات المولّدة ثابتًا. وإذا كانت بعض عناوين URL لا توجد إلا وقت التشغيل — مسارات مصيَّرة من الخادم (المضبوطة على output: 'server') أو مسارات مولّدة عند الطلب بدل وقت البناء — فلا تفترض أنها في خريطة الموقع. أضفها صراحةً باستخدام customPages، ثم افتح sitemap-index.xml فعلًا بعد البناء لتتأكد من وجودها. لا تصدق عبارة «التكامل يتولى ذلك» في أي شيء ليس مسارًا ثابتًا وقت البناء.

الوسوم الوصفية والعناوين الأساسية: نمط BaseLayout

لا يملك Astro مكوّن <Head> خاصًا — فأنت تتحكم في <head> مباشرةً داخل ملفات .astro. والنمط القياسي (وهو ما أفعله) هو BaseLayout.astro واحد يتلقى title وdescription وcanonicalURL كخصائص ويكتب الرأس. اضبط العنوان الأساسي صراحةً في كل صفحة وحافظ على اتساقه مع og:url. لا تحتاج إلى مكتبة، لكن حزمة المجتمع astro-seo (npm) غلاف مريح بمكوّن واحد لـ title/description/OG/Twitter/canonical إن أردت.

مجموعات المحتوى بوصفها شبكة أمان لتحسين محركات البحث

هذه هي ميزة SEO غير المقدَّرة في Astro. مجموعات المحتوى هي طبقة محتوى ذات أنواع آمنة لـ Markdown/MDX/JSON، مع تحقق مخطط Zod. وهذا يعني أنه يمكنك جعل title وdescription حقلين مطلوبين — وإذا غاب أحدهما من صفحة ما يفشل البناء فشلًا. فلا يمكنك إرسال صفحة بلا عنوان عرضًا. وتولّد دوال الاستعلام (getCollection() وgetEntry()) صفحات ثابتة وقت البناء، لذلك يكون الإخراج HTML عاديًا عند النشر. ولأن MDX يبقي Markdown الخام مصدر الحقيقة، فهذه الملفات أيضًا محتوى مصدر نظيف لروبوتات الذكاء الاصطناعي وأنماط شبيهة بـ llms.txt. وهذا الموقع نفسه مبني على مجموعات محتوى ذات frontmatter متحقق منه بواسطة Zod.

astro:assets: الصور بصورة صحيحة (مع فخ واحد)

يحوّل مكوّن <Image /> الصور تلقائيًا إلى WebP، ويستنتج الأبعاد كي “avoid Cumulative Layout Shift (CLS),” (ترجمة) «يتجنب Cumulative Layout Shift (CLS)»، ويضبط loading="lazy" افتراضيًا، ويشترط alt — فغياب alt خطأ في الترجمة. ويوسّع <Picture /> ذلك بعناصر <source> للـ AVIF/WebP/البديل.

الفخ هو أن loading="lazy" التلقائي خاطئ لصورة LCP لديك (وهي الصورة الرئيسية عادةً). فتأخير تحميل أهم صورة يؤخرها. وبالنسبة إلى الصور الواقعة فوق الجزء المرئي، استبدل ذلك بـ loading="eager" وfetchpriority="high". وتحتاج الصور البعيدة إلى width وheight صريحين.

Server Islands: ما الذي يراه الزاحفون فعلًا

تُعد Server Islands (في Astro 4.12+) الميزة التي تخطئ فيها معظم أدلة المنافسين. باستخدام server:defer، يُصيَّر المكوّن على الخادم بصورة مستقلة عن الصفحة الرئيسية. ويُخدم الغلاف الثابت فورًا؛ ووفق وثائق Astro: “Your page will be rendered immediately with any specified fallback content as a placeholder. Then, the component’s own contents are fetched on the client and displayed when available.” (ترجمة) «ستُصيَّر صفحتك فورًا مع أي محتوى احتياطي محدد بوصفه عنصرًا نائبًا. ثم يُجلب محتوى المكوّن نفسه على العميل ويُعرض عند توفره.»

هناك أمران ينبغي تحديدهما بدقة. أولًا، تتطلب Server Islands adapter — فهي ميزة عند الطلب، وليست شيئًا ينتجه بناء ثابت محض بمفرده. ثانيًا، التسلسل هو: يرسل المستند الأولي أي محتوى احتياطي ضبطته، ويكون المحتوى الحقيقي للجزيرة طلبًا منفصلًا مستقلًا يُجلب بعد تحميل الصفحة، عبر نقطة نهاية خاصة به. وهذا حد صارم لما يحتويه المستند الأولي — ولا أعمم أكثر من ذلك بشأن ما يفعله كل زاحف محدد بعد ذلك من دون اختبار عناوين URL المنشورة لديك مباشرةً.

النتيجة العملية لتحسين محركات البحث هي: يحتوي HTML الثابت الذي يقرؤه الزاحف في ذلك الجلب الأول على المحتوى الاحتياطي، لا محتوى الجزيرة المؤجل. وهذا مثالي لما صُممت Server Islands له — أشياء مخصصة مرتبطة بالجلسة (حالة تسجيل الدخول وعدّاد سلة التسوق والتوصيات) لا ينبغي تخزينها مؤقتًا أو فهرستها أصلًا. لكنه خطأ بالنسبة إلى المحتوى الرئيسي القابل للفهرسة. ضع أي شيء يحتاج إلى الترتيب في قالب Astro الرئيسي، ودع Server Islands تتولى الأجزاء الديناميكية المحيطة به.

أوضاع الإخراج: الثابت مقابل الخادم، والتجاوز لكل مسار

وضع الإخراج الافتراضي في Astro هو static — تُصيَّر الصفحات ونقاط النهاية إلى HTML وقت البناء. اضبط output: 'server' في astro.config.mjs لينقلب الافتراضي إلى التصيير عند الطلب: تُصيَّر الصفحات لكل طلب (مع adapter)، وهو مفيد للمصادقة والبيانات الآنية والتخصيص الذي يتجاوز ما تغطيه Server Islands. وفي كلتا الحالتين يمكنك تجاوز الافتراضي لكل مسار: ففي مشروع افتراضيه static، يختار export const prerender = false مسارًا للتصيير عند الطلب؛ وفي مشروع افتراضيه server، يعيد export const prerender = true مسارًا إلى التصيير وقت البناء. لذلك نادرًا ما يكون قول «موقعي ثابت» أو «موقعي SSR» صحيحًا لكل مسار — افحص إعداد المسار، لا الإعداد الأعلى في الملف فحسب. Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering

من منظور SEO الخالص، يتساوى HTML المصيَّر مسبقًا وHTML المولّد عند الطلب — فكلاهما يرسل HTML كاملًا إلى الزاحف في الطلب الأول، بعد أن تتأكد فعلًا من أن المسار يعيد 200 مع ترميز كامل. وقد تبث المسارات عند الطلب HTML، ويمكن للبيانات البطيئة أو ظروف الشبكة أن تؤخر الأجزاء اللاحقة، لذلك ليست الاستجابة المبثوثة دليلًا تلقائيًا على وصول كل قطعة من المحتوى — افحص، ولا تفترض. والفرق الحقيقي بين الوضعين تشغيلي: المحتوى المصيَّر مسبقًا ثابت حتى البناء التالي (أو تحديث تشغيل منفصل مضبوط) ويُخدم مباشرةً من حافة CDN؛ أما المحتوى عند الطلب فدائمًا حديث لكنه يعتمد على سلامة adapter وبيئة التشغيل في الإنتاج. لا تتعامل مع ذلك بوصفه قرار SEO — اختر بناءً على حداثة البيانات والتشغيل، ثم تحقق من المسارات المنشورة والحالات وعمليات إعادة التوجيه ورؤوس الاستجابة بدل الاستقراء من نجاح بيئة التطوير المحلية.

View Transitions: آمنة لتحسين محركات البحث رغم إحساس التطبيق الأحادي

يمنح <ClientRouter /> في Astro (المعروف سابقًا باسم <ViewTransitions />) تنقلًا ناعمًا شبيهًا بتطبيق SPA باستخدام View Transitions API وHistory API في المتصفح. والحقيقة الأساسية أنه يتنقل باستخدام history.pushState، وهو ما توصي به Google بالضبط للتنقل من جهة العميل — إذ تحذر Google من أن عناوين URL القائمة على الأجزاء (#hash) شيء “can’t reliably resolve.” (ترجمة) «لا تستطيع حله بصورة موثوقة». والأهم أن View Transitions تحسين من جهة المتصفح. عندما يزحف Googlebot، يطلب كل عنوان URL ويحصل على صفحة HTML عادية مكتملة — وتظل صفحات MPA الكامنة كما هي. تؤثر الانتقالات فقط في ما يراه الإنسان في المتصفح.

إذن لا، لا تحول View Transitions موقع Astro إلى SPA، ولا تكسر تحسين محركات البحث. وهناك فجوة جديرة بالملاحظة: لا يحتوي دليل View Transitions في Astro على قسم لتحسين محركات البحث، وربما لهذا تستمر خرافة «إنها تكسر SEO». وللتحقق في موقعك، اجلب بضعة عناوين URL مباشرةً وتأكد من أن كلًا منها يعيد HTML كاملًا — لا تأخذ الأمر بالإيمان، بل افحص نشرَك.

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

  1. افتراض أن Astro يتولى تحسين محركات البحث عنك. إنه يتولى HTML. أما البيانات الوصفية والعناوين الأساسية وخريطة الموقع والمخطط فهي مسؤوليتك.
  2. نسيان site: في الإعداد — فلا تُنشأ خريطة موقعك بصمت.
  3. عدم إضافة خريطة الموقع إلى robots.txt — لن يفعل Astro ذلك.
  4. تحميل صورة LCP بكسل — استبدل ذلك في الصورة الرئيسية بـ eager + fetchpriority.
  5. وضع محتوى قابل للفهرسة في Server Island — يرى الزاحفون المحتوى الاحتياطي لا المحتوى الحقيقي، كما أن Server Islands تتطلب adapter من الأساس.
  6. مطاردة نتيجة Lighthouse المثالية والتوقف عندها. السرعة إشارة ترتيب، وليست إشارة الترتيب الوحيدة. الصفحة الفارغة السريعة لا تتصدر — فالمحتوى والروابط وE-E-A-T ما تزال تؤدي العمل الأكبر.
  7. وضع المحتوى القابل للفهرسة داخل مكوّن client:only فقط. بخلاف توجيهات client:* الأخرى، يتخطى client:only التصيير من الخادم بالكامل — ولا يوجد HTML لهذا المكوّن حتى يرطبه المتصفح.
  8. التعامل مع «Astro ثابت/سريع» بوصفه ضمان نتيجة. HTML الثابت أو المولّد عند الطلب والجزر وadapters آليات — لا تضمن وحدها قابلية الزحف أو الفهرسة أو الترتيب أو Core Web Vitals. تحقق من المسار المنشور، لا من مخطط البنية.

موضع هذا في المجموعة

Astro إجابة محددة، وصديقة لتحسين محركات البحث على نحو استثنائي، عن الأسئلة التي يطرحها JavaScript SEO حول التصيير، كما أنه واجهة أمامية شائعة لإعدادات headless CMS. ويتصل جانب الأداء مباشرةً بـ Core Web Vitals في مجموعة أداء الويب، كما أن منهجية اختبار «هل يوجد محتواي فعلًا في HTML؟» هي نفسها المستخدمة في مجموعات الزحف والفهرسة.

Add an expert note

Pin an expert quote

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