نشر SvelteKit وتحسين محركات البحث: المحولات، والعرض المسبق، والعرض عند الحافة
تحدد إعدادات المحول والعرض المسبق لكل مسار في SvelteKit أين ومتى تُعرض صفحاتك — وهذا يؤثر على TTFB وLCP وميزانية الزحف. دليل معمق يركز على النشر: اختيار adapter-static/node/vercel/cloudflare/netlify، وprerender = true/false/'auto'، وقيود وقت التشغيل عند الحافة، وبناء sitemap.xml وrobots.txt.
اللغات
إعداد المحول والعرض المسبق لكل مسار في SvelteKit يحدد أين ومتى تُعرض الصفحة — HTML ثابت في وقت البناء، أو SSR على خادم، أو SSR عند الحافة — وهذا القرار يؤثر في TTFB، الذي يؤثر بدوره في LCP وسعة الزحف. اختر adapter-static للمواقع ذات المحتوى الخالص، ومحول node/vercel/cloudflare مع عرض مسبق لكل مسار للمواقع المختلطة (محتوى وتطبيق)، ومحول حافة عندما يكون TTFB العالمي مهمًا (مع قبول البدايات الباردة وعدم وجود نظام ملفات Node). prerender = 'auto' هو أداة المواقع المختلطة. لا يمكن لبيئات التشغيل عند الحافة قراءة نظام الملفات. ولا ينشئ SvelteKit sitemap.xml أو robots.txt — بل تبنيهما كنقطتي نهاية +server.js، وفق استراتيجية تعتمد على المحول الخاص بك.
الخلاصة — يعرض SvelteKit صفحاتك على الخادم بالفعل، لذا فهذا الجزء محسوم. تتناول هذه الصفحة القرار التالي: كيف يُبنى موقعك ويُنشر. يجهز المُكيّف (adapter) تطبيق SvelteKit لمضيف معين، سواء أكان مضيف ملفات ثابتة أم خادم Node أم خدمة مثل Vercel أو Cloudflare. ويحدد إعداد prerender لكل صفحة ما إذا كانت ستتحول مسبقاً إلى ملف HTML عادي أم ستُعرض من جديد عند كل زيارة. ويقرر هذان الخياران سرعة حصول برامج الزحف على HTML. كما أن SvelteKit لا ينشئ خريطة الموقع أو
robots.txt، لذا عليك إضافتهما بنفسك.
ما هو المُكيّف (adapter) بعبارات بسيطة
إذا كنت قد بنيت موقع SvelteKit من قبل، فأنت تعلم أنه يرسل HTML حقيقيًا إلى المتصفح — المحتوى موجود قبل تشغيل أي JavaScript. جيد. هذه هي مشكلة تحسين محركات البحث (SEO) الصعبة التي تم حلها بالفعل (وإذا لم تكن قد حُلّت لك بعد، فإن مقالة أساسيات SvelteKit في هذا القسم نفسه تغطي أوضاع العرض وفخ “الصفحة الفارغة” الذي تريد تجنبه أولاً).
المُكيّف (adapter) هو الإضافة الصغيرة التي تأخذ بناء SvelteKit النهائي وتحوله إلى شيء يمكن لمضيف معين تشغيله. Evidence for this claim SvelteKit adapters transform a built application for deployment to a particular environment. Scope: SvelteKit adapters. Confidence: high · Verified: SvelteKit: Adapters نفس الموقع، حزمة مختلفة:
adapter-staticيحول كل صفحة إلى ملف HTML عادي، يُبنى مرة واحدة. رائع للمدونات أو المستندات أو مواقع التسويق التي لا تتغير حسب الزائر.adapter-nodeيغلّف تطبيقك في خادم Node.js تديره بنفسك.adapter-vercel,adapter-netlify,adapter-cloudflareيحزمونه لخدمات الاستضافة تلك، والتي تعرض الصفحات عند الطلب — أحيانًا على خوادم “عند الحافة” (at the edge)، قريبة فعليًا من زوارك.
المحتوى متطابق في جميع الحالات. ما يتغير هو متى يتم إنشاء HTML (مسبقًا، أو عند كل طلب) وأين (خادم واحد، أو شبكة عالمية).
لماذا هذا قرار تحسين محركات البحث (SEO)، وليس مجرد قرار تقني
الشيء الرئيسي: السرعة. الصفحة التي هي بالفعل ملف ثابت تُحمَّل بشكل شبه فوري. الصفحة التي يجب بناؤها على الخادم تستغرق لحظة. وقد صرّحت Google بوضوح أنه إذا كان موقعك “responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down… the limit goes down and Google crawls less.” (ترجمة) «يستجيب بسرعة لفترة من الوقت، يرتفع الحد، مما يعني إمكانية استخدام المزيد من الاتصالات للزحف. إذا تباطأ الموقع… ينخفض الحد ويزحف Google بشكل أقل.» لذا فإن النشر البطيء لا يزعج المستخدمين فحسب — بل قد يعني أن Google يقرأ أجزاء أقل من موقعك.
النسخة البسيطة من القرار
- موقع محتوى (مدونة، مستندات، تسويق) → استخدم
adapter-staticوقم بعرض (prerender) كل شيء مسبقًا. وهو الخيار الأسرع والأقل عرضة للأعطال. - موقع محتوى مع بعض الأجزاء الديناميكية (بحث، تعليقات) → استخدم مُكيّف
خادم (
node/vercel/cloudflare) وعلّم صفحات المحتوى الخاصة بكprerender = true، تاركًا الأجزاء الديناميكية لتُعرض عند الطلب. - تطبيق أو لوحة تحكم تحتوي على صفحات مخصصة للمستخدمين المسجلين → اعرض على الخادم (SSR)، واعرض (prerender) صفحات التسويق العامة مسبقًا فقط.
لا تنسَ الملفين اللذين لن ينشئهما SvelteKit لك
SvelteKit لا ينشئ sitemap.xml أو robots.txt تلقائيًا. تقوم أنت
بإضافتهما بنفسك — عادةً كملف نقطة نهاية صغير (sitemap.xml/+server.js)
وإما ملف في مجلد static/ الخاص بك أو نقطة نهاية أخرى لملف
robots.txt. Evidence for this claim SvelteKit can serve static assets from its static directory and create custom responses with +server route files. Scope: Mechanisms for robots.txt and sitemap.xml; files are not generated automatically. Confidence: high · Verified: SvelteKit: Project structure SvelteKit: Routing من السهل نسيانهما لأن معظم الأطر التي تعرض HTML لك
تشعر بأنها “مكتملة”. هذان الملفان ليسا كذلك.
تريد النسخة الأعمق — ماذا يفعل كل مُكيّف بالعرض، وكيف يتعامل
prerender = 'auto' مع موقع مختلط، ولماذا لا تستطيع دوال الحافة (edge functions)
قراءة الملفات، وكيف تتغير استراتيجية sitemap مع المُكيّف الخاص بك؟ انتقل إلى
التبويب متقدم.
TL;DR — لا يغيّر المُكيّف ماذا يقدّم SvelteKit — بل يغيّر أين ومتى: وقت البناء ثابت (
adapter-static)، وقت الطلب على خادم تشغّله (adapter-node)، أو وقت الطلب على دوال serverless/edge (adapter-vercel/-netlify/-cloudflare).prerender = trueلكل مسار يبني HTML ثابتًا ويُسقط المسار من قائمة التشغيل الديناميكية؛prerender = 'auto'يبني مسبقًا ويُبقي المسار في القائمة — الأداة المناسبة لمواقع/blog/[slug]المختلطة. تعمل بيئات edge على عوازل V8: لا يوجد Nodefs، والبدء البارد يضرّ بـ TTFB، مما يغذّي LCP و(وفقًا لوثيقة ميزانية الزحف من Google) سعة الزحف. لا يولّد SvelteKit أي sitemap.xml أو robots.txt — ابنِها كنقاط نهاية+server.js، ولاحظ أن الاستراتيجية تعتمد على المُكيّف. هذا دليل أضيق ومركّز على النشر، مكمّل لمقالة أساسيات SEO في SvelteKit في هذا القسم؛ أفترض أنك تعرف بالفعل أن SvelteKit يستخدم SSR افتراضيًا ولن أعيد مناقشة ذلك هنا.
الفكرة الواحدة التي تجعل كل هذا واضحًا
لا يغيّر المُكيّف ماذا يُقدَّم. بل يغيّر أين ومتى.
هذا هو كل شيء. توثيق SvelteKit يوضح ذلك بدقة: المُكيّفات “تأخذ التطبيق المبني
كمدخل وتولّد مخرجات للنشر.” Evidence for this claim SvelteKit adapters take the built application as input and generate deployment-specific output. Scope: Deployment output; adapter choice can still constrain supported runtime features. Confidence: high · Verified: SvelteKit: Adapters مكوّناتك، ودوال
load الخاصة بك، وبيانات <svelte:head> الوصفية — متطابقة عبر كل مُكيّف.
ما يختلف هو:
- متى يُنتَج HTML: في وقت البناء (ثابت/مُبنى مسبقًا) أو في وقت الطلب (SSR على خادم، أو دالة serverless، أو دالة edge).
- أين يُنتَج: على خادم أصلي واحد، أو على دالة serverless إقليمية، أو على شبكة edge قريبة من الزائر.
كل ما يلي هو نتيجة لهذين المحورين.
لماذا خيارات النشر هي خيارات SEO
السلسلة قصيرة وموثقة جيدًا: TTFB → LCP → سعة الزحف.
الوقت حتى أول بايت هو المدة التي يستغرقها المضيف لبدء إرسال الاستجابة. ملف مُبنى مسبقًا يُقدَّم من ذاكرة تخزين مؤقت CDN لديه TTFB قريب من الصفر. خادم يجب أن يقدّم الصفحة لديه TTFB أعلى. دالة serverless أو edge تبدأ باردًا يمكن أن يكون لديها TTFB أعلى بكثير عند أول زيارة. TTFB هو مدخل مباشر لـ Largest Contentful Paint — لا يمكنك رسم ما لم تستلمه — وLCP هو إشارة Core Web Vitals.
جانب الزحف هو حيث تكون Google الأكثر وضوحًا. من وثائق ميزانية الزحف: “إذا استجاب الموقع بسرعة لفترة، يرتفع الحد، مما يعني أنه يمكن استخدام المزيد من الاتصالات للزحف. إذا تباطأ الموقع أو استجاب بأخطاء خادم، ينخفض الحد وتزحف Google أقل.” وسطر أفضل الممارسات: “اجعل صفحاتك فعالة في التحميل. إذا كان بإمكان Google تحميل وعرض صفحاتك بشكل أسرع، فقد نتمكن من قراءة المزيد من المحتوى من موقعك.” دالة edge تبدأ باردًا وتستجيب ببطء تخضع لنفس الديناميكية كخادم أصلي بطيء.
ملاحظة صراحة في البداية: لا تنشر Google أي إرشادات خاصة بـ SvelteKit.
لا توجد وثيقة أو حلقة Search Off the Record تذكر مُكيّفات SvelteKit،
أو prerender = 'auto'، أو بدايات edge الباردة. ما أفعله هنا هو تطبيق
إرشادات Google العامة حول العرض وميزانية الزحف على آليات SvelteKit المحددة —
وليس اقتباس ممثل علّق على SvelteKit، لأنه لا يوجد. إطار Google الذي يقول
“الخادم أو العرض المسبق لا يزال فكرة رائعة لأنه يجعل موقعك أسرع للمستخدمين
والزاحفين، وليس كل الروبوتات يمكنها تشغيل JavaScript” هو أقرب مرساة رسمية،
وهو مستقل عن الإطار.
اختيار مُكيّف لنتائج SEO
adapter-auto — الافتراضي بدون إعداد، وسقفه
مشاريع SvelteKit الجديدة تأتي مع adapter-auto. يكتشف المنصة —
Vercel، Netlify، Cloudflare Pages، Azure، AWS — ويقوم بتثبيت المحول المطابق
في وقت البناء. إنها نقطة بداية جيدة، لكن هناك سقف صلب يستحق
المعرفة: adapter-auto لا يقبل أي خيارات. في اللحظة التي تحتاج فيها
{ edge: true }، أو ربطات Cloudflare، أو Vercel ISR، أو أي إعداد خاص بالمنصة،
تقوم بتثبيت المحول الأساسي (adapter-vercel،
adapter-cloudflare، إلخ) مباشرة. تعامل مع auto كسقالة، وليس قرارًا للإنتاج.
adapter-static — SSG كامل، للمواقع التي تركز على المحتوى
adapter-static يقوم بإنشاء موقعك بالكامل كملفات ثابتة في وقت البناء. لا
يعمل خادم؛ يستضيف المضيف HTML مسطحًا. Evidence for this claim adapter-static prerenders a SvelteKit site as static files. Scope: Routes must be prerenderable; performance outcomes depend on hosting and page design. Confidence: high · Verified: SvelteKit: Static site generation بالنسبة لموقع يركز على المحتوى، هذا هو
أقوى ملف تعريف SEO يمكن أن تحصل عليه — أقل TTFB، لا بدء بارد، لا شيء
ينهار. الشرط الوحيد هو الفخ الذي تم تغطيته بالتفصيل في مقالة الأساسيات:
يجب أن يظل SSR مفعلًا أثناء البناء، أو ستحصل على قوالب فارغة بدلاً من
HTML المعروض. لن أشرح ذلك مرة أخرى هنا سوى بالإشارة إليه.
العيب هو الجمود. أي شيء يحتاج حقًا إلى منطق خادم لكل طلب (بحث حقيقي، محتوى مخصص لكل مستخدم، معالجة نماذج بدون نقطة نهاية طرف ثالث) لا يمكن أن يعيش على بناء ثابت بحت — وهذا بالضبط ما صُممت المحولات التالية من أجله.
adapter-node — خادم تتحكم فيه
adapter-node ينتج خادم Node.js مستقلًا. تقوم بتشغيله، وتوسيعه، وتمتلك
TTFB. هذا هو الخيار الأكثر مرونة والأقل مفاجآت في وقت التشغيل —
واجهات برمجة تطبيقات Node كاملة، بما في ذلك fs. إنه مناسب عندما يكون لديك
بنية تحتية بالفعل، أو تحتاج إلى مكتبات Node لا يمكن لبيئات الحافة تشغيلها، أو تريد
أوقات استجابة متوقعة (غير باردة البدء) من خادم دافئ. المقايضة هي
تشغيلية: أنت تدير خادمًا، وسرعته ووقت تشغيله أصبحا الآن سعة الزحف الخاصة بك.
adapter-vercel — serverless، edge، وISR
adapter-vercel ينشر إلى دوال serverless الخاصة بـ Vercel افتراضيًا، مع عدة
روافع متعلقة بـ SEO تُضبط لكل مسار عبر export const config:
runtime: 'edge'ينقل هذا المسار إلى بيئة edge الخاصة بـ Vercel (المزيد أدناه).regionsيتحكم في مكان تشغيل دوال serverless — الأقرب إلى مستخدميك (أو قاعدة بياناتك) يعني زمن استجابة أقل.isrيتيح إعادة التوليد الثابتة المتزايدة:isr: { expiration: 60 }يقدم أصلًا ثابتًا مخزنًا مؤقتًا ويعيد توليده بعد النافذة، مما يعطي “مزايا الأداء والتكلفة للمحتوى المعالج مسبقًا مع مرونة المحتوى المعروض ديناميكيًا.” ISR هو مسار رابع حقيقي بين الثابت الخالص وSSR الخالص — لكن لاحظ تحذير الوثائق نفسه: “استخدام ISR على مسار معexport const prerender = trueلن يكون له أي تأثير، لأن المسار يُعالج مسبقًا في وقت البناء.” ISR وprerender هما بديلان، وليسا قابلين للتكديس.
adapter-cloudflare — Workers/Pages، edge عالمي
adapter-cloudflare يستهدف Cloudflare Workers وPages — SSR على شبكة edge
عالمية، غالبًا أقل TTFB لجمهور موزع جغرافيًا. القيد المهم
هو بيئة التشغيل: Workers تعمل على V8 isolates، وليس Node. من الوثائق:
“لا يمكنك استخدام fs في Cloudflare Workers.” بعض واجهات برمجة تطبيقات Node تعمل فقط خلف
علامة التوافق nodejs_compat، وحتى ذلك الحين الدعم ليس واحدًا لواحد. إذا كنت
تقرأ ملفات في وقت الطلب (خريطة إعادة توجيه، ملف بيانات، مدخلات صور OG مخصصة)،
فأن هذا الكود يحتاج إلى إعادة تفكير — مغطى في قسم edge أدناه.
(المحول الأقدم adapter-cloudflare-workers مهمل؛ المشاريع الجديدة تستخدم
adapter-cloudflare، الذي يتعامل مع كل من Workers وPages. إذا كنت على القديم،
فالترحيل هو المسار الموصى به.)
adapter-netlify — دوال أو دوال Edge (Deno)
adapter-netlify ينشر إلى وظائف Netlify القائمة على Node افتراضيًا، أو إلى
Edge Functions القائمة على Deno مع edge: true. نفس الشكل مثل Vercel: افتراضيًا
serverless مع خيار edge اختياري. ملاحظة واحدة خاصة بـ SvelteKit — نماذج Netlify
tتتطلب أن تكون صفحة النموذج مُسبقة التوليد حتى يتمكن Netlify من اكتشاف ترميز النموذج
في وقت النشر، وهو متطلب صغير “prerender هذا المسار” يُضاف فوق
اختيار المحول.
القرار، في سطر واحد لكل منها
- موقع محتوى خالص →
adapter-static، قم بتوليد كل شيء مسبقًا. - موقع محتوى مع جيوب ديناميكية →
adapter-node/-vercel/-cloudflare،prerender = trueعلى المحتوى،false/'auto'على المسارات الديناميكية. - تطبيق/لوحة تحكم مع تخصيص → SSR أولاً (node أو edge)، قم بتوليد مسبقًا فقط الهيكل الثابت (التسويق، تسجيل الدخول).
- جمهور عالمي حساس لـ TTFB → محول edge للمسارات الديناميكية، مع قبول قيود Node-API وواقع البرد البارد.
(تبويب شجرة القرار يعرض هذا كتدفق متفرع.)
استراتيجية التوليد المسبق للمواقع المختلطة
ما يفعله true / false / 'auto' فعليًا
export const prerender هو خيار صفحة لكل مسار (أو لكل تخطيط)، والقيم الثلاث
ليست مجرد تشغيل/إيقاف:
true— قم ببناء هذا المسار إلى HTML ثابت في وقت البناء. الأهم، أنه “مستبعد من المانيفستات المستخدمة لـ SSR الديناميكي، مما يجعل خادمك (أو وظائف serverless/edge) أصغر.” بمجرد توليده مسبقًا، لا يمكن للمسار أن يتراجع إلى العرض الديناميكي — إنه ثابت، نقطة.false— اعرض دائمًا عند الطلب. لا ملف ثابت.'auto'— أداة الموقع المختلط. يقوم بتوليد المسار مسبقًا ويبقيه في مانيفست الخادم الديناميكي، بحيث يمكن تقديم نفس المسار بشكل ثابت للمسارات المعروفة وعرضه من الخادم للباقي. هذا مبني بالضبط للحالة التي تصفها الوثائق: مسار مثل/blog/[slug]“حيث تريد توليد المحتوى الأحدث/الأكثر شعبية مسبقًا ولكن عرض الذيل الطويل من الخادم.”
لأن المسارات المولدة مسبقًا تقلل حزمة الخادم، موقع مُولد مسبقًا في الغالب
مع عدد قليل من مسارات 'auto'/false ينشر وظيفة أصغر وأرخص وأسرع —
كفاءة ربح مستقلة عن SEO.
المسارات الديناميكية تحتاج إلى دالة entries
يزحف مولّد prerender على الصفحات باتباع روابط <a> من نقاط الدخول الخاصة بك.
هذا يعمل للمسارات الثابتة، لكن المسار الديناميكي مثل /blog/[slug] ليس له
URL ثابت ليجده الزاحف. إذا لم يرتبط أي شيء بمعرف slug معين، لن يعرف SvelteKit
بوجوده — وستواجه خطأ البناء الكلاسيكي أن المسارات “تم وضع علامة عليها
كقابلة للتوليد المسبق، ولكن لم يتم توليدها مسبقًا.”
الحل هو دالة entries صريحة (أو config.kit.prerender.entries) التي
تعدّد قيم المعاملات:
// src/routes/blog/[slug]/+page.server.js
export const prerender = true;
export function entries() {
return [
{ slug: 'hello-world' },
{ slug: 'sveltekit-deployment-seo' },
];
}في الممارسة العملية، تولّد هذه القائمة من CMS أو دليل المحتوى الخاص بك. بدونها، يغطي التوليد المسبق فقط المعرّفات التي يجدها زاحف الروابط بالصدفة.
نمط /blog/[slug] في الواقع
اجمع الاثنين معًا وستحصل على الإعداد المختلط القياسي: prerender = 'auto' بالإضافة إلى دالة entries التي ترجع منشوراتك الأحدث والأكثر شعبية.
تلك تحصل على HTML ثابت في وقت البناء؛ أي شيء ليس في القائمة يتراجع إلى SSR
عند الطلب. المنشورات الجديدة تُعرض ديناميكيًا حتى يقوم البناء التالي بتوليدها مسبقًا. إنها
الوسط العملي بين “توليد جميع المنشورات الأربعين ألفًا مسبقًا في كل بناء” و
“عرض كل منشور في كل طلب.”
قيود بيئة التشغيل Edge التي تؤثر على SEO
config.runtime = 'edge' لكل مسار (على Vercel)
Edge ليس مفتاحًا شاملًا أو لا شيء. على Vercel هو خيار صفحة لكل مسار:
// +page.server.js or +server.js
export const config = { runtime: 'edge' };هذا يعني أنه يمكنك دفع المسارات عالية الحركة والقابلة للتخزين المؤقت إلى edge لـ TTFB منخفض بينما تبقى المسارات المعتمدة على Node على بيئة التشغيل القياسية serverless (Node) في نفس النشر. اخلط عمدًا.
لا fs، لا واجهات برمجة تطبيقات Node عشوائية
بيئات الحافة — Cloudflare Workers، وVercel Edge Functions، وNetlify’s Deno Edge
Functions — لا توفر fs الخاصة بـ Node. توثيق Cloudflare: “You can’t use fs in
Cloudflare Workers.” توثيق Vercel: “You can’t use fs in edge functions.” كلاهما
يشير إلى نفس المخرجين: استخدم مساعد read من $app/server للوصول إلى
الأصول المجمعة، أو “prerender the routes in question” بحيث يحدث الوصول إلى الملفات
في وقت البناء بدلاً من وقت الطلب.
الحالات المرتبطة بـ SEO حيث يكون هذا مؤثرًا: توليد صور OG ديناميكية تقرأ ملف خط أو
قالب، أو خرائط إعادة توجيه مبنية على ملفات، أو نقطة نهاية sitemap تقرأ محتوى من
القرص. أي من هذه إما ينتقل إلى read() من $app/server أو ينتقل إلى وقت
البناء/الترحيل المسبق. إنه ليس عائقًا — إنه قيد “اعرف قبل أن تختار الحافة”.
البدايات الباردة وTTFB — متى تساعد الحافة ومتى لا
وظائف الحافة لا تزال تبدأ ببرودة. وظيفة حافة باردة عند أول طلب يمكن أن تكون أبطأ من خادم Node دافئ، وأبطأ بشكل كبير من ملف مُرحَّل مسبقًا يُقدَّم من الذاكرة المؤقتة. تفوز الحافة عندما تبقى الوظيفة دافئة أو عندما تقترن بتخزين مؤقت عدواني بحيث لا تصل معظم الطلبات إلى الوظيفة على الإطلاق. إنها ليست تلقائيًا الخيار الأسرع — “النشر على الحافة” ليس مرادفًا لـ “أسرع”. لموقع محتوى، الإخراج الثابت المُرحَّل مسبقًا يتفوق على SSR الحافة في TTFB في كل مرة، لأنه لا توجد وظيفة لبدء تشغيلها.
توليد sitemap.xml و robots.txt (SvelteKit لن يفعل)
هذه هي الفجوة التي تتجاهلها معظم دروس SvelteKit وتكتشفها معظم عمليات التدقيق. SvelteKit يولد لا sitemap.xml و لا robots.txt تلقائيًا — بغض النظر عن المحول، بغض النظر عن عدد الصفحات التي تقوم بترحيلها مسبقًا. موقع ثابت بالكامل يحتوي على آلاف الصفحات المُرحَّلة مسبقًا لا يزال يُقدَّم بدون sitemap ما لم تقم ببنائه.
نمط نقطة نهاية +server.js
الطريقة الاصطلاحية لـ sitemap هي نقطة نهاية مسار تُرجع XML مع Content-Type
الصحيح:
// src/routes/sitemap.xml/+server.js
export const prerender = true; // needed on adapter-static
export async function GET() {
const urls = await getAllUrls(); // from your CMS/content
const body = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${urls.map((u) => ` <url><loc>${u}</loc></url>`).join('\n')}
</urlset>`;
return new Response(body, {
headers: { 'Content-Type': 'application/xml' },
});
}الاستراتيجية تعتمد على المحول الخاص بك
إليك الجزء الذي يربط هذا المقال بأكمله: استراتيجية sitemap الخاصة بك هي نتيجة لاختيار المحول الخاص بك.
- على
adapter-static، تحتاج نقطة نهاية sitemap إلىexport const prerender = trueبحيث يتم تضمينها في الإخراج الثابت — لا يوجد خادم في وقت التشغيل لتوليدها عند الطلب. تُخبز في وقت البناء، مما يعني أنها فقط بحداثة آخر بناء لك. - على محول Node/serverless/edge، يمكن لنفس نقطة النهاية توليد sitemap
ديناميكيًا لكل طلب من CMS أو قاعدة البيانات الخاصة بك — دائمًا حديث، بدون
إعادة بناء. (على محول edge، تذكر قيد
fs: اسحب عناوين URL من API أو binding، وليس من قراءة قرص.)
لذا فإن سؤال “هل يجب أن يكون sitemap الخاص بي ثابتًا أم ديناميكيًا؟” ليس قرارًا منفصلاً — إنه ينبع من المحول الذي اخترته بالفعل.
robots.txt: ملف ثابت مقابل نقطة نهاية
خياران. ضع robots.txt بسيطًا في مجلد static/ الخاص بك (يُقدَّم في
/robots.txt تلقائيًا)، وهو الخيار الأبسط ومناسب لمعظم المواقع. أو قم بتوليده من
نقطة نهاية src/routes/robots.txt/+server.js عندما تحتاج إلى أن يختلف حسب البيئة
(منع الزواحف على staging، والسماح بها في الإنتاج، على سبيل المثال). في كلتا
الحالتين، لا تحظر حزمة /_app/ أو CSS الخاصة بك —
ذلك يكسر العرض للمحركات التي تقوم بالعرض.
إذا كنت قادمًا من زاوية الإطار الأوسع أو JavaScript-SEO، فإن منطق “أين ومتى يحدث العرض” هنا هو نفس المنطق الذي يحكم JavaScript SEO عمومًا، وجزء أساسيات SvelteKit في هذا القسم يغطي أوضاع العرض وأنماط البيانات الوصفية التي يبني عليها هذا المقال.
ملخص AI
نظرة مختصرة على النسخة المتقدمة:
- يغيّر المُكيّف أين ومتى، وليس ماذا. المُكيّفات “تأخذ التطبيق المبني كمدخل وتولّد مخرجات للنشر” — نفس المحتوى، توقيت مختلف (وقت البناء مقابل وقت الطلب) وموقع مختلف (الأصل مقابل الحافة).
- لماذا هو قرار SEO: TTFB → LCP → سعة الزحف. Google: إذا استجاب الموقع “بسرعة… يرتفع الحد… إذا تباطأ الموقع… يزحف Google أقل.” لا توجد إرشادات Google تذكر SvelteKit تحديدًا — هذه إرشادات عامة تُطبَّق على آليات SvelteKit.
- المُكيّفات:
adapter-auto(بدون إعداد، بدون خيارات)؛adapter-static(SSG، مواقع المحتوى، أقل TTFB)؛adapter-node(خادم تتحكم فيه، واجهات Node كاملة)؛adapter-vercel(serverless + edge + ISR)؛adapter-cloudflare(عاملات الحافة العالمية، بدونfs؛adapter-cloudflare-workersمهمل)؛adapter-netlify(دوال أو دوال Deno Edge). - الترسيم المسبق:
trueيبني HTML ثابتًا ويزيل المسار من البيان الديناميكي؛falseيقوم دائمًا بـ SSR؛'auto'يرسّم مسبقًا ويبقيه ديناميكيًا — أداة الموقع المختلط لـ/blog/[slug](رسّم الشائع مسبقًا، وSSR للذيل الطويل). - المسارات الديناميكية تحتاج دالة
entriesأو ستواجه خطأ “مُعلَّم كقابل للترسيم المسبق، لكن لم يُرسَّم مسبقًا”. - قيود الحافة:
runtime: 'edge'لكل مسار (Vercel)؛ بدونfs(“لا يمكنك استخدام fs في Cloudflare Workers” / دوال الحافة) — استخدمread()من$app/serverأو الترسيم المسبق؛ البدايات الباردة يمكن أن تجعل الحافة أبطأ من خادم دافئ أو ملف ثابت. - لا يوجد sitemap/robots.txt مدمج. أنشئ نقطة نهاية
sitemap.xml/+server.js(prerender = trueعلىadapter-static؛ ديناميكية على مُكيّفات الخادم/الحافة). robots.txt عبرstatic/أو نقطة نهاية. - ISR ≠ prerender-plus: “استخدام ISR على مسار مع export const prerender = true لن يكون له أي تأثير.” إنهما بديلان.
الوثائق الرسمية
وثائق المصدر الأساسي من SvelteKit ومحركات البحث.
SvelteKit
- Adapters • SvelteKit Docs — النظرة العامة: تأخذ المُكيّفات التطبيق المبني وتولّد مخرجات النشر.
- Zero-config deployments (adapter-auto) • SvelteKit Docs — الكشف حسب المنصة وقيود “لا يأخذ أي خيارات”.
- Node servers (adapter-node) • SvelteKit Docs — خادم Node المستقل، متغيرات البيئة، الإيقاف الآمن.
- Static site generation (adapter-static) • SvelteKit Docs — SSG لكامل الموقع، متطلب SSR، وتحذير SEO لبديل SPA.
- Vercel (adapter-vercel) • SvelteKit Docs —
runtimeلكل مسار،regions،split، والتجديد الثابت المتزايد. - Cloudflare (adapter-cloudflare) • SvelteKit Docs — Workers/Pages، روابط
platform.env،nodejs_compat، وقيودfs. - Cloudflare Workers (adapter-cloudflare-workers, deprecated) • SvelteKit Docs — المُكيّف القديم المهمل ومسار الترحيل.
- Netlify (adapter-netlify) • SvelteKit Docs — دوال Node مقابل دوال Deno Edge (
edge: true)، ومتطلب الترسيم المسبق للنماذج. - Page options (prerender, ssr, csr, config) • SvelteKit Docs —
prerender = true/false/'auto'، دالةentries، وconfigلكل مسار بما في ذلكruntime: 'edge'.
- فهم أساسيات تحسين JavaScript لمحركات البحث — قائمة الانتظار للعرض و«ليست كل الروبوتات قادرة على تشغيل JavaScript».
- تحسين ميزانية الزحف — سعة الزحف مرتبطة بسرعة الاستجابة؛ «اجعل صفحاتك فعالة في التحميل».
Bing / Microsoft
- سلسلة bingbot: JavaScript، العرض الديناميكي، والتمويه. يا إلهي! — توصية Bing بالعرض المسبق/العرض الديناميكي وتوضيح التمويه.
- أداء الواجهة الأمامية السريع لـ Microsoft Bing — بنية Bing الخاصة بـ SSR + CDN/العقدة الطرفية كمثال واقعي.
اقتباسات من المصدر
تصريحات مسجلة من وثائق SvelteKit وGoogle وBing. كل رابط هو رابط عميق يقفز إلى المقطع المقتبس في صفحة المصدر.
وثائق SvelteKit — المحولات وخيارات الصفحة
- “adapter-auto does not take any options.” (ترجمة) «لا يأخذ adapter-auto أي خيارات.» — حول المحول الافتراضي بدون إعدادات. الانتقال إلى الاقتباس
- حول
prerender = true— المسارات المعروضة مسبقًا “excluded from manifests used for dynamic SSR, making your server (or serverless/edge functions) smaller.” (ترجمة) «مستبعدة من المظاهر المستخدمة لـ SSR الديناميكي، مما يجعل خادمك (أو وظائف serverless/الطرفية) أصغر.» الانتقال إلى الاقتباس - حول
'auto'— حالة/blog/[slug]حيث تريد “prerender your most recent/popular content but server-render the long tail.” (ترجمة) «عرض المحتوى الأحدث/الأكثر شيوعًا مسبقًا ولكن عرض الجزء الطويل عبر الخادم.» الانتقال إلى الاقتباس - حول قيود
fsعلى الحافة — “You can’t use fs in Cloudflare Workers.” (ترجمة) «لا يمكنك استخدام fs في Cloudflare Workers.» الانتقال إلى الاقتباس - حول Vercel ISR مقابل العرض المسبق — “Using ISR on a route with export const prerender = true will have no effect, since the route is prerendered at build time.” (ترجمة) «استخدام ISR على مسار مع export const prerender = true لن يكون له أي تأثير، لأن المسار يُعرض مسبقًا في وقت البناء.» الانتقال إلى الاقتباس
Google — العرض وميزانية الزحف
- “Keep in mind that 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.» الانتقال إلى الاقتباس
- “If the site responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down or responds with server errors, the limit goes down and Google crawls less.” (ترجمة) «إذا استجاب الموقع بسرعة لفترة، يرتفع الحد، مما يعني أنه يمكن استخدام المزيد من الاتصالات للزحف. إذا تباطأ الموقع أو استجاب بأخطاء الخادم، ينخفض الحد ويزحف Google بشكل أقل.» الانتقال إلى الاقتباس
- “Make your pages efficient to load. If Google can load and render your pages faster, we might be able to read more content from your site.” (ترجمة) «اجعل صفحاتك فعالة في التحميل. إذا كان بإمكان Google تحميل وعرض صفحاتك بشكل أسرع، فقد نتمكن من قراءة المزيد من المحتوى من موقعك.» الانتقال إلى الاقتباس
Bing — العرض المسبق وبنية الحافة الخاصة به
- “We encourage detecting our bingbot user agent, prerendering the content on the server side and outputting static HTML for such sites…” (ترجمة) «نشجع على اكتشاف وكيل مستخدم bingbot الخاص بنا، وعرض المحتوى مسبقًا على جانب الخادم وإخراج HTML ثابت لمثل هذه المواقع…» — فابريس كانيل وفريديريك دوبو، Microsoft Bing. الانتقال إلى الاقتباس
- “User traffic routes first to the closest CDN node (called an ‘edge node’).” (ترجمة) «يتم توجيه حركة مرور المستخدم أولاً إلى أقرب عقدة CDN (تسمى ‘عقدة طرفية’).» — Bing Search Quality Insights، حول بنية SSR + الحافة الخاصة بـ Bing. الانتقال إلى الاقتباس
قائمة فحص نشر SvelteKit لتحسين محركات البحث
مرور للتأكد من أن إعداد المحول والترميز المسبق وملف sitemap لن يضر بالزاحفين:
- انتقلت من
adapter-autoإلى محول صريح إذا كنت بحاجة إلى أي إعداد (الحافة، ISR، الارتباطات). - المحول يطابق نوع الموقع —
adapter-staticللمحتوى الخالص، محول خادم/حافة لأي شيء يحتوي على منطق لكل طلب. - مسارات المحتوى هي
prerender = true(أو'auto'); فقط المسارات الديناميكية حقًا تُترك لـ SSR. - المسارات الديناميكية المختلطة (
/blog/[slug]) تستخدمprerender = 'auto'مع دالةentriesتُعدِّد المسارات المعروفة. - لا توجد أخطاء بناء غير محلولة “مُعلَّمة كقابلة للترميز المسبق، ولكن لم يتم ترميزها مسبقًا”.
- إذا كان أي مسار يستخدم
runtime: 'edge'، فإنه لا يستدعي Nodefs— الوصول إلى الملفات يستخدمread()من$app/serverأو يتم ترميزه مسبقًا. - أخذت في الاعتبار البدايات الباردة على الحافة/الخادم بلا خادم — قابلة للتخزين المؤقت، أو ثابتة، أو دافئة حيث يهم TTFB.
- يوجد نقطة نهاية sitemap.xml (
prerender = trueعلىadapter-static; ديناميكية على محولات الخادم/الحافة). - يوجد robots.txt (في
static/أو كنقطة نهاية+server.js) ولا يحظر/_app/أو CSS. - أنت لا تحاول تكديس ISR على مسار
prerender = true(ليس له أي تأثير). - تحققت من HTML المُقدَّم وسرعة الاستجابة في GSC URL Inspection وPageSpeed Insights.
النماذج الذهنية
1. أين ومتى، وليس ماذا. المحول لا يغير محتواك أبدًا — يغير متى يتم إنشاء HTML (وقت البناء مقابل وقت الطلب) وأين (الأصل مقابل الحافة). كل سؤال نشر لتحسين محركات البحث يختزل إلى هذين المحورين. اسألهما قبل لمس الإعداد.
2. الترميز المسبق يزيل مسارًا من الخادم.
prerender = true ليس مجرد “اجعله ثابتًا” — إنه يأخذ المسار خارج
البيان الديناميكي. ذلك يقلص وظيفتك ويستبعد التراجع الديناميكي.
'auto' هو الاستثناء: مُرمَّز مسبقًا و لا يزال في البيان.
3. تقسيم /blog/[slug].
النمط الافتراضي لمواقع المحتوى الحقيقية: قم بترميز الإدخالات التي يمكنك تسميتها مسبقًا
(دالة entries تُرجع الحديثة/الشائعة)، واترك الذيل الطويل لـ SSR. 'auto' هو
المفتاح الذي يجعل كلاهما صحيحًا في نفس الوقت.
4. الحافة مقايضة، وليست ترقية.
الحافة تشتري لك القرب الجغرافي (TTFB منخفض عندما تكون دافئة) وتكلفك واجهات برمجة تطبيقات Node
(لا fs) وخطر البدء البارد. تتفوق على خادم Node دافئ فقط أحيانًا، و
تخسر أمام الإخراج الثابت المُرمَّز مسبقًا على TTFB دائمًا. اخترها لسبب، وليس
بشكل افتراضي.
5. خريطة الموقع تتبع المحول.
“خريطة موقع ثابتة أم ديناميكية؟” ليست قرارًا منفصلًا. adapter-static →
خريطة موقع مُرمَّزة مسبقًا، طازجة فقط عند البناء. محول خادم/حافة → خريطة موقع
لكل طلب، دائمًا حديثة. المحول أجاب بالفعل على السؤال.
6. لا شيء يولّد الملفين. SvelteKit لا ينشئ sitemap.xml ولا robots.txt، لأي محول. إذا لم تكتبهما، فهما غير موجودين. ادمج هذا في قائمة فحص الإطلاق الخاصة بك.
أي مجموعة محول + ترميز مسبق يجب أن أختار؟
السؤال الأساسي “أي مسار أتخذه؟” في نشر SvelteKit هو كيف يجب أن يُشحن هذا الموقع؟ مرر موقعك عبر هذا:
1. هل تحتاج أي صفحة إلى منطق خادم لكل طلب — مصادقة، تخصيص، بحث مباشر، معالجة نماذج، بيانات لكل مستخدم؟ → لا (كل صفحة هي نفسها لكل زائر): انتقل إلى 2. → نعم: انتقل إلى 3.
2. موقع محتوى نقي (مدونة، وثائق، تسويق).
→ استخدم adapter-static، واضبط prerender = true على مستوى الموقع (أو في
التخطيط الجذري). أضف مولدًا مسبقًا sitemap.xml/+server.js (prerender = true) وملف
static/robots.txt. أقل TTFB، لا برود تشغيل، لا شيء لتشغيله. توقف هنا.
3. هل الموقع كله ديناميكي، أم بعض المسارات فقط؟ → بعض المسارات فقط (معظمها محتوى، مع بعض الأجزاء الديناميكية): انتقل إلى 4. → معظمه/كله ديناميكي (تطبيق، لوحة تحكم، تجارة إلكترونية ببيانات لكل مستخدم): انتقل إلى 5.
4. موقع محتوى مع جيوب ديناميكية.
→ استخدم محول خادم/حافة (adapter-node، أو -vercel، أو
-cloudflare). حدد مسارات المحتوى prerender = true، والمسارات الديناميكية
false. لمسارات من نمط /blog/[slug] ذات محتوى معروف الشعبية، استخدم
prerender = 'auto' + دالة entries. أنشئ خريطة الموقع ديناميكيًا
من نظام إدارة المحتوى الخاص بك. انتهيت.
5. تطبيق / لوحة تحكم / تجارة إلكترونية (SSR أولاً). الآن اختر أين يعمل SSR:
→ زمن استجابة متوقع، مكتبات Node، لديك بنية تحتية: adapter-node
(خادم دافئ، واجهات Node كاملة، لا مفاجآت برود تشغيل).
→ جمهور عالمي، TTFB هو الأهم، لا تبعيات Node ثقيلة: محول حافة
(adapter-cloudflare، أو adapter-vercel مع runtime: 'edge' لكل مسار) —
اقبل عدم وجود fs (استخدم read() من $app/server أو التوليد المسبق) وبرود التشغيل.
قم بالتوليد المسبق فقط للهيكل الثابت حقًا (تسويق، تسجيل دخول).
المسار الرابع (Vercel فقط): إذا كان المسار “ثابتًا في الغالب لكنه يتغير
أحيانًا،” فكر في ISR (isr: { expiration }) بدلاً من prerender = true
— أبدًا كلاهما، لأن “ISR على مسار مع export const prerender = true لن يكون له
أي تأثير.”
هل يجب أن تكون خريطة الموقع ثابتة أم ديناميكية؟
على adapter-static؟ → نقطة نهاية خريطة موقع ثابتة/مولدة مسبقًا
(prerender = true). تُخبز وقت البناء؛ مناسبة للمواقع التي تعيد البناء عند النشر.
على محول Node/خادم بلا خادم/حافة؟ → خريطة موقع ديناميكية تُنشأ لكل طلب
من نظام إدارة المحتوى/قاعدة البيانات الخاصة بك — دائمًا حديثة، لا إعادة بناء. (على الحافة، اسحب عناوين URL من API أو
ربط، وليس قراءة fs من القرص.)
أبدًا: لا تشحن خريطة موقع لأن “الصفحات كلها ثابتة.” الإخراج الثابت و قابلية اكتشاف خريطة الموقع غير مرتبطين — SvelteKit لا ينشئ أيًا من الملفين لأي محول.
نشر SvelteKit وتحسين محركات البحث — ورقة غش
المحولات في لمحة
| المحول | العرض | وقت التشغيل | ملاحظة SEO |
|---|---|---|---|
adapter-static | وقت البناء (SSG) | لا شيء | أقل TTFB، لا برود تشغيل؛ مواقع محتوى |
adapter-node | وقت الطلب (SSR) | Node | واجهات Node كاملة (fs ✅)؛ أنت تشغل الخادم |
adapter-vercel | وقت الطلب | بلا خادم / حافة | runtime لكل مسار، regions، ISR |
adapter-cloudflare | وقت الطلب | V8 edge | حافة عالمية؛ لا fs؛ nodejs_compat |
adapter-netlify | وقت الطلب | Node / Deno edge | edge: true لوظائف Deno Edge |
adapter-auto | (يكتشف ما سبق) | — | لا يأخذ خيارات — للتخطيط فقط |
قيم التوليد المسبق
| القيمة | HTML ثابت؟ | في البيان الديناميكي؟ | استخدم لـ |
|---|---|---|---|
true | ✅ | ❌ (محذوف) | مسارات محتوى ثابتة معروفة |
false | ❌ | ✅ | مسارات ديناميكية حقًا |
'auto' | ✅ | ✅ | /blog/[slug] — توليد مسبق للشائع، SSR للذيل الطويل |
قواعد سريعة
- مسارات مولدة مسبقًا ديناميكية → أضف دالة
entries(أو واجه خطأ “غير مولدة مسبقًا”). runtime: 'edge'لكل مسار (Vercel) — اخلط مسارات الحافة وNode.- الحافة = لا
fs→ استخدمread()من$app/serverأو التوليد المسبق. - برود التشغيل يجعل الحافة أبطأ من خادم دافئ / ملف ثابت عند أول زيارة.
- ISR ≠ توليد مسبق —
isrعلى مسارprerender = trueلا يفعل شيئًا. - لا خريطة موقع/robots.txt تلقائية — أنشئ كليهما.
prerender = trueعلى نقطة نهاية خريطة الموقع لـadapter-static؛ ديناميكي على الخادم/الحافة. - لا تحظر أبدًا
/_app/أو CSS في robots.txt.
مسار مولّد مسبقًا مفقود من النشر
السبب المحتمل: لم يتمكن الزاحف من اكتشاف المسار، أو قيمة entries غائبة، أو فشل التمهيد المسبق. الإصلاح: أضف روابط قابلة للزحف أو إدخالات صريحة وعامل تحذيرات البناء كفشل في الإصدار. التأكيد: يحتوي بيان الإخراج على المسار ويعيد الإنتاج HTML كاملًا.
فشل adapter-static على مسار ديناميكي
السبب المحتمل: لا يمكن تعداد المسار بالكامل في وقت البناء. الإصلاح: قم بتوفير إدخالات محدودة، أو أعد تصميم المسار، أو استخدم محولًا يدعم الخادم لهذا المسار. التأكيد: يبني المحول المحدد ويعيد كل مسار تمثيلي الاستجابة المقصودة.
نشر الحافة يرمي أخطاء نظام الملفات أو Node API
السبب المحتمل: كود المسار أو تبعية تفترض ميزات Node غير متوفرة في بيئة تشغيل الحافة. الإصلاح: استبدل التبعية، أو انقل العمل إلى خدمة متوافقة، أو اختر محول Node. التأكيد: نجاح SSR في الإنتاج دون استثناءات وقت التشغيل.
Sitemap أو robots.txt يعيد HTML
السبب المحتمل: مسار احتياطي يلتقط نقطة النهاية أو معالج +server يعين الجسم/الترويسات الخاطئة. الإصلاح: أنشئ معالجات نقاط نهاية صريحة بأنواع محتوى صحيحة. التأكيد: تعيد الطلبات المباشرة استجابة text/XML المتوقعة وحالة 200.
تختلف البيانات الوصفية بين المسارات الممهدة مسبقًا و SSR
السبب المحتمل: يتم تحميل بيانات الرأس في مسارات كود مختلفة أو تعتمد على حالة المتصفح. الإصلاح: مركزية توليد البيانات الوصفية من بيانات الصفحة الآمنة للخادم/البناء. التأكيد: يحتوي HTML الخام لكلا نوعي المسارات على منطق عنوان وcanonical وrobots مكافئ.
تأكد مما شحنه محولك فعليًا
الهدف من اختيار محول والتمهيد المسبق هو أن يحصل الزاحف على HTML سريع وكامل. تؤكد هذه الفحوصات أن هذا ما حدث بالفعل — من الاستجابة الخام، وليس من المتصفح.
هل الصفحة ممهدة مسبقًا/SSR (المحتوى في HTML الخام)؟
لا يشغل curl العادي أي JavaScript، لذا يرى بالضبط ما يراه الزاحف غير المعروض.
macOS / Linux
# Raw HTML as the host sends it (no JS executed)
curl -sL "https://example.com/your-page/" -o raw.html
grep -o "Your unique headline text" raw.html # empty = CSR shell, not prerenderedWindows (PowerShell)
Invoke-WebRequest -Uri "https://example.com/your-page/" -OutFile raw.html
Select-String -Path raw.html -Pattern "Your unique headline text"هل TTFB سريع (أم أن دالة تبدأ من البرودة)؟
يغذي TTFB LCP وسعة الزحف، لذا قم بقياسه. اضغط على URL باردًا، ثم دافئًا:
# Time to first byte, twice — a big first number then a small one = cold start
for i in 1 2; do
curl -s -o /dev/null -w "TTFB: %{time_starttransfer}s\n" "https://example.com/your-page/"
doneيجب أن تكون الصفحة الممهدة مسبقًا/الثابتة منخفضة باستمرار. القيمة الأولى الكبيرة التي تنخفض في الضغطة الثانية هي بداية باردة كلاسيكية لـ serverless/edge.
هل تم تمهيد هذا المسار مسبقًا أم خدم ديناميكيًا؟
عادةً ما تكشف المضيفات الثابتة وشبكات CDN عن ذلك في الترويسات (حالة التخزين المؤقت، age،
x-vercel-cache، cf-cache-status):
curl -sI "https://example.com/your-page/" | grep -iE "cache|age|x-vercel|cf-"يعني HIT (أو age غير صفري) أنك تُخدم محتوى مخزنًا مؤقتًا/ممهدة مسبقًا؛
MISS/DYNAMIC في كل طلب يعني أنه يُعرض لكل طلب.
هل يوجد sitemap فعليًا ويعيد XML؟
نظرًا لأن SvelteKit لا يولده، تحقق من أنه موجود فعلًا بنوع المحتوى الصحيح:
curl -sI "https://example.com/sitemap.xml" | grep -iE "HTTP/|content-type"
# Want: 200 + content-type: application/xml (not text/html or a 404)سطر واحد في وحدة تحكم DevTools
الصق في وحدة تحكم المتصفح لمقارنة DOM المعروض بما يحتاجه الزاحف —
إذا كان عنوانك هنا ولكنه مفقود من مخرجات curl أعلاه، فهو معروض من جانب العميل:
// Is the content in the DOM, and does the sitemap resolve?
console.log('headline in DOM:', document.body.innerText.includes('Your unique headline text'));
fetch('/sitemap.xml').then(r => console.log('sitemap status:', r.status, r.headers.get('content-type')));تحقق من أن robots.txt لا يحظر الحزمة
curl -sL "https://example.com/robots.txt" | grep -iE "disallow.*(/_app|\.js|\.css)"يعني Disallow المطابق لـ /_app/ (مخرجات SvelteKit المجمعة) أو CSS الخاص بك أن
محركات البحث لا يمكنها عرض الصفحة — دائمًا ما يكون خطأ.
أدوات لتصحيح أخطاء SEO لنشر SvelteKit
- URL Inspection (Google Search Console) — مصدر الحقيقة. اختبر عنوان URL مباشرة وتحقق من HTML المعروض ولقطة الشاشة وموارد الصفحة للتأكد من أن المحتوى والبيانات الوصفية موجودة ولا شيء محظور.
- PageSpeed Insights — الأداة الموصى بها في وثائق SvelteKit نفسها؛ تكشف TTFB وCore Web Vitals (LCP/INP/CLS) التي يتأثر بها اختيار المحول أكثر من غيره.
- WebPageTest — مخطط waterfall + filmstrip لتشخيص TTFB وتوقيت البدء البارد على عمليات النشر الطرفية/الخادم.
curl -w "%{time_starttransfer}"— أسرع فحص خام لـ TTFB والبدء البارد (انظر علامة التبويب Scripts).- لوحات تحكم المضيف (Vercel / Cloudflare / Netlify Analytics) — عدد استدعاءات الدوال، ومعدلات البدء البارد، ونسب إصابة ذاكرة التخزين المؤقت لكل مسار — الحقيقة الأساسية لمعرفة ما إذا كانت الحوسبة الطرفية/الخادم سريعة فعلاً لك.
- Screaming Frog SEO Spider — زحف مع تشغيل/إيقاف تشغيل JavaScript لمقارنة HTML الخام مقابل المعروض عبر الموقع والتأكد من اكتمال المسارات المعالجة مسبقًا.
- Ahrefs Site Audit — يكشف خرائط المواقع المفقودة/المحظورة، وسلاسل إعادة التوجيه، والروابط الأساسية المكسورة، ومشاكل قابلية الفهرسة على نطاق واسع.
اختبر نفسك: SvelteKit Deployment SEO
خمسة أسئلة سريعة حول المحولات والمعالجة المسبقة والعرض الطرفي في SvelteKit. اختر إجابة لكل سؤال، ثم تحقق.
موارد تستحق وقتك
كتاباتي ذات الصلة
- JavaScript SEO: A Definitive Guide — مرجعي الكامل حول أوضاع العرض (SSR، العرض الثابت، المعالجة المسبقة، ومزالق CSR) التي تدعم كل قرار محول هنا. كما قلت هناك، أي نوع من SSR أو العرض الثابت أو المعالجة المسبقة سيكون جيدًا لمحركات البحث — وهو بالضبط شبكة الأمان وراء هذه الخيارات.
- The Beginner’s Guide to Technical SEO — حيث يتناسب العرض والزحف وCore Web Vitals مع الصورة الأكبر.
محادثاتي
- How Search Works (SlideShare) — شرحتي للزحف والعرض والفهرسة والترتيب، وهو الخلفية لسبب أهمية TTFB وتوقيت العرض. (ينطبق إخلاء المسؤولية الدائم: “This is my understanding of systems… not going to be 100% complete or accurate.”) (ترجمة) «هذا فهمي للأنظمة… لن يكون مكتملاً أو دقيقًا بنسبة 100%.»
من جميع أنحاء الصناعة
- Adapters • SvelteKit Docs — النظرة الشاملة الموثوقة لكل محول رسمي وكيفية تحديدها في
svelte.config.js. - Page options (prerender, ssr, csr, config) • SvelteKit Docs — قيم
prerenderلكل مسار، ودالةentries، وconfigلكل مسار بما في ذلكruntime: 'edge'، بكلمات الفريق نفسه. - Vercel (adapter-vercel) • SvelteKit Docs — وقت التشغيل الطرفي، والمناطق، وتحذير ISR مقابل المعالجة المسبقة.
- Cloudflare (adapter-cloudflare) • SvelteKit Docs — نشر Workers/Pages، والارتباطات، وقيود
fs. - SvelteKit • Cloudflare Pages docs — آليات النشر وارتباطات
platformمن جانب Cloudflare. - تحسين SvelteKit لمحركات البحث: سلاحك السري (Okupter) — دليل عملي للمعالجة المسبقة والعلامات الوصفية ونمط
+server.jsلخريطة الموقع/RSS. - دراسة معمقة لتقنيات العرض في SvelteKit (This Dot Labs) — آليات SSR/SSG/CSR والتكوين لكل مسار/تخطيط، مع المفاضلة القائلة إن SSR قد يكون مكلفاً من حيث حمل الخادم.
- فهم أساسيات تحسين JavaScript لمحركات البحث (Google Search Central) — قائمة العرض والإرشاد العام بأن بعض برامج الزحف لا تشغّل JavaScript، وهو ما يقوم عليه كل اختيار للمُكيّف.
سجل التغييرات
تم التحديث في 14 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.