أطر JavaScript من جانب العميل

تشترك React وVue وAngular وSvelte وSolidJS في مشكلة SEO واحدة: يرسل العرض من جانب العميل قشرة فارغة. والحل هو إدارة head مع استراتيجية عرض.

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

React وVue وAngular وSvelte وSolidJS مكتبات واجهة مستخدم ترسل افتراضياً قشرة HTML شبه فارغة وتبني الصفحة في المتصفح بالعرض من جانب العميل. وهذا يترك الزواحف أمام صفحة فارغة حتى تشغيل JavaScript؛ تستطيع Google عرضها عبر طابور مؤجل، بينما تقل موثوقية Bing وزواحف الذكاء الاصطناعي. والحل واحد: حزمة لإدارة head كي توجد وسوم meta لكل مسار، واستراتيجية عرض مثل العرض المسبق أو SSR أو الإطار الفوقي الموافق. يشرح هذا المحور المشكلة والحل المشتركين، ثم يحيل إلى الأدلة الخاصة بكل إطار.

الخلاصة — React وVue وAngular وSvelte وSolidJS مكتبات واجهة مستخدم تعتمد افتراضياً العرض من جانب العميل: ترسل قشرة HTML شبه فارغة وتبني DOM في المتصفح. مشكلة SEO واحدة في الأطر الخمسة؛ فالزاحف يتلقى قشرة فارغة ولا يوجد المحتوى إلا بعد تنفيذ JavaScript. تعرض Google هذه التطبيقات، لكن عبر طابور مؤجل، بينما يقل الاعتماد على Bing وزواحف الذكاء الاصطناعي. والحل واحد أيضاً: (1) إدارة head بحزمة لكل مسار لوسم <title> ووسوم meta، و**(2) استراتيجية عرض**، مثل العرض المسبق أو SSR أو الانتقال إلى إطار العمل الفوقي الموافق. وتكمن الفروق أساساً في اسم الحزمة والاستراتيجية، كما توضحه الأدلة المتخصصة أدناه.

إنها مكتبات وليست أطر عمل كاملة — وهذا أصل المشكلة

تختلف معماريات الأطر، ولذلك لا يعني العرض من جانب العميل تلقائياً فشل الفهرسة. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: MDN: Client-side frameworks يقلل العرض من الخادم أو العرض المسبق الاعتماد على تنفيذ JavaScript لدى الزاحف، من دون أن يضمن الفهرسة. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics

React وVue وAngular وSvelte وSolidJS هي أساساً مكتبات لعرض واجهة المستخدم. تتمثل مهمتها في تحويل بياناتك إلى DOM وإبقائه متزامناً عند تغير الحالة. ويُبنى DOM افتراضياً في المتصفح؛ وهذا بالضبط ما يجعلها سريعة وشبيهة بالتطبيقات، وما ينشئ مشكلة SEO أيضاً.

يرسل البناء الافتراضي قشرة HTML بعقدة تحميل فارغة (<div id="root"> أو <div id="app"> أو <app-root>) وحزمة JavaScript. وكل ما يهم محرك البحث، من العناوين والنص والروابط الداخلية والبيانات المنظمة، تحقنه الحزمة بعد تنزيلها وتنفيذها. وقبل تشغيل JavaScript لا يوجد شيء هناك.

هذا هو العرض من جانب العميل، أي سلوك المكتبات المجردة فور إخراجها من الصندوق قبل إضافة إطار فوقي أو خطوة عرض مسبق أثناء البناء. وليس خطأ، بل نقطة البداية الافتراضية. لكن «الافتراضي» لا يعني «دائماً» أو «عالمياً»: يتغير باختلاف الإصدار وأداة CLI أو القالب المستخدم، وقد يعمل مساران في التطبيق نفسه بنمطي عرض مختلفين بحسب بنائهما، كصفحة تسويق معروضة مسبقاً ولوحة معلومات بقيت CSR خالصاً. لا تستنتج السلوك من اسم الإطار؛ افحص ما يرسله مسار بعينه في بناء بعينه.

المشكلة المشتركة: قشرة فارغة

