تحسين محركات البحث لمواقع React
يعرض React الصفحات من جهة العميل افتراضياً، لذلك ترى برامج الزحف غلافاً فارغاً إلى أن تعمل JavaScript. إليك كيف تعالج Google تطبيقات React فعلياً، وأي استراتيجية عرض تختار، وكيف تصلح التوجيه والبيانات الوصفية وفخ المحتوى المكرر الناتج عن انتهاء مهلة العرض.
اللغات
React ليست سيئة لتحسين محركات البحث، لكن العرض الافتراضي من جهة العميل هو المشكلة. في CRA وVite + React يرسل الخادم غلافاً فارغاً ويبني المتصفح الصفحة، فلا ترى برامج الزحف شيئاً حتى تعمل JavaScript. تستطيع Google عرض React عبر Web Rendering Service، لكن العرض يدخل طابوراً وقد يتأخر أو تنتهي مهلته؛ وقد عرض Gary Illyes حالات تركت فيها المهلة صفحات تحتوي على القالب المشترك فقط فصُنفت مكررة. تختلف عقود العرض لدى زواحف الذكاء الاصطناعي حسب الموفّر، لذلك يضيف محتوى CSR فقط خطر نقص التغطية. والحل هو استراتيجية العرض؛ إذ يضع SSR أو SSG، والأسهل عادة عبر Next.js أو Remix، المحتوى في HTML الأولي، ثم تتم إماهته باستخدام hydrateRoot لا createRoot كي يتطابق خرج الخادم والعميل تماماً. وبعد ذلك استخدم History API وروابط <a href> حقيقية ورموز حالة صحيحة وبيانات وصفية مناسبة للإصدار؛ ينقل React 19 وسوم <title>/<meta>/<link> أصلياً، وإلا فاستخدم react-helmet-async ولا تستخدم react-helmet الأصلي المتروك.
الخلاصة — React ليست سيئة لتحسين محركات البحث، لكن الطريقة التي تُبنى بها معظم تطبيقات React هي المشكلة. افتراضياً، يبني React الصفحة في متصفح الزائر، لذلك يحصل محرك البحث عند جلب عنوان URL أول مرة على صفحة شبه فارغة. تستطيع Google عادة ملء الفراغات بتشغيل JavaScript، لكن ذلك أبطأ وأعلى مخاطرة من تسليم HTML مكتمل. والحل هو عرض صفحاتك على الخادم أو في وقت البناء، عادة باستخدام إطار مثل Next.js.
لماذا تختلف React
ترسل معظم المواقع، مثل مدونة WordPress، صفحة مكتملة إلى محرك البحث؛ يبني الخادم HTML ويرسله مع العنوان وكل شيء. يفعل تطبيق React القياسي العكس. يرسل الخادم غلافاً شبه فارغ، وهو في الأساس <div> فارغ، ثم تعمل JavaScript في المتصفح لبناء الصفحة الفعلية.
هذا رائع للتجارب السلسة الشبيهة بالتطبيقات، لكنه مشكلة لتحسين محركات البحث لأن أول ما ينزله الزاحف هو الغلاف الفارغ. لا يكون محتواك موجوداً بعد، بل يظهر فقط بعد تشغيل JavaScript.
ألا تستطيع Google تشغيل JavaScript ببساطة؟
نعم. تشغّل Google نسخة حقيقية وحديثة من Chrome في الخلفية ويمكنها تنفيذ JavaScript لرؤية الصفحة المكتملة. لذلك يمكن فهرسة محتوى React. Evidence for this claim Googlebot uses an evergreen Chromium rendering engine and can execute JavaScript. Scope: Google Search; successful execution still depends on accessible resources and application behavior. Confidence: high · Verified: Google: JavaScript SEO basics
لكن توجد محاذير:
- يتأخر. تنفذ Google العرض لاحقاً في خطوة منفصلة تدخل طابوراً، لذلك قد يستغرق ظهور المحتوى في البحث وقتاً أطول.
- قد يفشل. إذا كانت صفحتك بطيئة في تحميل محتواها، فقد يتوقف عارض Google قبل ظهور المحتوى ويفهرس صفحة شبه فارغة.
- تختلف برامج الزحف الأخرى. يتعامل Bing مع JavaScript بدرجة أقل موثوقية، ولا ينشر موفرو الذكاء الاصطناعي عقد عرض مشتركاً واحداً. وأي زاحف يجلب HTML الأولي فقط سيرى تطبيق React الافتراضي فارغاً.
الحل البسيط
ضع محتواك في HTML قبل وصوله إلى المتصفح. توجد طريقتان:
- العرض من جهة الخادم (SSR) — يبني الخادم الصفحة الكاملة لكل طلب.
- توليد الموقع الثابت (SSG) — تُبنى الصفحات كملفات HTML مكتملة مسبقاً. Evidence for this claim React supports server rendering APIs and can be used by frameworks that generate HTML outside the browser. Scope: React server APIs; build-time generation is a framework/build-system capability rather than a React mode by itself. Confidence: high · Verified: React: Server APIs
أسهل طريق إلى أي منهما هو Next.js، وهو إطار مبني على React ينفذ ذلك لك. ويُعد Remix خياراً جيداً آخر. مع SSR أو SSG يسلّم موقع React صفحة كاملة إلى برامج الزحف، فيصبح ملائماً للبحث مثل أي موقع عادي.
أمور أخرى ينبغي ضبطها
- استخدم عناوين URL عادية مثل
/products، لا عناوين التجزئة مثل/#/products، لأن Google لا تستطيع فهرسة الأخيرة بصورة موثوقة. - اجعل روابطك روابط حقيقية من نوع
<a href>، لا عناصر<div>قابلة للنقر. - امنح كل صفحة عنواناً ووصفاً فريدين يتغيران عند تغير الصفحة.
هل تريد النسخة الأعمق، بما فيها طريقة عمل عارض Google فعلياً، وفخ انتهاء مهلة العرض الذي ينشئ صفحات مكررة، ومقارنة استراتيجيات العرض، وكيف تختبر ما تراه Google؟ انتقل إلى علامة تبويب المتقدم.
الخلاصة — مشكلة React مع تحسين محركات البحث ليست React نفسها، بل العرض الافتراضي من جهة العميل. يرسل CRA وVite + React غلافاً فارغاً ويبنيان DOM في المتصفح، لذلك لا يحتوي HTML الخام الذي يجلبه الزاحف على محتوى. تستطيع Google عرضه عبر Web Rendering Service المبني على Chromium دائم التحديث، لكن العرض يدخل طابوراً منفصلاً وقد يتأخر وقد تنتهي مهلته. وقد وثق Gary Illyes أن مهلات العرض تترك صفحات لا تحتوي إلا على القالب المشترك ثم تُصنف مكررة. يعرض Bing JavaScript بدرجة أقل موثوقية، ويختلف عرض زواحف الذكاء الاصطناعي حسب الموفّر. والحل هو استراتيجية العرض: يضع SSR أو SSG، والأسهل عبر Next.js أو Remix، المحتوى في HTML الأولي. وإذا كنت تميه ترميزاً معروضاً على الخادم، فاستخدم
hydrateRootلاcreateRootوتعامل مع أي اختلاف بين الخادم والعميل كخطأ لا كتحذير ينبغي إخفاؤه. ثم استخدم توجيه History API لا عناوين التجزئة، وروابط<a href>حقيقية. ولبيانات<head>الوصفية، ينقل React 19 وسوم<title>و<meta>و<link>أصلياً؛ أما في React 18 أو للاحتياجات المتقدمة فاستخدم react-helmet-async، ولا تستخدم react-helmet الأصلي المتروك. اضبط رموز حالة HTTP الصحيحة. لا تمنح SSR مكافأة ترتيب، بل تجعل المحتوى قابلاً للفهرسة بصورة موثوقة.
ما الذي يجعل React صعبة فعلياً لتحسين محركات البحث
React مكتبة JavaScript قائمة على المكونات، وتعمل خارج الصندوق، عبر Create React App أو Vite + React، من جهة العميل. يعيد الخادم مستنداً شبه فارغ، ومن أشهر صوره <div id="root"></div>، مع حزمة JavaScript، ثم ينفذ المتصفح JavaScript لبناء DOM. قارن ذلك بصفحة معروضة على الخادم، مثل WordPress أو تطبيق Rails، حيث يصل HTML الكامل، بما فيه المحتوى والعناوين والروابط، في الاستجابة الأولى.
لذلك فالسؤال الذي يحسم كل شيء هو: ما الموجود في HTML الخام قبل تشغيل أي JavaScript؟ في تطبيق React افتراضي تكون الإجابة «لا شيء تقريباً». انقر بزر الفأرة الأيمن واختر View Source في تطبيق CRA وسترى الغلاف لا المحتوى. وهذا بالضبط ما يحصل عليه الزاحف في أول جلب.
ولتحديد المسؤولية بدقة: مكتبة React ليست محصورة في CSR. يوفر React DOM العرض من جهة العميل عبر createRoot، والعرض على الخادم عبر واجهات متدفقة وثابتة، وواجهات الإماهة؛ فالمكتبة تدعم ذلك كله. مشكلة الغلاف الفارغ خاصية في سلسلة الأدوات الافتراضية، أي Create React App أو Vite + React من دون خادم، التي توصل واجهات العميل فقط ولا توفر شيئاً يعرض HTML على الخادم. بدّل سلسلة الأدوات إلى Next.js أو Remix أو واجهات العرض الخادمي في React نفسها، وسترسل المكتبة نفسها HTML كاملاً في الاستجابة الأولى.
هذا هو التطبيق الخاص بـReact لمشكلة تحسين JavaScript لمحركات البحث الأوسع. راجع ذلك الموضوع لأوضاع الفشل العامة، مثل التكافؤ والتفاعل والحالة والتوقيت. وسأركز هنا على ما يخص React وكيفية إصلاحه.
كيف تعالج Google تطبيق React فعلياً
تتعامل Google مع JavaScript في ثلاث مراحل: الزحف ← العرض ← الفهرسة. يجلب Googlebot عنوان URL، ثم يبني Web Rendering Service (WRS)، وهو نسخة دائمة التحديث من Chromium ومحرك Chrome نفسه، DOM المعروض لاحقاً، وبعدها يُفهرس الناتج وتُستخرج روابطه. Evidence for this claim Google processes JavaScript pages through crawling, rendering, and indexing using its Web Rendering Service. Scope: Google Search rendering behavior. Confidence: high · Verified: Google: JavaScript SEO basics
الفارق المهم هو وقت العرض. لأنه كثيف الموارد، يدخل العرض طابوراً منفصلاً عن الزحف الأولي. وصف Martin Splitt التدفق بوضوح: “we do an HTTP request, and we get something back … some barebone HTML and all it does is load the JavaScript and run the JavaScript. Then, this HTML … goes into rendering. Rendering runs JavaScript — boom!, a lot of content happens that wasn’t there before.” (ترجمة) «نجري طلب HTTP ونستقبل شيئاً، ربما HTML أساسياً لا يفعل سوى تحميل JavaScript وتشغيلها. ثم يدخل هذا HTML في العرض. يشغّل العرض JavaScript، وفجأة يظهر كثير من المحتوى الذي لم يكن موجوداً من قبل.» في صفحة React بنمط CSR تكون هذه «الطفرة» هي صفحتك كلها؛ فلا يوجد شيء منها حتى تعمل خطوة العرض.
وثمة تحذير مهم: لا تبالغ في الاعتماد على نموذج «موجتي الفهرسة» القديم. فقد تراجع Splitt نفسه عنه وسمّى الموجة “an oversimplification.” (ترجمة) «تبسيطاً مفرطاً». ليست الخلاصة أن هناك «موجة ثانية» رسمية ذات توقيت محدد، بل إن العرض خطوة مستقلة قابلة للتأجيل والفشل، وأن CSR يضع 100% من محتواك على الجانب الخطأ منها.
حقيقتان أخريان عن العارض تؤذيان تطبيقات React تحديداً:
- إنه عديم الحالة. لا يحتفظ Googlebot بـ
localStorageأوsessionStorageأو ملفات تعريف الارتباط بين تحميلات الصفحات. وأي محتوى أو توجيه يعتمد على حالة العميل غير مرئي للزاحف. - يمكنه الاستسلام. يفرض العارض مهلة. فإذا كان تحميل المحتوى الرئيسي بطيئاً، بسبب حزم كبيرة أو سلسلة طلبات API، فقد ينتهي العرض قبل وصول المحتوى وتفهرس Google الصفحة غير المكتملة.
فخ انتهاء مهلة العرض ولماذا ينشئ صفحات مكررة
نادراً ما يُشرح وضع الفشل هذا جيداً، وهو الأكثر ضرراً لتطبيقات React. وصفه Gary Illyes مباشرة: “I have a bunch of emails in my inbox where the issue is that the centerpiece took forever to load, so rendering timed out … and we were left with a bunch of pages that only had the boilerplate. With only the boilerplate, those pages are dups.” (ترجمة) «لدي رسائل كثيرة كانت مشكلتها أن المحتوى المركزي استغرق وقتاً طويلاً جداً للتحميل، فانتهت مهلة العرض، وبقيت صفحات لا تحتوي إلا على القالب المشترك. ومع القالب وحده تصبح تلك الصفحات مكررة.»
تتبع ما يعنيه ذلك لتطبيق React بنمط CSR. يحمل الرأس والتنقل والتذييل، وهي القالب المشترك، بسرعة. أما محتوى الصفحة الفعلي الذي يميز كل عنوان URL فيُجلب ويُعرض عبر JavaScript ويصل ببطء. تنتهي مهلة العرض، فلا يبقى لدى Google سوى الرأس والتنقل والتذييل في كل عنوان URL. تبدو كل الصفحات متطابقة فتعلّمها Google كمكررات في Search Console.
أما إصلاح Illyes نفسه فهو الجزء القابل للتنفيذ: “Try to restructure the js calls such that the content (including marginal boilerplate) loads first and see if that helps.” (ترجمة) «حاول إعادة هيكلة استدعاءات JavaScript بحيث يُحمّل المحتوى، بما فيه القالب الهامشي، أولاً، ثم انظر هل يساعد ذلك.» لكن الحل الأكثر دواماً هو ألا تعتمد على خطوة العرض لمحتواك الرئيسي، أي استخدام SSR أو SSG.
استراتيجيات العرض في React
هذا القرار الأكثر تأثيراً. الخيارات، من الأسوأ إلى الأفضل تقريباً لتحسين محركات البحث:
- CSR، React الافتراضية. يرسل الخادم الغلاف ويبني المتصفح كل شيء. يتأخر المحتوى بسبب طابور العرض ويتعرض للمهلة. وهو الأعلى مخاطرة لتحسين محركات البحث، لكنه مناسب للوحات التحكم المسجلة التي لا تريد فهرستها. Evidence for this claim Client-only React rendering constructs UI in the browser; server rendering APIs produce HTML before browser hydration. Scope: React rendering mechanics; SEO impact depends on what the initial response contains. Confidence: high · Verified: React: hydrateRoot React: Server APIs
- العرض المسبق. عرض في وقت البناء من دون إطار SSR كامل؛ تزحف أدوات مثل
react-snapأو خدمة عرض مسبق إلى تطبيقك وتحفظ HTML ثابتاً. وهو أخف ويناسب المواقع الأبسط والثابتة في معظمها. - SSG، توليد الموقع الثابت. يُبنى HTML مرة في وقت النشر ويُقدّم كملفات ثابتة. هو الأسرع والمحتوى حاضر دائماً في HTML الخام، لكنه محدود للمحتوى شديد الديناميكية أو الخاص بالمستخدم، وقد تطول أوقات البناء للمواقع الكبيرة.
- SSR، العرض من جهة الخادم. ينفذ الخادم React لكل طلب ويرسل HTML كاملاً. يتاح المحتوى فوراً للزواحف ويظل حديثاً، لكنه يتطلب خادم Node.js وقد يرفع TTFB قليلاً.
- الهجين أو ISR، التجديد الثابت التزايدي. ميزة في Next.js تعيد توليد الصفحات الثابتة في الخلفية، فتوفر سرعة الثبات مع تحديث دوري.
| الاستراتيجية | هل المحتوى في HTML الأولي؟ | مخاطر SEO | الأنسب لـ |
|---|---|---|---|
| CSR، React خام | لا | الأعلى | لوحات تحكم مسجلة وتطبيقات غير مفهرسة |
| العرض المسبق | نعم، في وقت البناء | منخفضة | مواقع صغيرة وثابتة غالباً |
| SSG | نعم، في وقت البناء | الأدنى | المدونات والوثائق والتسويق |
| SSR | نعم، لكل طلب | منخفضة | محتوى حديث وديناميكي |
| ISR أو الهجين | نعم | منخفضة | محتوى يتغير كل ساعة أو يوم |
وهناك استراتيجية ينبغي تجنبها في المشاريع الجديدة: العرض الديناميكي، أي اكتشاف وكيل مستخدم الزاحف وتقديم نسخة معروضة مسبقاً له بينما يحصل المستخدمون على CSR. تسميه Google الآن “a workaround and not a long-term solution” (ترجمة) «حلاً التفافياً لا حلاً طويل الأمد»، وتقول إنه “creates additional complexities and resource requirements,” (ترجمة) «ينشئ تعقيدات ومتطلبات موارد إضافية»، وتوصي بدلاً منه بالعرض من جهة الخادم أو العرض الثابت أو الإماهة. أوصى Bing بالعرض الديناميكي في 2018، لكن الإرشاد قديم؛ فمنذ 2019 يعرض Bingbot عبر Microsoft Edge وChromium، ويبقى SSR أو SSG الاختيار الصحيح.
ينبغي أيضاً إنهاء أسطورة أن SSR تمنح دفعة ترتيب. قال John Mueller: “there are no SEO ranking bonuses for implementing it one way or another” (ترجمة) «لا توجد مكافآت ترتيب في تحسين محركات البحث لاختيار طريقة تنفيذ دون أخرى»، فالطرق المختلفة “just different ways of making the content indexable.” (ترجمة) «مجرد طرق مختلفة لجعل المحتوى قابلاً للفهرسة». قيمة SSR هي موثوقية الفهرسة، وغالباً تحسين Core Web Vitals بفضل First Contentful Paint أسرع، لا رافعة ترتيب سحرية.
يجب أن تتطابق الإماهة تماماً: هذا حد للخطأ لا تقنية SEO
يسلّم SSR وSSG المتصفح HTML يحتوي على محتواك بالفعل. ثم يتعين على React الاتصال بذلك الترميز على العميل، وهذا يستخدم واجهة مختلفة عن العرض العادي من جهة العميل:
createRootيعرض React في عقدة DOM من الصفر ولا يتوقع ترميزاً موجوداً. استخدمه لتطبيقات CSR فقط.hydrateRootيتصل بـHTML سبق أن ولّدهreact-dom/server، ويتوقع أن ينتج العرض الأول للعميل خرجاً مطابقاً لما أرسله الخادم. إذا كنت تستخدم SSR أو SSG فأنت تريدhydrateRootلاcreateRoot. إن استدعاءcreateRootعلى ترميز معروض على الخادم يجعل React يتخلص منه ويعيد العرض من الصفر، فيهدر بالضبط فائدة تحسين محركات البحث التي أعددت SSR أو SSG لتحقيقها.
يمثل عدم التطابق بين خرج الخادم والعميل خطراً حقيقياً في تطبيقات React التي تصلح SEO، مثل Date.now() في عنوان أو تنسيق يعتمد على المنطقة أو فرع if (typeof window !== 'undefined'). توضح وثائق React ما يحدث: تحذر من عدم التطابق في التطوير، لكن “there are no guarantees that attribute differences will be patched up in case of mismatches.” (ترجمة) «لا توجد ضمانات بأن اختلافات السمات ستُصحح عند عدم التطابق». والإرشاد هو معاملتها كأخطاء وإصلاحها، لا إخفاء التحذير وافتراض تكافؤ المحتوى. ولتحسين محركات البحث، لا تفترض تطابق المحتوى والبيانات الوصفية مع ما أرسله الخادم لأن الصفحة تبدو صحيحة في المتصفح. قارن HTML الخادم مباشرة بـDOM بعد الإماهة، أو استخدم فحص View Source مقابل Inspect Element السريع أدناه.
React Router وبنية عناوين URL
يدير React Router التنقل في المتصفح من دون رحلات إلى الخادم، وهذا مناسب لتحسين محركات البحث إذا ضُبط جيداً:
- استخدم History API لا توجيه التجزئة. يستخدم
BrowserRouterالدالةpushStateوينتج عناوين نظيفة قابلة للزحف مثل/products. ينتجHashRouterعناوين مثل/#/productsلا تستطيع Google حلها بصورة موثوقة؛ إذ أُلغي مخطط زحف AJAX القديم. استخدم History API. - يجب أن يتعامل الخادم مع هذه العناوين أيضاً. مع توجيه History API تحتاج كل «صفحة» إلى عنوان حقيقي يستجيب له الخادم، وهو ضروري لـSSR ولكي لا يعيد الوصول المباشر أو تحديث
/productsخطأ 404. - يعرض
<Link>رابطاً حقيقياً. ينتج مكوّن<Link>في React Router عنصراً<a href>قابلاً للزحف. أما التنقل المبني علىonClickمن دون رابط فغير قابل للزحف؛ إذ تتبع Google روابط<a href>الحقيقية فقط.
إدارة البيانات الوصفية: react-helmet وreact-helmet-async ووسوم React 19 الأصلية
حتى React 18 لم يكن React يحدّث <head> أصلياً عند تغير المسار؛ وكان يلزم تعيين <title> والوصف وcanonical ووسوم Open Graph وTwitter لكل مسار بواسطة مكتبة. غيّر React 19 ذلك: تستطيع المكونات عرض <title> و<meta> و<link> مباشرة، وينقلها React إلى <head> من تلقاء نفسه، في التطبيقات العميلية وSSR المتدفق وServer Components. وReact 19.2 هو الإصدار المستقر الحالي في منتصف 2026، لذلك ينطبق ذلك على التطبيقات ذات الإصدار الحالي.
تعتمد الإجابة الصحيحة على إصدار React وما تحتاج إليه:
- React 19، تطبيق مستقل ووسوم أساسية فقط. اعرض
<title>و<meta>و<link>في مكوناتك مباشرة، ولا تحتاج إلى مكتبة. - React 19، لكنك تحتاج
htmlAttributesأوbodyAttributesأو تسلسلcontextفي SSR أوonChangeClientStateأوprioritizeSeoTagsأوtitleTemplate. لا يغطي النقل الأصلي هذه الميزات؛ فاستخدمreact-helmet-async. وتوضح وثائقه أنك قد لا تحتاج إلى الحزمة في React 19 إن لم تكن لديك تلك الاحتياجات. - React 18 أو أقدم، تطبيق مستقل. لا يوجد النقل الأصلي بعد؛ فاستخدم
react-helmet-async. إنه مصان بنشاط، في الإصدار الرئيسي 3، ويكتشف إصدار React وقت التشغيل ويدعم SSR. react-helmetالأصلي. لا تستخدمه مع أي إصدار. لم يعد مصاناً ولم يصدر له تحديث منذ 2020، وله عيوب مع العرض المتزامن في React 18.- تطبيقات Next.js. استخدم Metadata API في Next، أي تصدير
metadataأوgenerateMetadataفي App Router، بصرف النظر عن إصدار React. لا تضف Helmet ولا تعتمد على النقل الأصلي للوسوم؛ فالإطار يملك المستند في تطبيق Next.js.
تنطبق قاعدة موثوقية واحدة مهما كان اختيارك: البيانات الوصفية الموجودة في HTML أفضل من البيانات المحقونة عبر JavaScript. ووسم canonical المحقون من جهة العميل أقل موثوقية بكثير من الموجود في HTML المعروض على الخادم، وهذا حجة أخرى لـSSR أو SSG.
زواحف الذكاء الاصطناعي تجعل الأمر ملحاً
التطور في 2026 هو أن سلوك العرض لدى GPTBot من OpenAI وClaudeBot من Anthropic وPerplexityBot وغيرهم خاص بكل موفّر وإصدار. يرسل تطبيق React بنمط CSR الغلاف الفارغ نفسه لكل زاحف كما في أول جلب لـGooglebot، ولا تثبت وثائق الموفّرين الحالية وجود خطوة عرض مشتركة تملأه. ومع نمو المحركات التوليدية كسطح اكتشاف، لا يعود SSR أو SSG شأناً خاصاً بـGoogle؛ إذ يزيد HTML الخام التغطية من دون افتراض قيد عالمي على الزواحف. ويغطي موضوع headless CMS هذا الواقع بمزيد من العمق.
اختبار ما تراه Google فعلياً
لا تثق بمتصفحك؛ يعرض DevTools Inspector DOM بعد العرض، أي بعد JavaScript، وهو بالضبط ما لا يراه الزاحف الذي لا يشغلها. استخدم الأدوات الصحيحة:
- View Source مقابل Inspect Element. الأول هو HTML الخام قبل JavaScript، والثاني DOM المعروض. إذا كان المحتوى في Inspect وغير موجود في View Source فهو يعتمد على JavaScript.
- URL Inspection Tool في Search Console. الاختبار الأكثر موثوقية. شغّل اختباراً مباشراً وافحص HTML المعروض ولقطة الشاشة وموارد الصفحة ورسائل وحدة التحكم لترى ما عرضته Google وما فشل تحميله.
- Rich Results Test. فحص سريع لـHTML المعروض من دون التحقق من ملكية الموقع.
- عطّل JavaScript في DevTools وأعد التحميل لمحاكاة سريعة لزاحف لا ينفذ JavaScript، وهو بديل تقريبي لما تراه زواحف الذكاء الاصطناعي.
- تقرير التغطية في Search Console. قد تشير حالة “Discovered, currently not indexed” (ترجمة) «تم اكتشاف الصفحة ولم تتم فهرستها حالياً» إلى تراكم طابور العرض، وقد تشير مجموعات التكرار إلى فخ انتهاء المهلة.
- زواحف تعرض JavaScript. يعرض Ahrefs Site Audit وScreaming Frog في وضع JavaScript الصفحات على نطاق واسع لتستطيع مقارنة HTML الخام بالمعروض عبر الموقع.
Next.js وRemix: الإجابة العملية
إذا كان SEO مهماً وكنت تستخدم React بنمط CSR الخام، فعادة يكون الانتقال إلى إطار يعرض على الخادم هو الصحيح. صُمم Next.js لذلك، ويوفر SSR وSSG وISR وApp Router وMetadata API مدمجة وتقسيم الشفرة وتحسين الصور. أما Remix فهو بديل قائم على معايير الويب، مبني على fetch وRequest وResponse، ويستخدم SSR افتراضياً ويدعم التحسين التدريجي بقوة. لدى Next.js شرح مستقل؛ أختصر هنا قصداً. النقطة الأضيق لـReact SEO هي أن الإطار ينقل محتواك من خطوة العرض المحصورة في المتصفح إلى HTML الأولي.
تكون React جيدة لتحسين محركات البحث عندما تعامل العرض كقرار معماري لا كفكرة لاحقة. اختر SSR أو SSG لكل ما يحتاج إلى الترتيب، وحافظ على صدق الروابط والتوجيه، وأدر البيانات الوصفية لكل مسار، ودع أدوات Google نفسها، لا متصفحك، تخبرك بما عُرض فعلاً.
ملخص الذكاء الاصطناعي
خلاصة مكثفة لنسخة المتقدم:
- React ليست سيئة لـSEO، لكن CSR الافتراضي سيئ. تدعم المكتبة العرض العميل والخادمي والثابت والمتدفق؛ وسلسلة CRA/Vite الافتراضية من دون خادم هي التي ترسل غلاف
<div id="root">فارغاً وتبني DOM في المتصفح، فلا يحتوي HTML الخام على محتوى. - تستطيع Google عرض React عبر Web Rendering Service المبني على Chromium دائم التحديث، لكن العرض يدخل طابوراً منفصلاً وقد يتأخر وهو عديم الحالة، فلا يحتفظ بملفات تعريف الارتباط أو localStorage أو sessionStorage.
- فخ انتهاء مهلة العرض: إذا حمل المحتوى الرئيسي ببطء، تنتهي المهلة وتفهرس Google صفحة قالب مشترك فقط. تبدو عناوين URL متطابقة فتُعلم كمكررات. أصلح ذلك بتحميل المحتوى أولاً، أو الأفضل بعدم الاعتماد على خطوة العرض عبر SSR أو SSG.
- استراتيجيات العرض من الأفضل إلى الأسوأ: SSG الأقل مخاطرة، ثم SSR والعرض المسبق، ثم ISR أو الهجين، وأخيراً CSR الأعلى مخاطرة. والعرض الديناميكي متروك؛ توصي Google بـSSR أو العرض الثابت أو الإماهة.
- لا توجد مكافأة ترتيب لـSSR. قال Mueller: “no SEO ranking bonuses for implementing it one way or another.” (ترجمة) «لا توجد مكافآت ترتيب في SEO لاختيار طريقة تنفيذ دون أخرى». إنها تجعل المحتوى قابلاً للفهرسة بصورة موثوقة فحسب.
- الإماهة حد للخطأ لا تقنية: تستخدم تطبيقات SSR وSSG الدالة
hydrateRootلاcreateRoot، وتتوقع تطابق أول عرض للعميل مع الخادم. يحذر React من الاختلافات ولا يضمن تصحيحها؛ عاملها كأخطاء وقارن خرج الخادم بـDOM بعد الإماهة. - React Router: استخدم History API و
BrowserRouterلا توجيه التجزئة؛ يجب أن يدعم الخادم العناوين؛ ويعرض<Link>رابط<a href>قابلاً للزحف، بخلاف التنقل بـonClickفقط. - البيانات الوصفية: ينقل React 19 وسوم
<title>و<meta>و<link>أصلياً إلى<head>للاحتياجات الأساسية في التطبيقات المستقلة. في React 18 أو للاحتياجات المتقدمة، مثل سياق SSR وtitleTemplate، استخدم react-helmet-async، ولا تستخدم react-helmet الأصلي المتروك منذ 2020. وفي Next.js استخدم Metadata API بصرف النظر عن إصدار React. HTML أفضل من الحقن عبر JavaScript. - يختلف عرض زواحف الذكاء الاصطناعي حسب الموفّر. يعتمد React بنمط CSR على تنفيذ العميل الذي قد يدعمه الزاحف أو لا يدعمه. يضع SSR أو SSG المحتوى في HTML الأولي ويزيد التغطية.
- اختبر باستخدام View Source مقابل Inspect، وURL Inspection مع HTML المعروض ولقطة الشاشة ووحدة التحكم، وRich Results Test، وإعادة التحميل مع تعطيل JavaScript، وزاحف يعرض JavaScript.
- Next.js وRemix هما الحل العملي لأنهما ينقلان المحتوى إلى HTML الأولي.
الوثائق الرسمية
وثائق أولية من محركات البحث.
- Understand JavaScript SEO Basics — خط الزحف ← العرض ← الفهرسة، وتطبيقات SPA وHistory API وعناوين canonical عبر JavaScript ورموز HTTP ذات الدلالة.
- Fix Search-Related JavaScript Problems — معالجة soft 404 في SPA، والعارض عديم الحالة، والاختبار باستخدام URL Inspection.
- Dynamic Rendering (deprecated workaround) — لماذا أوقفته Google وما الذي ينبغي استخدامه بدلاً منه: SSR أو العرض الثابت أو الإماهة.
- Introducing a new JavaScript SEO video series — سلسلة Martin Splitt التي تغطي React وAngular وVue تحديداً.
- In-Depth Guide to How Google Search Works — موضع العرض في الزحف ← الفهرسة ← التقديم.
Bing / Microsoft
- برنامج Bingbot الجديد دائم التحديث (Microsoft Edge) — عرض Bingbot لـJavaScript عبر منصة Chromium نفسها المستخدمة في Googlebot.
- سلسلة bingbot: JavaScript والعرض الديناميكي والإخفاء — رأي Bing الأقدم من 2018، وهو مفيد للسياق التاريخي لتوصية العرض الديناميكي.
مرجع تقني
- React v19 (release notes) — دعم أصلي لعرض وسوم
<title>و<meta>و<link>في المكونات ونقلها تلقائياً إلى<head>. - createRoot / hydrateRoot — الفرق بين واجهة العرض العميلي والإماهة، والتحذير من عدم ضمان تصحيح عدم التطابق.
- react-helmet-async (npm) — الفرع المصان لإدارة
<head>في تطبيقات React المستقلة، مع React 18 أو احتياجات React 19 المتقدمة.
اقتباسات من المصدر
تصريحات مسجلة من فريق بحث Google. يقفز كل رابط لمحرك البحث إلى المقطع المقتبس في المصدر؛ أما تصريحات الموظفين فترتبط بالتغطية التي أعادت نشرها.
وثائق Google: تطبيقات SPA والعرض الديناميكي
- “Single-page applications (SPA) are websites that load an HTML document once and fetch any additional content using JavaScript APIs.” (ترجمة) «تطبيقات الصفحة الواحدة هي مواقع تحمل مستند HTML مرة واحدة وتجلب أي محتوى إضافي باستخدام واجهات JavaScript.» — وثائق Google Search Central. انتقل إلى الاقتباس
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (ترجمة) «كان العرض الديناميكي حلاً التفافياً لا حلاً طويل الأمد لمشكلات المحتوى المولد بـJavaScript في محركات البحث.» — وثائق Google Search Central. انتقل إلى الاقتباس
Martin Splitt، Google: كيف تُفهرس صفحات JavaScript
- “What we do is we do an HTTP request, and we get something back, right — some HTML, maybe it’s a barebone HTML and all it does is load the JavaScript and run the JavaScript. Then, this HTML that we got from the original HTTP GET request from the crawl, goes into rendering. Rendering runs JavaScript — boom!, a lot of content happens that wasn’t there before.” (ترجمة) «ما نفعله هو إرسال طلب HTTP وتلقي استجابة؛ قد تكون HTML أولية لا تفعل إلا تحميل JavaScript وتنفيذها. ثم ينتقل HTML الذي جلبه طلب HTTP GET الأصلي إلى مرحلة العرض؛ وهناك تعمل JavaScript فتظهر دفعة واحدة كمية كبيرة من المحتوى الذي لم يكن موجوداً من قبل.» اقرأ التغطية في Search Engine Journal
- عن عدم دقة نموذج الموجتين: “there’s no such thing as the second wave of crawling-ish. The wave is an oversimplification.” (ترجمة) «لا يوجد ما يسمى موجة ثانية شبيهة بالزحف؛ فالموجة تبسيط مفرط.» اقرأ التغطية في Search Engine Roundtable
Gary Illyes، Google: فخ انتهاء مهلة العرض والمحتوى المكرر
- “I have a bunch of emails in my inbox where the issue is that the centerpiece took forever to load, so rendering timed out (my most likely explanation) and we were left with a bunch of pages that only had the boilerplate. With only the boilerplate, those pages are dups.” (ترجمة) «توجد في صندوق بريدي رسائل عديدة كانت المشكلة فيها أن الجزء الأساسي طال تحميله جداً، ولذلك انتهت مهلة العرض، وهو تفسيري الأرجح، ولم يبق سوى صفحات فيها الهيكل العام. وعندما لا تحتوي الصفحات إلا على ذلك الهيكل تُعد نسخاً مكررة.»
- “Do you have a JavaScript-heavy site and you see lots of dups reported in Search Console? Try to restructure the js calls such that the content (including marginal boilerplate) loads first and see if that helps.” (ترجمة) «هل لديك موقع كثيف JavaScript وترى كثيراً من المكررات في Search Console؟ حاول إعادة هيكلة استدعاءات JavaScript بحيث يُحمّل المحتوى، بما فيه القالب الهامشي، أولاً وانظر هل يساعد ذلك.» اقرأ المنشور في LinkedIn
John Mueller، Google: لا مكافأة ترتيب لاختيار العرض
- “There are no SEO ranking bonuses for implementing it one way or another.” (ترجمة) «لا توجد مكافآت ترتيب في SEO لاختيار طريقة تنفيذ دون أخرى.» وهي “just different ways of making the content indexable (as is client side rendering).” (ترجمة) «مجرد طرق مختلفة لجعل المحتوى قابلاً للفهرسة، مثل العرض من جهة العميل.» اقرأ التغطية في Search Engine Roundtable
قائمة تحقق React SEO
مراجعة للتأكد من أن برامج الزحف تستطيع رؤية تطبيق React وفهرسته:
- يظهر المحتوى المهم في View Source، أي HTML الخام، لا في DOM المعروض فقط؛ وإلا فأنت تعتمد على CSR.
- تستخدم الصفحات التي تحتاج إلى الترتيب SSR أو SSG عبر Next.js أو Remix أو خطوة عرض مسبق، لا العرض الخام من جهة العميل.
- يحمل المحتوى الرئيسي سريعاً وأولاً، من دون سلاسل API بطيئة قد تحول انتهاء المهلة إلى صفحة قالب فقط.
- يستخدم التوجيه History API عبر
BrowserRouter، لاHashRouterأو عناوين#/. - يستطيع الخادم الاستجابة لكل مسار عميل، من دون 404 عند الدخول المباشر أو التحديث.
- يستخدم التنقل روابط
<a href>حقيقية عبر<Link>، لا معالجاتonClickفقط على<div>أو<button>. - يضبط كل مسار
<title>فريداً ووصفاً وcanonical ووسوم OG تتغير عند التنقل. - تناسب البيانات الوصفية الإصدار: وسوم React 19 الأصلية
<title>و<meta>و<link>للأساسيات، وreact-helmet-async مع React 18 أو الاحتياجات المتقدمة، وMetadata API في Next.js. لا تستخدمreact-helmetالمتروك. - إذا كان العرض خادمياً، تتم الإماهة بـ**
hydrateRoot** لاcreateRoot، ويُعامل تحذير عدم التطابق كخطأ ينبغي إصلاحه. - تعيد مسارات «غير موجود» العميلية رمز 404 حقيقياً أو
noindex، لا soft 404 بحالة200. - لا تُحظر JavaScript وCSS في
robots.txt، لأن Google لن تعرض الملفات المحظورة. - لا يعتمد محتوى حرج على ملفات تعريف الارتباط أو localStorage أو sessionStorage، فالعارض عديم الحالة.
- تم التحقق في URL Inspection من ظهور المحتوى الحقيقي في HTML المعروض ولقطة الشاشة.
- فُحص تقرير التغطية لحالة “Discovered, currently not indexed” (ترجمة) «تم اكتشاف الصفحة ولم تتم فهرستها حالياً»، ولمجموعات التكرار الناتجة عن فخ انتهاء المهلة.
النماذج الذهنية
1. السؤال الوحيد المهم: ما الموجود في HTML الخام؟ ما يظهر في View Source قبل JavaScript هو ما يراه زاحف الجلب الأول ومعظم زواحف الذكاء الاصطناعي. إذا لم يكن محتواك موجوداً فهذه مشكلة React SEO مهما بدت الصفحة جيدة في المتصفح.
2. العرض خطوة منفصلة قابلة للفشل. الزحف ← العرض ← الفهرسة. يضع CSR نسبة 100% من محتواك بعد خطوة العرض التي تدخل طابوراً وتتأخر وتكون عديمة الحالة وقد تنتهي مهلتها. ينقل SSR وSSG المحتوى قبل هذه الخطوة. لا تثق كثيراً بنموذج «الموجتين»؛ فقد سماه Splitt تبسيطاً مفرطاً.
3. وضع فشل تكرار القالب. محتوى بطيء + انتهاء مهلة العرض = كل عنوان URL يعرض الرأس والتنقل والتذييل فقط = ترى Google مكررات. الحل بنيوي: حمّل المحتوى أولاً أو توقف عن الاعتماد على خطوة العرض.
4. شجرة قرار العرض.
- محتوى عام يجب أن يرتب أو يُستشهد به في الذكاء الاصطناعي ← SSG للمحتوى الثابت أوSSR للحديث.
- محتوى ثابت غالباً، مثل المدونة والوثائق والتسويق ← SSG أو ISR بمؤقت.
- محتوى يتغير كثيراً ويجب أن يكون حديثاً ← SSR.
- لوحة تحكم مسجلة لا ينبغي فهرستها ← CSR مناسب.
- مشروع جديد يحتاج SEO ← استخدم Next.js أو Remix، لا العرض الديناميكي.
5. HTML أولاً وJavaScript ثانياً لكل إشارة SEO. ضع المحتوى والروابط وcanonical والعناوين والبيانات المنظمة في HTML المعروض على الخادم. تعامل مع الإشارات المحقونة عبر JavaScript، بما فيها canonical وreact-helmet في CSR، كحل احتياطي لا خطة؛ تراها Google متأخرة وقد لا تراها زواحف الذكاء الاصطناعي إطلاقاً.
ورقة React SEO المرجعية
أوضاع العرض بنظرة سريعة
| الوضع | هل المحتوى في HTML الأولي؟ | مخاطر SEO | الاستخدام |
|---|---|---|---|
| CSR، React خام | لا | الأعلى | لوحات تحكم مسجلة وتطبيقات غير مفهرسة |
| العرض المسبق عبر react-snap | نعم، في وقت البناء | منخفضة | مواقع صغيرة وثابتة غالباً |
| SSG | نعم، في وقت البناء | الأدنى | المدونات والوثائق والتسويق |
| SSR | نعم، لكل طلب | منخفضة | محتوى حديث وديناميكي |
| ISR أو الهجين في Next.js | نعم | منخفضة | محتوى ساعي أو يومي |
| العرض الديناميكي | للبوت فقط | متروك | لا تستخدمه؛ استخدم SSR أو SSG أو الإماهة |
أخطاء React SEO الشائعة وإصلاحاتها
| الخطأ | الإصلاح |
|---|---|
| المحتوى موجود في DOM المعروض فقط عبر CSR | SSR أو SSG أو العرض المسبق |
عناوين التجزئة /#/path | History API عبر BrowserRouter |
تنقل onClick من دون رابط | <a href> حقيقي أو <Link> من React Router |
| وسوم meta لا تتغير مع المسار | React 19: <title> و<meta> و<link> أصلية. للأقدم أو المتقدم: react-helmet-async. وفي Next.js: Metadata API |
react-helmet الأصلي مع أي إصدار | انتقل إلى react-helmet-async أووسوم React 19 الأصلية |
استخدام createRoot على HTML معروض خادمياً | استخدم hydrateRoot، لأن createRoot يتخلص من ترميز الخادم |
| إخفاء تحذير عدم تطابق الإماهة | عامله كخطأ وأصلح فرق الخادم والعميل |
| محتوى بطيء ← انتهاء المهلة ← مكررات | حمّل المحتوى أولاً وانتقل إلى SSR أو SSG |
صفحة 404 عميلية تعيد 200 | أعد 404 حقيقياً أو noindex |
حظر .js أو .css في robots.txt | اسمح بها، فلن تعرض Google الملفات المحظورة |
| محتوى محجوب بحالة العميل | لا تفعل؛ فالعارض عديم الحالة |
قواعد سريعة
- العارض Chromium دائم التحديث، يدخل طابوراً، وهو عديم الحالة وتنتهي مهلته.
- لا توجد مكافأة ترتيب لـSSR؛ القضية موثوقية الفهرسة.
- يختلف عرض زواحف الذكاء الاصطناعي حسب الموفّر؛ HTML الخام هو خط أساس التغطية الأكثر أماناً.
- استخدم Metadata API في Next.js، لا React Helmet.
- يعرض Bing JavaScript عبر Edge لكن بدرجة أقل موثوقية؛ SSR أوSSG أكثر أماناً.
افحص ما يرسله الخادم قبل تشغيل React
ضع المسارات القابلة للفهرسة والممثلة في urls.txt. يكشف هذا أغلفة CSR وغياب ترميز head المعروض على الخادم من الاستجابة الخام:
while IFS= read -r url; do
html=$(mktemp)
status=$(curl -sS -o "$html" -w '%{http_code}' "$url")
bytes=$(wc -c < "$html" | tr -d ' ')
title_count=$(grep -Eio '<title>[^<]*</title>' "$html" | wc -l | tr -d ' ')
canonical_count=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$html" | wc -l | tr -d ' ')
printf '%s\t%s\tbytes=%s\ttitles=%s\tcanonicals=%s\n' "$status" "$url" "$bytes" "$title_count" "$canonical_count"
rm -f "$html"
done < urls.txtصغر عدد البايتات مجرد إشارة للمراجعة، لا خطأ بحد ذاته. قارن الاستجابات الخام المعلّمة بـHTML المعروض وتأكد من وجود النص الأساسي والروابط القابلة للزحف.
أدوات تدقيق React SEO
- View Source مقابل Inspect Element — أسرع فحص أولي. View Source هو HTML الخام قبل JavaScript، وInspect Element هو DOM المعروض. المحتوى الموجود في Inspect لا Source يعتمد على JavaScript.
- URL Inspection في Google Search Console — مصدر الحقيقة. شغّل اختباراً مباشراً ثم افحص HTML المعروض ولقطة الشاشة وموارد الصفحة وما حُمّل أو حُظر ورسائل وحدة التحكم لترى ما عرضته Google.
- Rich Results Test — فحص سريع لـHTML المعروض والبيانات المنظمة لعنوان واحد من دون التحقق من الموقع.
- Chrome DevTools: تعطيل JavaScript عبر Command Menu ثم إعادة التحميل لفحص ما يحصل عليه جالب HTML فقط. هذا فحص تغطية لا دليلاً على سلوك زاحف ذكاء اصطناعي بعينه.
- تقرير التغطية في Search Console — راقب “Discovered, currently not indexed” (ترجمة) «تم اكتشاف الصفحة ولم تتم فهرستها حالياً» وتراكم العرض ومجموعات التكرار الناتجة عن فخ القالب.
- زواحف تعرض JavaScript — ينفذ Ahrefs Site Audit وScreaming Frog SEO Spider في وضع JavaScript الشفرة لتستطيع مقارنة HTML الخام بالمعروض عبر الموقع.
أخطاء ترتكبها فرق React فعلياً
أنماط عملية أراها باستمرار في تطبيقات React بنمط CSR التي تُنشر، لا حالات افتراضية. كل منها خطوة وقائية ينبغي اكتشافها قبل أن تكلفك الفهرسة.
نشر CRA أو Vite بنمط CSR الخام لصفحات تحتاج إلى الترتيب
تنشر الفرق Create React App أو Vite + React مباشرة في الإنتاج لصفحات التسويق أو المدونات أو المنتجات، وهي نفسها التي تحتاج إلى الظهور في البحث. لماذا هذا خطأ: يرسل الخادم غلاف <div id="root"> شبه فارغ ولا يوجد المحتوى إلا بعد JavaScript، فيتأخر في طابور Google وقد يكون غير مرئي لأي زاحف ذكاء اصطناعي يجلب HTML الأولي من دون تنفيذ العميل. ما الذي تفعله بدلاً منه: انقل كل ما يحتاج إلى الترتيب أو الاستشهاد إلى SSR أو SSG عبر Next.js أو Remix، واقصر CSR الخام على الأسطح المسجلة غير المفهرسة مثل لوحات التحكم.
التوجيه عبر عناوين التجزئة باستخدام HashRouter
تلجأ الفرق إلى HashRouter لأنه الأسهل، فلا يحتاج إلى ضبط الخادم ويعمل على أي استضافة ثابتة. لماذا هذا خطأ: لا تستطيع Google حل عناوين مثل /#/products بصورة موثوقة، وقد أُلغي مخطط زحف AJAX القديم الذي جعل الأجزاء قابلة للزحف. ما الذي تفعله بدلاً منه: استخدم BrowserRouter وHistory API، وتأكد من استجابة الخادم لكل مسار، بما في ذلك الوصول المباشر أو تحديث رابط عميق.
بناء التنقل على onClick بدلاً من الروابط الحقيقية
تُربط معالجات onClick بعناصر <div> أو <button>، غالباً لسهولة التنسيق أو تجنب سلوك الرابط الافتراضي. لماذا هذا خطأ: تتبع Google روابط <a href> الحقيقية فقط؛ وعنصر <div> ذو معالج نقر غير مرئي للزحف مهما عمل جيداً للفأرة. ما الذي تفعله بدلاً منه: استخدم <Link> من React Router، الذي يعرض <a href> حقيقياً، أو رابطاً عادياً للتنقل الخارجي.
تحميل المحتوى الرئيسي خلف سلسلة API بطيئة
يُحمّل الرأس والتنقل سريعاً ثم تُسلسل طلبات API قبل ظهور محتوى الصفحة الفعلي الذي يميز كل عنوان. لماذا هذا خطأ: يفرض WRS مهلة؛ وإذا حمل المحتوى المركزي ببطء ينتهي العرض قبله، فلا تفهرس Google إلا صفحات القالب المشترك وتعلمها مكررة، وهو وضع الفشل الذي وصفه Gary Illyes. ما الذي تفعله بدلاً منه: أعد هيكلة الطلبات لتحميل المحتوى أولاً أو أزل الاعتماد على عرض العميل باستخدام SSR أو SSG.
الاستمرار في استخدام react-helmet الأصلي
تستخدم الفرق react-helmet لعناوين ووسوم meta لكل مسار لأن الدروس القديمة توصي به. لماذا هذا خطأ: الحزمة الأصلية متروكة، ولم تُحدّث منذ 2020، ولها مشكلات مع العرض المتزامن وSSR في React 18. ما الذي تفعله بدلاً منه: في React 19 اعرض <title> و<meta> و<link> مباشرة ودع React ينقلها، وفي React 18 أو للاحتياجات المتقدمة مثل titleTemplate استخدم react-helmet-async المصان. وفي Next.js استخدم Metadata API ولا تضف Helmet.
حظر JavaScript أوCSS في robots.txt
تُحظر /static/js/ أو مجلد أصول أداة البناء في robots.txt بسبب اهتمام قديم بميزانية الزحف أو إعداد منسوخ. لماذا هذا خطأ: لا تستطيع Google عرض ما لا يسمح لها بجلبه؛ فالحزمة المحظورة تجعل WRS يبني DOM ناقصاً أوفارغاً رغم صحة الشفرة. ما الذي تفعله بدلاً منه: اسمح للزواحف بجلب JavaScript وCSS، وتأكد عبر فحص موارد الصفحة في URL Inspection من عدم حظر شيء حرج.
اختبر نفسك: React SEO
خمسة أسئلة سريعة عن جعل تطبيقات React قابلة للزحف والفهرسة. اختر إجابة لكل سؤال ثم تحقق.
موارد تستحق وقتك
كتاباتي ذات الصلة
- React SEO: Best Practices to Make It SEO-Friendly (Ahrefs) — دليل React SEO في Ahrefs الذي راجعته؛ وهذه المقالة معالجة أعمق مرتبطة بالمصادر.
- JavaScript SEO: A Definitive Guide (Ahrefs) — دليلي الكامل للآليات الأساسية: تكافؤ DOM وقاعدة التوجيه الأكثر تقييداً والتعامل مع canonical وmeta وخيارات العرض.
- The Beginner’s Guide to Technical SEO (Ahrefs) — موضع React وJavaScript SEO في الصورة الأوسع.
محاضراتي
- How Search Works (SlideShare) — شرحي للزحف والعرض والفهرسة والترتيب. وينطبق تنبيهي المعتاد: “This is my understanding of systems… not going to be 100% complete or accurate.” (ترجمة) «هذا فهمي للأنظمة، ولن يكون كاملاً أو دقيقاً بنسبة 100%.»
من أنحاء القطاع
- Understand JavaScript SEO Basics (Google) — وثائق أولية عن SPA وHistory API والتعامل مع canonical ورموز الحالة.
- Dynamic Rendering (deprecated) (Google) — لماذا العرض الديناميكي حل التفافي لا طويل الأمد.
- Martin Splitt يشرح كيفية فهرسة مواقع JavaScript (Search Engine Journal) — شرح HTML الأساسي ثم «الطفرة» في تدفق الزحف ← العرض ← الفهرسة.
- Gary Illyes عن المواقع كثيفة JavaScript والمحتوى المكرر (LinkedIn) — وضع الفشل من انتهاء المهلة إلى المكررات بصياغته.
- How to fix technical SEO issues on client-side React apps (Search Engine Land) — دراسة حالة عملية لتدقيق وإصلاح تطبيق React بنمط CSR.
- SSR vs. dynamic rendering — no ranking difference (Search Engine Roundtable) — تصريح Mueller بعدم وجود مكافآت ترتيب.
- react-helmet-async (npm) — مكتبة إدارة head المصانة لتطبيقات React المستقلة.
- برنامج Bingbot الجديد دائم التحديث (Microsoft Edge) (Bing) — عرض Bingbot لـJavaScript عبر Chromium مثل Googlebot.
مقاطع فيديو
- Google Search Central: سلسلة JavaScript SEO في YouTube — تغطي سلسلة Martin Splitt الرسمية تحسين محركات البحث لـReact وAngular وVue، وتشرح الزحف ← العرض ← الفهرسة والإصلاحات الشائعة. إعلان السلسلة · القناة
سجل التغييرات
تم التحديث في 11 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 18 يوليو 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.