توضح Google أنها تعالج تطبيقات JavaScript على مراحل: الزحف ثم العرض ثم الفهرسة، وأنه “without rendering Google might not see that content.” (ترجمة) «من دون العرض قد لا ترى Google ذلك المحتوى». وفي تطبيق CSR يوجد كل المحتوى خلف خطوة العرض. وينتج عن ذلك ثلاثة آثار:

  • العرض مؤجل ومدة الانتظار غير ثابتة. العرض خطوة مستقلة تدخل طابوراً بعد الزحف. توثق Google الزحف والعرض والفهرسة بوصفها ثلاث مراحل منفصلة، لكنها لا تلتزم بمدة انتظار عالمية لكل صفحة. يختلف التأخير حسب عنوان URL وموارد Google المتاحة حينها؛ ولا يوجد محتواك للفهرسة حتى يكتمل العرض فعلياً، مهما استغرق ذلك للصفحة.
  • لا يمكن افتراض سلوك الزواحف غير التابعة لـGoogle. يعرض Bing JavaScript بصورة غير متسقة، ولا تنفذ معظم زواحف الذكاء الاصطناعي إلا قدراً قليلاً من JavaScript أو لا تنفذه إطلاقاً. هذه شركات وبنى تحتية منفصلة، فلا يجوز تعميم وثائق Google عليها؛ تحقق من السلوك الحالي لكل مزود بدلاً من افتراض مطابقته لـGoogle أو لاختبار العام الماضي. وقد يصبح موقع CSR فقط شبه غير مرئي للزواحف التي لا تعرض JavaScript، مع نمو حصة زواحف الذكاء الاصطناعي من الزيارات.
  • بيانات التعريف الخاصة بكل صفحة مفقودة. يعني ملف HTML واحد وجود <title> واحد ووصف meta واحد لكل المسارات، ما لم تدر قسم head لكل مسار بفاعلية.

الحل المشترك، الجزء الأول: إدارة head

لأن تطبيق SPA يملك مستند HTML واحداً، تحتاج إلى شفرة تحدّث head المستند عند انتقال المستخدم (وعارض الزاحف) بين المسارات. ولكل إطار حزمة معتمدة أو واجهة API مدمجة لهذا الغرض:

  • Reactreact-helmet-async (أو واجهة metadata في الإطار إذا انتقلت إلى Next.js).
  • Vue@unhead/vue (المحرك وراء أدوات SEO في Nuxt).
  • Angular ← خدمتا Title وMeta المدمجتان من @angular/platform-browser، بلا تبعية إضافية.
  • Svelte ← العنصر المدمج <svelte:head>.
  • SolidJS@solidjs/meta (وSolidStart لمسار SSR).

تمنحك إدارة head وسوم meta صحيحة وفريدة، لكنها لا تحل مشكلة القشرة الفارغة وحدها. فالوسوم لا تظهر إلا بعد تشغيل JavaScript. ولهذا تحتاج أيضاً إلى الجزء الثاني.

الحل المشترك، الجزء الثاني: استراتيجية عرض

لوضع المحتوى الحقيقي (ووسوم head) في HTML قبل تنفيذ JavaScript، اختر أحد ثلاثة أساليب، مرتبة بحسب مقدار مخاطرة SEO التي تزيلها:

  1. العرض المسبق / التوليد الثابت (SSG). أنشئ HTML ثابتاً لكل مسار وقت البناء. وهو الأقل مخاطرة للمحتوى الذي لا يتغير مع كل طلب. ولكل مكتبة مسار عرض مسبق، مثل العرض المسبق المدمج في SolidJS وإضافات Vue والعرض المسبق في Angular.
  2. العرض من جانب الخادم (SSR). اعرض HTML على الخادم لكل طلب، ثم نفذ hydration في المتصفح. وهنا تأتي الأطر الفوقية: Next.js لـReact وNuxt لـVue وAngular SSR (المعروف سابقاً باسم Angular Universal) وSvelteKit لـSvelte وSolidStart لـSolidJS. واعتماد الإطار الفوقي الموافق هو الحل الأنظف لمعظم مواقع المحتوى التي تحتاج إلى الترتيب.
  3. ابقَ على CSR كاملاً واجعله قابلاً للزحف. قد يكون ذلك مقبولاً لواجهات شبيهة بالتطبيقات خلف تسجيل الدخول ولا تحتاج إلى الترتيب، لكنه افتراضي ضعيف لأي شيء تريده في البحث.

اتخذ القرار لكل مسار، لا لكل تطبيق. فقد تقع صفحة تسويق ولوحة معلومات لمستخدم مسجل في صفين مختلفين من القائمة نفسها بصورة منطقية. واسأل عن كل مسار:

  • المخرجات — هل يجب أن يكون المحتوى في الاستجابة الأولية، أم يكفي ظهوره بعد تشغيل JavaScript؟
  • الحداثة — هل هو ثابت بما يكفي لبنائه مرة واحدة (عرض مسبق)، أم يتغير مع كل طلب (SSR)؟
  • التخصيص — هل يختلف لكل زائر؟ لا يفيد العرض المسبق هنا، وعليك الاختيار بين SSR وCSR.
  • تكلفة الخادم — يضيف SSR معالجة لكل طلب، بينما يحمّل العرض المسبق تلك التكلفة وقت البناء.
  • الاعتماد على JavaScript — ما مقدار فائدة المسار المعتمدة على تشغيل JavaScript لدى العميل؟
  • سلوك الفشل — إذا فشل JavaScript أو حُجب، فهل يتراجع المسار إلى شيء قابل للاستخدام أم إلى لا شيء؟

السؤال واحد بصرف النظر عن الإطار: هل يحتاج هذا المحتوى إلى الترتيب أو الاستشهاد به؟ إذا كانت الإجابة نعم، فضَعْه في HTML المعروض على الخادم أو مسبقاً. وإذا كان مجرد واجهة تطبيق تفاعلية، فإن CSR مناسب.

كيف تتعامل Google مع هذه التطبيقات (ولماذا لا تفعل الجهات الأخرى الشيء نفسه)

تستطيع Google عرض كل هذه الأطر؛ فهي تشغل Chrome دائم التحديث من دون واجهة وتنفذ JavaScript. لكنها تفعل ذلك عبر طابور مؤجل، والعارض عديم الحالة (لا يحتفظ بملفات تعريف الارتباط أو localStorage، ولا يستخدم service workers، ولا يتفاعل أو يمرر أو ينقر). لذلك تنطبق قواعد JS-SEO نفسها من محور JavaScript SEO فوق اختيار الإطار: روابط <a href> حقيقية، وتكافؤ DOM الخام والمعروض، وعدم حجب المحتوى خلف تفاعل، وعدم حقن noindex عبر JavaScript.

خارج Google تبدو الصورة أسوأ. فعرض JavaScript لدى Bing أقل اتساقاً، ومعظم زواحف الذكاء الاصطناعي لا تعرضه إطلاقاً. وقد يعني ذلك في تطبيق CSR أن المحتوى يوجد لدى Google في النهاية، لكنه لا يوجد لدى Bing أو أدوات الذكاء الاصطناعي التي يبحث بها عدد متزايد من الناس. يغلق SSR أو العرض المسبق هذه الفجوة أمام الجميع لا Google وحدها؛ وهذه أقوى حجة ضد نشر محتوى CSR فقط.

الأطر الخمسة في لمحة

الإطارالافتراضيإدارة headSSR / الإطار الفوقيملاحظة SEO
ReactCSRreact-helmet-asyncNext.js (واجهة Metadata)أشهر SPA يبدأ بـCSR؛ وNext.js هو حل SEO القياسي
VueCSR@unhead/vueNuxt (useSeoMeta())يستخدم Nuxt SSR افتراضياً؛ وتحتاج Vue المجردة إلى العرض المسبق أو Nuxt
AngularCSR (SPA)خدمتا Title/Meta المدمجتانAngular SSR (Universal سابقاً)تطبيقات SPA كبيرة؛ وتضيف Angular الحديثة SSR وhydration تزايدياً
SvelteCSR (Svelte) / SSR (SvelteKit)<svelte:head>SvelteKit (SSR افتراضياً)يستخدم SvelteKit SSR افتراضياً؛ انتبه إلى فخ ssr:false الثابت
SolidJSCSR@solidjs/metaSolidStartتفاعلية دقيقة الحبيبات؛ ويضيف SolidStart العرض المسبق وSSR

النمط ثابت: CSR افتراضي، وحزمة لإدارة head، واستراتيجية عرض (غالباً الإطار الفوقي الموافق). وما يختلف هو الأسماء وبعض التفاصيل الحادة.

الخطوة التالية: الأدلة المتعمقة لكل إطار

هذا المحور هو الخريطة. ولكل إطار دليل خاص بالحزم والإعدادات والمشكلات المحددة:

  • React SEO — لماذا ينشئ React الذي يبدأ بـCSR مخاطرة فهرسة، وReact Router وHistory API وreact-helmet-async، ومتى تستخدم Next.js.
  • Vue SEO — افتراضي CSR في Vue 3 وcreateWebHistory() و@unhead/vue والعرض المسبق من دون إطار فوقي، ومتى يكون Nuxt الخيار الصحيح.
  • Angular SEO — افتراضيات SPA في Angular و@angular/ssr وخدمتا Title وMeta المدمجتان والعرض المسبق وhydration التزايدي.
  • Svelte SEO — الفرق بين Svelte وSvelteKit، وSSR الافتراضي في SvelteKit، و<svelte:head>، وفخ adapter-static مع ssr: false، وآثاره على زواحف الذكاء الاصطناعي.
  • SolidJS SEO — افتراضي CSR في SolidJS و@solidjs/meta وSolidStart لـSSR والعرض المسبق، وتأثير نموذجه الدقيق في المخرجات المعروضة.

لأنماط العرض نفسها (CSR وSSR وSSG وISR وhydration والعرض الديناميكي) وقواعد العرض والتكافؤ الأوسع، راجع محور JavaScript SEO الأب.

Add an expert note

Pin an expert quote

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