تحسين محركات البحث لـ Qwik
كيف تضع قابلية الاستئناف في Qwik المحتوى داخل HTML افتراضيًا، وتساعد على خفض INP وTBT — مع أنماط QwikCity لوسوم meta والروابط الأساسية وJSON-LD وخرائط المواقع وi18n اللازمة لتحسين ظهور موقع Qwik في البحث.
اللغات
دليل واحد في هذه الصفحة
- أداة مباشرة ذات صلةPage Speed Test & Core Web Vitals Checker
Qwik هو إطار عمل JavaScript تعتمد فكرته الأساسية على قابلية الاستئناف: يسلسل الخادم حالة التطبيق والمستمعين وشجرة المكوّنات داخل HTML، فيستأنف المتصفح عمله من دون ترطيب (مع استمرار تشغيل سكربت Qwikloader بحجم ~1 كيلوبايت؛ أي إن الحمل ليس صفر JavaScript حرفيًا). بالنسبة إلى تحسين محركات البحث، يمنح ذلك ميزتين للمسارات التي تُصيَّر فعليًا على الخادم: يكون المحتوى موجودًا في HTML افتراضيًا، فتراه برامج الزحف فورًا من دون انتظار موجة تصيير، وتميل قيمتا INP وTBT إلى الانخفاض لأن الترطيب لا يحجب الخيط الرئيسي عند التحميل. تحقّق من النتيجتين بالبيانات الميدانية بدل افتراضهما. يتيح QwikCity مزج SSR وSSG لكل مسار، واستخدام routeLoader$() لجلب البيانات من الخادم وتصدير head للعنوان والوصف وOG والرابط الأساسي وJSON-LD؛ وكلها تُصيَّر على الخادم. يعمل أساس SEO مباشرةً، لكن المهم هو استخدام routeLoader$() للبيانات الوصفية الديناميكية بدل تأثيرات العميل. أما القيد الأبرز فهو أن منظومته أصغر من منظومة React/Vue، وأن Qwik — حتى كتابة هذه السطور — على خط الإصدار v2 التجريبي.
الخلاصة — Qwik هو إطار عمل جافاسكريبت يفعل شيئًا غير معتاد: يرسل HTML مكتملًا ثم يشغّل قدرًا ضئيلًا جدًا من جافاسكريبت عند تحميل الصفحة. معظم الأطر يجب أن “ترطّب” — تعيد تشغيل الكود في متصفحك لإيقاظ الصفحة — وQwik يتخطى ذلك تمامًا عن طريق الاستئناف من البيانات المدمجة في HTML. بالنسبة لتحسين محركات البحث، هذا يعني أن الزاحفين يرون المحتوى الكامل فورًا، وتحصل الصفحات على درجات جيدة في مقاييس السرعة التي يقيسها Google.
ما هو Qwik
معظم الأطر الشائعة (React، Vue، Angular) تبني جزءًا كبيرًا من الصفحة في متصفحك. حتى عندما يرسل الخادم HTML مكتملًا، عادةً ما يجب على الإطار ترطيبها — تنزيل الكود وإعادة تشغيله في متصفحك لجعل الأزرار والقوائم تعمل. خطوة الترطيب هذه هي أحد أكبر أسباب بطء الصفحات: فهي تشغل المتصفح في الوقت الذي تحاول فيه استخدام الصفحة.
يعالج Qwik هذه المشكلة مباشرة بفكرة تسمى قابلية الاستئناف. على الخادم، يصيّر Qwik ملف HTML ويكتب كل ما تحتاجه الصفحة لمواصلة العمل — حالتها، ووظائف النقرات، وبنية الصفحة — مباشرة في HTML. عند تحميل الصفحة في متصفحك، لا يعيد Qwik تشغيل أي شيء. إنه يستأنف من تلك المعلومات المحفوظة، لذا فهو لا يعيد تنفيذ مكوناتك — لكنه ليس صفر جافاسكريبت حرفيًا أيضًا. سكربت مُحمِّل صغير (~1 كيلوبايت) يسمى Qwikloader يعمل عند التحميل؛ فهو يستمع فقط للنقرات بدل إعادة بناء الصفحة. Evidence for this claim Qwik serializes application state into HTML and resumes without eagerly re-executing the application on startup. Scope: Qwik resumability; exact JavaScript transferred depends on the application. Confidence: high · Verified: Qwik: Resumable ولا يجلب بقية الكود إلا في اللحظة التي تنقر فيها فعليًا على شيء ما.
QwikCity هو مجموعة الأدوات الكاملة المبنية فوق Qwik — إنه بالنسبة إلى Qwik مثل Next.js بالنسبة إلى React. يوفر لك توجيه الصفحات، وعرض الخادم، ومكانًا نظيفًا لتعيين عناوينك ووسوم الميتا. إذا كنت تقوم بتحسين محركات البحث على موقع Qwik، فمن شبه المؤكد أنك تستخدم QwikCity.
لماذا هذا جيد لتحسين محركات البحث
سببان:
- محتواك موجود في HTML. نظرًا لأن Qwik يعرض كل شيء على الخادم ولا يحتاج أبدًا إلى العرض مرة أخرى في المتصفح، فإن النصوص والروابط التي يحتاجها Google موجودة مباشرة في مصدر الصفحة. لا يتعين على Google فعل أي شيء معقد لرؤية المحتوى الخاص بك — وهذا هو الهدف الأساسي في JavaScript SEO. هذا صحيح عندما يكون المسار معروضًا فعليًا على الخادم (SSR أو SSG) — تحقق من HTML الخام باستخدام view-source على صفحاتك المنشورة بدلاً من افتراض ذلك من الإطار وحده.
- الصفحات سريعة وسريعة الاستجابة. مع القليل جدًا من جافاسكريبت الذي يعمل عند التحميل، تستجيب الصفحة للنقرات بسرعة (INP جيد) ولا يتم حظر المتصفح. Core Web Vitals تكافئ ذلك تمامًا، لذا فهي ميزة حقيقية — وإن كانت صغيرة عادةً. إنها بداية هيكلية، وليست ضمانًا؛ تأكد منها ببيانات ميدانية على موقعك الخاص بدلاً من افتراض الرقم.
ما لا يزال عليك فعله
كون الميزات «تعمل مباشرةً» لا يعني أن تترك الإعدادات بلا ضبط. الأهم هو تعيين العناوين،
والأوصاف، ووسوم الميتا الأخرى باستخدام تصدير head في QwikCity على كل صفحة،
وبالنسبة للصفحات ذات البيانات الديناميكية (منشورات المدونة، صفحات المنتجات) اسحب تلك البيانات
من جانب الخادم باستخدام routeLoader$() كي تظهر وسوم الميتا في HTML — بدل إضافتها لاحقًا بواسطة جافاسكريبت. Evidence for this claim Qwik City routes can provide page metadata through a head export, and routeLoader$ loads route data on the server. Scope: Qwik City metadata and loaders. Confidence: high · Verified: Qwik City: Head Qwik City: Route loaders اضبط ذلك جيدًا، وستكون قد عالجت معظم متطلبات SEO في Qwik.
هل تريد الآليات الحقيقية — كيف تعمل قابلية الاستئناف، وأنماط QwikCity الدقيقة لوسوم الميتا، وعناوين URL الأساسية، والبيانات المنظمة، وخرائط المواقع، بالإضافة إلى المخاطر؟ انتقل إلى علامة التبويب متقدم.
TL;DR — الابتكار الأساسي في Qwik هو الاستئناف (Resumability): في وقت SSR، يقوم بتسلسل مستمعي الأحداث (كسمات HTML)، وشجرة المكونات (في تعليقات HTML)، وحالة التطبيق (في سكربت
qwik/json) داخل HTML، بحيث يقوم المتصفح بالاستئناف بدلاً من الترطيب — سكربت Qwikloader صغير (~1 كيلوبايت) لا يزال يعمل، لذا ليس صفر JavaScript حرفيًا. هذا مختلف جوهريًا عن React/Vue/Angular/SolidJS، التي جميعها تقوم بالترطيب. على المسارات التي تُصيَّر فعليًا على الخادم، تكون الفائدة لتحسين محركات البحث (SEO) مزدوجة: المحتوى موجود في HTML افتراضيًا (بدون تأخير موجة العرض للزاحفين) وINP/TBT تتجه نحو الصفر لأنه لا يوجد ترطيب يحجب الخيط الرئيسي عند التحميل — تحقق من كليهما باستخدام بيانات ميدانية بدلاً من افتراضهما. QwikCity هو إطار العمل الفوقي — يمكن مزج SSR وSSG لكل مسار، وليس اختيارًا واحدًا للمشروع بأكمله. البيانات الوصفية موجودة في تصديرhead(العنوان، meta، OG، canonical، JSON-LD)، وتُغذى بواسطةrouteLoader$()للبيانات من جانب الخادم. خرائط المواقع (Sitemaps) تلقائية في SSG (للمسارات المبنية فعليًا) ومسار ديناميكي في SSR. Qwik حاليًا على خط v2 (إصدار تجريبي) وقت كتابة هذا. والقيد الواقعي أن النظام البيئي أحدث و أصغر من منظومة React.
الاستئناف: الفكرة الأساسية (ولماذا يهم تحسين محركات البحث)
أنشأ Miško Hevery — مبتكر Angular — إطار Qwik لدى builder.io، والغرض الأساسي منه هو التخلص من الترطيب. (وقت كتابة هذا، Qwik على خط v2، حاليًا في إصدار تجريبي — تحقق من واجهة API وفق الإصدار المثبت لديك قبل نسخ الكود من أي مصدر، بما في ذلك هذا.) الترطيب هو ما يفعله كل إطار عمل رئيسي بعد SSR: ينزّل كود المكوّنات ويعيد تنفيذه في المتصفح لإرفاق معالجات الأحداث وإعادة بناء الحالة الداخلية. كما يقول Hevery، “Hydration is when an application is downloaded and executed twice, once as HTML and again as JavaScript.” (ترجمة) «الترطيب هو عندما يتم تنزيل تطبيق وتنفيذه مرتين، مرة كـ HTML ومرة أخرى كـ JavaScript.» هذا التنفيذ الثاني عبء محض — الصفحة تبدو جاهزة لكنها ليست تفاعلية، ويظل الخيط الرئيسي مشغولًا.
بدلاً من ذلك، يقوم Qwik بتسلسل ثلاثة أشياء في HTML وقت SSR:
- مستمعو الأحداث — مشفرون كسمات HTML (مثل
on:click="./chunk.js#symbol"). سكربت صغير مضمّن (Qwikloader، ~1 كيلوبايت) يرفق مستمعًا عامًا واحدًا، ويقرأ الجزء/الرمز المشفر عند حدث، ويقوم بتنزيل كود المعالج فقط عند الطلب. - بنية شجرة المكونات — مشفرة في تعليقات HTML، بحيث يمكن لـ Qwik إعادة بناء التسلسل الهرمي دون تنفيذ كود المكونات.
- حالة التطبيق — مسلسلة في كتلة
<script type="qwik/json">، بحيث يمكن لأي مكون الاستئناف دون وجود أصله.
عند تحميل الصفحة، لا يعيد Qwik تشغيل مكوناتك. Evidence for this claim Qwik resumability restores listeners and application state without rerunning component initialization on page startup. Scope: Qwik resumability model. Confidence: high · Verified: Qwik: Resumable كما تقول الوثائق، “Resumability is a way for a framework to recover its state without re-executing the application components on the client.” (ترجمة) «الاستئناف هو طريقة لإطار العمل لاستعادة حالته دون إعادة تنفيذ مكونات التطبيق على العميل.» النتيجة، بكلمات الوثائق: “Qwik apps work instantly without any delay because they don’t need hydration, regardless of their size or complexity.” (ترجمة) «تطبيقات Qwik تعمل فورًا دون أي تأخير لأنها لا تحتاج إلى الترطيب، بغض النظر عن حجمها أو تعقيدها.»
هذا ليس بنية الجزر (Astro). الجزر لا تزال تقوم بالترطيب لكل جزيرة بشكل فردي. Qwik لا يقوم بالترطيب لأي شيء — لا توجد تكلفة Hydration لكل جزيرة لعدم وجود أي ترطيب.
ما يستلمه الزاحفون فعليًا
نظرًا لأن Qwik يقوم بمعالجة كل شيء مسبقًا على الخادم ولا يعيد العرض أبدًا على
العميل، فإن HTML الذي يجلبه Googlebot يحتوي بالفعل على المحتوى الكامل الخاص بك —
النصوص والروابط والعناوين وكل شيء — للمسار الذي يتم عرضه فعليًا على
الخادم. العرض هو قرار لكل مسار في QwikCity (SSR أو SSG أو مزيج)؛
المسار الذي يُترك في وضع العميل فقط، أو المحتوى الذي يتم جلبه من تأثير جانب العميل
بدلاً من routeLoader$()، لا يحصل على هذه الميزة فقط لأن المشروع
يستخدم Qwik. تعالج Google JavaScript على مرحلتين (HTML أولاً، ثم تمرير عرض
مؤجل يمكن أن يتأخر من ساعات إلى أيام). التطبيق المعتمد بشكل كبير على عرض العميل
يخاطر بظهور المحتوى فقط في تلك الموجة الثانية. مسار Qwik المعروض بشكل صحيح على
الخادم يتجنب هذا الخطر: لا يوجد تأخير في قائمة انتظار العرض لأن المحتوى لم يكن
ينتظر JavaScript الخاص بالعميل في المقام الأول. تعامل مع “صفحات Qwik تتصرف مثل
HTML ثابت لبرامج الزحف” على أنه نية البنية، ثم تأكد من ذلك على
عناوين URL المنشورة لديك باستخدام view-source — الموقف الأكثر أمانًا لـ
JavaScript SEO هو التحقق من الاستجابة، وليس
الثقة في تسمية الإطار.
يعمل Bing بنفس الطريقة — نموذج من مرحلتين يفضل HTML المعروض على الخادم لتحقيق الكفاءة. ناتج Qwik القائم على HTML أولاً يفيد كلا المحركين لنفس السبب.
Core Web Vitals: ميزة هيكلية
تستخدم Google البيانات الميدانية (CrUX) لإشارة تجربة الصفحة، وINP حلت محل FID كأحد Core Web Vitals في مارس 2024. هنا تؤتي بنية Qwik ثمارها مباشرة: مع Qwikloader كالبرنامج النصي الوحيد الذي يعمل عند التحميل — تشير الوثائق إلى أن المواقع “يمكن أن تعمل مع حوالي 1 كيلوبايت من JavaScript (بغض النظر عن تعقيد التطبيق)” — لا يوجد تقريبًا ما يعيق الخيط الرئيسي. إجمالي وقت الحظر يتجه نحو الصفر ويظل INP منخفضًا لأنه لا توجد مرحلة ترطيب تتنافس مع تفاعلات المستخدم الأولى. تطبيق Qwik الأكبر لا يعني تكلفة بدء تشغيل أعلى؛ يتم جلب JavaScript بشكل كسول، لكل تفاعل، وليس كحزمة تشغيل واحدة.
هذا هو الفرق عن الأطر الراسخة. Next.js وNuxt وAngular SSR تضع المحتوى في HTML أيضًا — فهي ليست سيئة لتحسين محركات البحث — لكنها تحمل تكلفة ترطيب تتوسع مع التطبيق. تزيل Qwik هذه التكلفة بالتصميم.
هذا هو التوقع المعماري، وليس نتيجة مقاسة. لا يضمن درجة INP أو TBT أو CrUX محددة لموقعك — البرامج النصية من جهات خارجية، وعلامات التحليلات، وتكلفة جلب البيانات لكل مسار يمكن أن تستهلك جميعها الميزة. تأكد من ذلك باستخدام البيانات الميدانية (CrUX، تقرير Core Web Vitals في Search Console) على عناوين URL المنشورة الخاصة بك قبل تقديم ادعاء بالأداء لعميل أو أصحاب مصلحة؛ راجع علامة التبويب كيفية القياس لمؤشرات الأداء الرئيسية والإيقاع المحددين.
وسوم Meta وhead للمستند
في QwikCity، توجد بيانات تعريف الصفحة في تصدير head من كل ملف مسار. بالنسبة
لبيانات التعريف الثابتة، فهي ثابتة: Evidence for this claim Qwik City route modules can export a DocumentHead value or function for route metadata. Scope: Qwik City route metadata. Confidence: high · Verified: Qwik City: Head
export const head: DocumentHead = {
title: 'Qwik SEO Guide',
meta: [
{ name: 'description', content: 'How Qwik resumability helps SEO.' },
{ property: 'og:title', content: 'Qwik SEO Guide' },
{ property: 'og:description', content: 'Resumability, meta tags, sitemaps.' },
],
links: [
{ rel: 'canonical', href: 'https://example.com/qwik-seo/' },
],
};يتم عرض كل هذا على الخادم في <head>، لذا فهو موجود في HTML الذي
يراه الزاحف. النمط الأساسي — links: [{ rel: 'canonical', href: '...' }]
— من السهل تفويته ولكنه المكان الصحيح له.
بالنسبة إلى البيانات الوصفية الديناميكية (منشورات المدونات والمنتجات)، فإن النمط
الحاسم لـSEO هو routeLoader$(). يعمل من جهة الخادم قبل استجابة HTML، ويمكن أن يكون
تصدير head دالة تتلقى قيمة المحمّل المحلولة:
export const usePost = routeLoader$(async ({ params }) => {
return await getPost(params.slug); // runs on the server
});
export const head: DocumentHead = ({ resolveValue }) => {
const post = resolveValue(usePost);
return {
title: post.title,
meta: [{ name: 'description', content: post.excerpt }],
links: [{ rel: 'canonical', href: `https://example.com/blog/${post.slug}/` }],
};
};هذا هو المكافئ في QwikCity لـ getServerSideProps. الانضباط المهم
لتحسين محركات البحث: اجلب بيانات التعريف باستخدام routeLoader$()، وليس في تأثير
جانب العميل (useSignal()/useResource$() التي تعمل في المتصفح). إذا قمت بتعيين
العنوان من تأثير عميل، فلن يكون في HTML الموجة الأولى.
البيانات المنظمة (JSON-LD)
يتم وضع JSON-LD في مصفوفة scripts الخاصة بتصدير head، ويتم عرضه سطريًا في
<head> على الخادم ويمكن الزحف إليه بالكامل:
export const head: DocumentHead = ({ resolveValue }) => {
const post = resolveValue(usePost);
return {
title: post.title,
scripts: [
{
props: { type: 'application/ld+json' },
script: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Article',
headline: post.title,
datePublished: post.date,
}),
},
],
};
};نظرًا لأنه يتم تسلسله في استجابة HTML، فلا يوجد تأخير في العرض قبل أن يكون الترميز متاحًا لبرامج الزحف. أحد تفاصيل الإعداد التي يسهل تفويتها: حقل scripts ينتج مخرجات فقط إذا كان مكوّن router-head في مشروعك يعرض فعليًا head.scripts (عادةً عبر dangerouslySetInnerHTML) — فالأمر ليس تلقائيًا فقط لأنك ملأت المصفوفة. إذا كان router-head.tsx في قالب البداية لا يقوم بالفعل بالتكرار على head.scripts، أضف ذلك قبل الثقة في ظهور JSON-LD في الاستجابة.
Sitemaps و robots.txt
- بناءات SSG: خيار الإعداد
sitemapOutFileيولد تلقائيًاsitemap.xmlأثناء البناء الثابت — لكنه يتضمن فقط المسارات التي تم بناؤها فعليًا. المسار المستبعد من البناء الثابت (معاملات ديناميكية لم تقم بمعالجتها مسبقًا، صفحة محجوبة خلف شرط) لن يكون في sitemap حتى لو كان موجودًا. - مواقع SSR: لا يوجد sitemap تلقائي — أضف مسارًا في
src/routes/sitemap.xml/index.tsمعRequestHandlerيبني ويعيد XML ديناميكيًا. robots.txt: ضعه في/public/ليتم تقديمه في الجذر.- الروابط الأساسية وروابط sitemap تعتمد كلاهما على
origin. QwikCity يبني روابط مطلقة منorigin/baseالمكوّن (أو أصل رأس مُعاد توجيهه في وسيط SSR). أصل خاطئ أو مسرّب من معاينة/تدريج في هذا الإعداد ينتج روابط أساسية وإدخالات sitemap خاطئة في الإنتاج — تحقق من المخرجات الفعلية، وليس فقط ملف الإعداد، بعد أي تغيير في المحول أو النشر.
تحسين محركات البحث الدولي
آليتان، تُستخدمان معًا:
rewriteRoutesفي إعداد QwikCity يربط مسارات URL المترجمة بمساراتك دون تكرار المكونات (مثل/it/documentazione/→/docs/). هذا يمنحك روابط URL نظيفة ومترجمة — الأساس لهيكل URL دولي.- Qwik Speak (مكتبة منفصلة) يتعامل مع ترجمة المحتوى.
- وسوم hreflang توضع في مصفوفة
linksفي تصديرhead، مشيرة كل لغة إلى بدائلها. انظر تحسين محركات البحث الدولي و hreflang للقواعد عبر المحركات.
SSR مقابل SSG لتحسين محركات البحث
كلاهما يضع المحتوى في HTML، لذا كلاهما آمن لبرامج الزحف — وQwikCity يتيح لك خلط الأوضاع لكل مسار، وليس فقط مرة واحدة للمشروع بأكمله. اختر لكل مسار بناءً على شكل المحتوى:
- SSG (محول ثابت) ينتج ملفات HTML نقية، لا حاجة لخادم — مثالي للمحتوى الذي لا يتغير لكل طلب. sitemap تلقائي (للمسارات التي تم بناؤها فعليًا)، أرخص استضافة، أسرع TTFB من CDN. المقايضة هي الحداثة: المحتوى لا يُحدَّث إلا في عملية البناء التالية، والمسار الذي يفشل في البناء ببساطة غير موجود.
- SSR يعرض لكل طلب — مطلوب للبيانات المخصصة أو المتغيرة بشكل متكرر.
شغّله على الحافة (Cloudflare، Vercel، Netlify) لـ TTFB منخفض، واضبط
رؤوس
Cache-Controlعلى استجابات SSR حتى يتمكن CDN من تقديم التكرارات دون إعادة العرض. المقايضة هي أن الفشل في وقت الطلب (مثلrouteLoader$()بطيء أو به خطأ) يؤثر على الاستجابة المباشرة، لذا أضف معالجة الأخطاء لجلب البيانات بدلاً من تركها تظهر كصفحة مكسورة.
لا يوجد وضع “أكثر أمانًا لتحسين محركات البحث” من الآخر افتراضيًا — اختر لكل مسار بناءً على مدى تكرار تغيير المحتوى وما يحدث إذا كان مصدر البيانات غير متاح مؤقتًا، ثم تحقق من الاستجابة المنشورة في كلتا الحالتين.
ما يجب الانتباه إليه
- ليس كل شيء قابلًا للتسلسل. لا يمكن وضع نسخ من الكائنات (class instances) والوعود (promises) والتدفقات (streams) في حالة HTML. الكود الذي يتعامل معها يجب أن يعمل على العميل فقط — أبقِه خارج أي شيء يحتاج إلى أن يكون في HTML الخادم (خاصة البيانات الوصفية). إذا استبعدت قيمة عمدًا باستخدام
noSerialize()، فتذكر أنها تعود كـundefinedبعد استئناف التطبيق على العميل — لا تلجأ إليها في أي شيء لا تزال الصفحة بحاجة إلى قراءته بعد الاستئناف، بما في ذلك مسارات البيانات الوصفية. useVisibleTask$()هي مخرج حقيقي، استخدمها باعتدال. تعمل على العميل بعد العرض الأولي — الخطاف الوحيد الذي يعمل عمدًا ضد قابلية الاستئناف. لا تحجب العرض أو تضر بـ HTML الأولي، لكنها تعني أن JavaScript على العميل يعمل والذي كان Qwik سيؤجله بخلاف ذلك. مناسبة للعمل الذي يكون على العميل فقط (مكتبة رسوم بيانية، خريطة)؛ خيار خاطئ لأي شيء يجب أن يغذي البيانات الوصفية المقدمة من الخادم.- تحقق من أن علامات meta موجودة في المصدر، وليست محقونة بواسطة JavaScript. يجب أن يُظهر عرض المصدر (وليس فقط DOM المعروض في أدوات المطور) العنوان والرابط الأساسي (canonical) وJSON-LD. إذا ظهرت فقط في DOM المعروض، فأنت قمت بتعيينها من تأثير على العميل بدلاً من تصدير
head/routeLoader$(). routeLoader$()مقابلuseResource$()/useSignal(). تعمل اللوادر (loaders) على الخادم وتغذيhead؛ بينما يمكن للآخرين العمل في المتصفح. لأي شيء يجب أن يكون في البيانات الوصفية أو HTML للموجة الأولى، استخدم اللودر.- نظام بيئي أصغر. لدى Qwik عدد أقل بكثير من موصلات CMS وإضافات SEO مقارنة بـ Next.js، ومجتمع أصغر للاعتماد عليه. الإطار قادر؛ ستحتاج فقط إلى كتابة المزيد من الكود اللاصق بنفسك. موقع builder.io نفسه يعمل على Qwik، لذا فهو مستخدم في الإنتاج — ولكن ادخل بعيون مفتوحة بشأن فجوة النضج.
أين يقع هذا
Qwik هو أحد إطارين في قصة أطر عمل JavaScript — والآخر هو SolidJS. التمييز الرئيسي الذي يجب تذكره: Qwik يستأنف؛ SolidJS (وReact وVue وAngular) يرطب. كلاهما لا يزال ينتج HTML غنيًا بالمحتوى عبر أطر العمل الوصفية الخاصة بهما، لذا فإن الزحف جيد في كلتا الحالتين؛ زاوية قابلية الاستئناف هي ما يجعل ملف INP/TBT الخاص بـ Qwik الأفضل هيكليًا في المجموعة. بالنسبة للجانب المتري، انظر Core Web Vitals؛ وبالنسبة للأساسيات، راجع مركز JavaScript SEO.
ملخص الذكاء الاصطناعي
نظرة مختصرة على النسخة المتقدمة:
- Qwik = قابلية الاستئناف. عند SSR، يقوم بتسلسل مستمعي الأحداث (سمات HTML)،
شجرة المكونات (تعليقات HTML)، والحالة (سكربت
qwik/json) في HTML، بحيث يستأنف المتصفح بدلاً من الترطيب. هذا يختلف اختلافًا جوهريًا عن React/Vue/Angular/SolidJS، التي جميعها ترطّب. إنه على خط الإصدار v2 (حاليًا في مرحلة بيتا) وقت كتابة هذا — تحقق من API مقابل الإصدار المثبت لديك. - المحتوى موجود في HTML افتراضيًا — للمسارات التي تُعرض فعليًا على الخادم. SSR/SSG هو قرار لكل مسار في QwikCity، وليس ضمانًا على مستوى المشروع. لا توجد خطوة إعادة عرض على العميل لتلك المسارات → يحصل الزاحفون على محتوى كاملًا من دون أي تأخير لموجة العرض. تأكد على روابطك المنشورة بنفسك باستخدام عرض المصدر بدلاً من افتراض ذلك من الإطار وحده.
- CWV هو بداية هيكلية، وليس ضمانًا. تبدأ المواقع بـ ~1 كيلوبايت من JS (Qwikloader — JS حقيقي يعمل، وليس صفرًا) بغض النظر عن التعقيد، لذا يتجه TBT نحو ~0 ويبقى INP منخفضًا عندما لا يوجد شيء آخر على الصفحة يحجب الخيط. تأكد مع الالالبيانات الميدانيةيةية (CrUX / Search Console) — يمكن أن تعوض سكربتات الطرف الثالث وتكلفة جلب البيانات على مستوى المسار الميزة.
- QwikCity هو الإطار الفوقي (Next.js لـ Qwik): SSR/SSG مختلط لكل مسار،
توجيه نظام الملفات،
routeLoader$()لبيانات جانب الخادم. - البيانات الوصفية تعيش في تصدير
head— العنوان، meta، OG،canonical(فيlinks)، و JSON-LD (فيscripts) — كلها تُعرض على الخادم. للصفحات الديناميكية، اجعلheadدالة تغذيهاrouteLoader$()؛ لا تضبط البيانات الوصفية من تأثيرات جانب العميل. حقلscriptsيُخرج فقط إذا كان مكونrouter-headالخاص بك يعرض فعليًاhead.scripts— تحقق من ذلك قبل الثقة في ظهور JSON-LD. - خرائط المواقع: تلقائية في SSG (
sitemapOutFile، محدودة بالمسارات المبنية فعليًا)؛ مسار ديناميكيsrc/routes/sitemap.xml/index.tsفي SSR.robots.txtيوضع في/public/. تعتمد روابط canonical وخرائط المواقع علىoriginالمكوّن — تسريب أصل معاينة/تدريج يكسر كليهما في الإنتاج. - i18n:
rewriteRoutesلروابط مترجمة + Qwik Speak للمحتوى؛ hreflang عبرhead.links. - انتبه: البيانات غير القابلة للتسلسل (مثيلات الفئات، الوعود، التدفقات) هي
خاصة بالعميل فقط، وقيمة مغلفة بـ
noSerialize()تعودundefinedبعد الاستئناف؛useVisibleTask$()يعمل مباشرةً على العميل ويجب استخدامه باعتدال؛ تحقق من أن وسوم meta موجودة في عرض المصدر، وليست محقونة عبر JS؛ النظام البيئي أصغر من React/Next.js.
الوثائق الرسمية
وثائق المصدر الأساسية من Qwik ومحركات البحث.
Qwik / QwikCity
- وثائق Qwik — نظرة عامة — الصفحة الرئيسية للوثائق؛ ادعاءات ~1 كيلوبايت JS والتحميل الفوري.
- قابلية الاستئناف — الشرح الأساسي لآلية التسلسل ولماذا ليست ترطيبًا.
- نظرة عامة على QwikCity — الإطار الفوقي: التوجيه، SSR/SSG، إطار “Next.js لـ Qwik”.
- التوجيه — توجيه نظام الملفات، الجلب المسبق لمكون
Link، وإعادة كتابة المسارات. - الصفحات / DocumentHead — تصدير
head،routeLoader$()، الرأس الديناميكي، والبيانات المنظمة. - خرائط المواقع — توليد
sitemap.xmlوrobots.txt. - النشر — المحولات، منصات SSR/SSG، ورؤوس التخزين المؤقت.
- أساسيات SEO لجافاسكربت — العرض على موجتين والمحتوى المحمّل بتكاسل في DOM.
- أساسيات الويب الأساسية — CWV كإشارة ترتيب (INP، LCP، CLS).
اقتباسات من المصدر
تصريحات رسمية من مبتكر Qwik والوثائق الرسمية. تأكد من الصياغة مقابل الصفحات الحية قبل اعتبار أي اقتباس نهائيًا.
ميشكو هيفري — مبتكر Qwik، builder.io
- “Hydration is when an application is downloaded and executed twice, once as HTML and again as JavaScript.” (ترجمة) «الترطيب هو عندما يتم تنزيل التطبيق وتنفيذه مرتين، مرة كـ HTML ومرة كـ JavaScript.» — “Resumability vs Hydration,” builder.io. اقرأ المنشور
- “Resumability is a way for a framework to recover its state without re-executing the application components on the client.” (ترجمة) «قابلية الاستئناف هي طريقة لإطار العمل لاستعادة حالته دون إعادة تنفيذ مكونات التطبيق على العميل.» — “Resumability vs Hydration,” builder.io. اقرأ المنشور
- “Hydration must execute before the app becomes interactive. Yes, the execution may be lazy, but the button will not process events until Hydration executes.” (ترجمة) «يجب تنفيذ الترطيب قبل أن يصبح التطبيق تفاعليًا. نعم، قد يكون التنفيذ كسولًا، لكن الزر لن يعالج الأحداث حتى يتم تنفيذ الترطيب.» — “Resumability vs Hydration,” builder.io. اقرأ المنشور
وثائق Qwik الرسمية (qwik.dev)
- “Your sites and apps can boot with about 1kb of JS (regardless of application complexity).” (ترجمة) «يمكن لمواقعك وتطبيقاتك أن تبدأ بحوالي 1 كيلوبايت من JavaScript (بغض النظر عن تعقيد التطبيق).» — Qwik Docs, Overview. المصدر
- “Qwik apps work instantly without any delay because they don’t need hydration, regardless of their size or complexity.” (ترجمة) «تطبيقات Qwik تعمل فورًا دون أي تأخير لأنها لا تحتاج إلى ترطيب، بغض النظر عن حجمها أو تعقيدها.» — Qwik Docs, Resumability. المصدر
- “QwikCity is to Qwik, as Next.js is to React, Nuxt is to Vue, SvelteKit to Svelte, and Analog is to Angular.” (ترجمة) «QwikCity بالنسبة إلى Qwik، مثل Next.js بالنسبة إلى React، وNuxt بالنسبة إلى Vue، وSvelteKit بالنسبة إلى Svelte، وAnalog بالنسبة إلى Angular.» — QwikCity Docs, Overview. المصدر
- “Thanks to Qwik’s resumability and JavaScript streaming, there is no additional cost to the end user from Qwik City. (zero JavaScript).” (ترجمة) «بفضل قابلية الاستئناف في Qwik وتدفق JavaScript، لا توجد تكلفة إضافية على المستخدم النهائي من Qwik City. (صفر JavaScript).» — QwikCity Docs, Overview. المصدر
قائمة فحص SEO لـ Qwik
مرور لتأكيد أن موقع QwikCity مُعد للترتيب:
- أنت تستخدم QwikCity (الإطار الفوقي) مع SSR أو SSG — وليس المكتبة المجردة في وضع العميل فقط.
- عرض المصدر يُظهر المحتوى الحقيقي وروابط
<a href>في HTML الخام (وليس قشرة فارغة). - بيانات الصفحة الديناميكية تُجلب باستخدام
routeLoader$()(من جانب الخادم)، وليس تأثيرًا من جانب العميل. - العنوان والوصف ووسوم OG مُعينة عبر تصدير
head— وكـ دالة تُغذى بواسطةresolveValue()للصفحات الديناميكية. - عناوين Canonical موجودة في
head.linksكـ{ rel: 'canonical', href: '...' }. - JSON-LD موجود في
head.scriptsمعtype: 'application/ld+json'. -
sitemap.xmlمُهيأ —sitemapOutFileلـ SSG، أو مسارsrc/routes/sitemap.xml/index.tsلـ SSR. -
robots.txtموجود في/public/. - رؤوس Cache-Control مُعينة على استجابات SSR (SSR حافة لـ TTFB منخفض).
- وسوم hreflang موجودة في
head.linksإذا كان الموقع متعدد اللغات؛ عناوين URL مترجمة عبرrewriteRoutes. - INP / LCP / CLS تم التحقق منها في الميدان (CrUX / Search Console)، وليس فقط في المختبر.
- لا يعتمد أي محتوى حاسم على كود غير قابل للتسلسل (مثيلات فئات، وعود، تدفقات) خاص بالعميل فقط.
النماذج الذهنية
1. استئنف، لا تُعد التشغيل. الفكرة الوحيدة وراء Qwik. كل إطار عمل رئيسي آخر يعيد تشغيل التطبيق في المتصفح (الترطيب) لجعل HTML الخاص بـ SSR تفاعليًا. Qwik يستأنف من الحالة المسلسلة في HTML، مع تشغيل قدر ضئيل جدًا من JavaScript عند التحميل. إذا استوعبت شيئًا واحدًا، فاجعل هذا هو.
2. HTML هو المحتوى. لأنه لا توجد خطوة عرض من جانب العميل، ما يجلبه الزاحف هو الصفحة النهائية. لا توجد موجة ثانية للانتظار، ولا خطر “هل تم العرض؟”. تعامل مع صفحة Qwik مثل HTML ثابت لأغراض الزحف والفهرسة.
3. بيانات من جانب الخادم → بيانات وصفية.
السلسلة التي تحدد ما إذا كانت وسومك الوصفية قابلة للزحف:
routeLoader$() (خادم) → دالة تصدير head → HTML <head>. كسر
السلسلة عن طريق الجلب في تأثير عميل وستسقط عنوانك/OG/Canonical من
HTML الموجة الأولى.
4. SSG مقابل SSR هو قرار استضافة/حداثة، وليس قرار SEO. كلاهما يضع المحتوى في HTML. اختر SSG للمحتوى الثابت (استضافة مجانية، خريطة موقع تلقائية) وSSR للبيانات حسب الطلب (شغّلها عند الحافة، وخزّن الاستجابات). قابلية الزحف جيدة في كلتا الحالتين.
5. مكسب الأداء هو INP/TBT، وليس قابلية الزحف. React/Next.js يقدمان بالفعل محتوى SSR للزواحف. ما يضيفه Qwik هو غياب ضريبة الـ hydration — وهنا تكمن ميزة CWV الخاصة به. لا تلجأ إلى Qwik لـ”إصلاح زحف React الذي لا يمكنه”؛ بل لجأ إليه عندما تكون الاستجابة هي الرافعة.
Qwik SEO — ورقة الغش
أين يذهب كل عنصر SEO (كلها في تصدير head)
| العنصر | المكان | النمط |
|---|---|---|
| العنوان | head.title | سلسلة (أو دالة للديناميكي) |
| وصف الميتا / OG | head.meta | [{ name/property, content }] |
| الرابط الأساسي | head.links | { rel: 'canonical', href: '...' } |
| hreflang | head.links | { rel: 'alternate', hreflang, href } |
| JSON-LD | head.scripts | { props: { type: 'application/ld+json' }, script } |
| البيانات الديناميكية | routeLoader$() | من جانب الخادم؛ اقرأها عبر resolveValue() |
SSG مقابل SSR لـ SEO
| SSG (محول ثابت) | SSR | |
|---|---|---|
| المحتوى في HTML | ✅ | ✅ |
| خريطة الموقع | تلقائية (sitemapOutFile) | أضف مسار /sitemap.xml |
| الاستضافة | ملفات ثابتة / CDN | خادم / بيئة حافة |
| الأفضل لـ | محتوى مستقر | حسب الطلب / مخصص |
| التخزين المؤقت | مضمّن | اضبط Cache-Control بنفسك |
الاستئناف مقابل الـ hydration (التمييز الوحيد المهم)
| Hydration (React/Vue/Angular/SolidJS) | الاستئناف (Qwik) | |
|---|---|---|
| عمل المتصفح عند التحميل | إعادة تنفيذ المكونات | استئناف من الحالة المسلسلة |
| JS عند التحميل | يتوسع مع التطبيق | ~1 كيلوبايت (Qwikloader) |
| TBT / INP | أعلى | قريب من الصفر |
| المحتوى في HTML | نعم (مع إطار عمل ميتا) | نعم (دائمًا) |
الأخطاء الشائعة
- ❌ تعيين وسوم الميتا من تأثير عميل → ليست في HTML الموجة الأولى. استخدم
head+routeLoader$(). - ❌ تسمية Qwik بـ”الـ hydration الكسول” → إنه لا يقوم بالـ hydration على الإطلاق؛ بل يستأنف.
- ❌ نسيان خريطة موقع SSR → SSR ليس لديه خريطة موقع تلقائية؛ أضف المسار.
تحقق من HTML المولد بواسطة Qwik
وجّه BUILD_DIR إلى مخرجات HTML من البناء الإنتاجي:
BUILD_DIR=dist
find "$BUILD_DIR" -name '*.html' -type f | while IFS= read -r file; do
titles=$(grep -Eio '<title>[^<]*</title>' "$file" | wc -l | tr -d ' ')
canonicals=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$file" | wc -l | tr -d ' ')
descriptions=$(grep -Eio '<meta[^>]+name=["'"']description["'"'][^>]*>' "$file" | wc -l | tr -d ' ')
if [ "$titles" -ne 1 ] || [ "$canonicals" -ne 1 ] || [ "$descriptions" -ne 1 ]; then
printf '%s\ttitle=%s\tcanonical=%s\tdescription=%s\n' "$file" "$titles" "$canonicals" "$descriptions"
fi
doneهذا يلتقط المسارات التي تكون فيها دالة head الخاصة بـ Qwik City مفقودة أو مكررة. لا يستبدل التحقق من أداء الحقول والمحتوى المعروض على عناوين URL المنشورة.
أدوات لتدقيق موقع Qwik
- عرض المصدر (
view-source:في المتصفح) — أسرع فحص: هل المحتوى والعنوان والرابط الأساسي وJSON-LD موجودون فعليًا في HTML الخام، أم فقط في DOM المعروض؟ - Google Search Console — URL Inspection — تأكد من أن HTML المعروض يطابق المصدر: المحتوى موجود، لا
noindexمحقون عبر JS، الرابط الأساسي محسوم. - PageSpeed Insights / CrUX — Core Web Vitals الميدانية (INP, LCP, CLS). هنا يجب أن تظهر ميزة الاستئناف في Qwik فعليًا.
- Chrome DevTools (Performance / Lighthouse) — TBT المخبري وعمل الخيط الرئيسي؛ تأكد من أن JS البدء قريب من الصفر عمليًا.
- Rich Results Test — تحقق من صحة JSON-LD الذي أضفته عبر
head.scripts. - زواحف المواقع (Ahrefs Site Audit, Screaming Frog) — ازحف الموقع المعروض للتحقق من العناوين والروابط الأساسية وhreflang والروابط الداخلية على نطاق واسع.
أخطاء يرتكبها الناس فعليًا على Qwik
الاستئناف يزيل معظم مخاطر JS-SEO التي تتعثر بها الأطر الأخرى، لكن هذه هي الطرق الحقيقية التي لا تزال الفرق تطلق النار على أقدامها بها على Qwik.
تعيين البيانات الوصفية من تأثير جانب العميل
الخطأ: سحب عنوان أو وصف منشور إلى useSignal() أو
useResource$() يعمل في المتصفح، ثم محاولة تعيين عنوان الصفحة من تلك القيمة.
لماذا هو خطأ: أي شيء يُحسب من جانب العميل يعمل بعد أن يرسل الخادم استجابته. لا يصل أبدًا إلى HTML الذي يجلبه Googlebot في أول مرور — يظهر فقط في DOM المعروض، وهو بالضبط تأخير موجة العرض الذي كان من المفترض أن يتجنبه الاستئناف لك.
ما يجب فعله بدلاً من ذلك: اجلب البيانات باستخدام routeLoader$() (من جانب الخادم) واجعل تصدير head للمسار دالةً تتغذى من resolveValue()، كما هو موضح في علامة التبويب “متقدم”. هذا هو المسار الوحيد الذي يُدخل البيانات الوصفية في HTML الخاص بالموجة الأولى.
تشغيل Qwik بدون QwikCity
الخطأ: استخدام مكتبة Qwik المجردة في وضع العميل فقط — بدون إطار عمل فوقي، وبدون عرض من الخادم — لأن “قابلية الاستئناف لا تحتاج إلى ترطيب، لذا لا تحتاج إلى SSR أيضًا.”
لماذا هو خطأ: تصف قابلية الاستئناف ما يحدث بعد وجود HTML. إذا لم يُعرض HTML على الخادم في المقام الأول، فلا يوجد شيء لاستئنافه — ستعود إلى قشرة فارغة لبرامج الزحف، لا تختلف عن أي SPA تعمل بالعميل فقط.
ما يجب فعله بدلاً من ذلك: استخدم QwikCity (أو محول عرض من الخادم آخر) لأي شيء مواجه للجمهور. هذا ما ينتج فعليًا HTML المعروض من الخادم الذي يمنح Qwik ميزة SEO الخاصة بها.
افتراض أن SSR يحصل تلقائيًا على خريطة موقع
الخطأ: نشر موقع Qwik مع SSR وتوقع وجود sitemap.xml لأنه “يعمل تلقائيًا” في بناء SSG.
لماذا هو خطأ: خريطة الموقع التلقائية هي ميزة وقت البناء للمحول الثابت (sitemapOutFile). مواقع SSR تُعرض لكل طلب — لا توجد خطوة بناء لتوليد ملف XML ثابت منه، لذا لا يُنتج أي شيء واحدًا إلا إذا أضفته.
ما يجب فعله بدلاً من ذلك: أضف مسارًا في src/routes/sitemap.xml/index.ts مع RequestHandler يبني ويعيد XML ديناميكيًا، كما هو موضح في علامة التبويب “متقدم”.
وضع بيانات غير قابلة للتسلسل في أي شيء يحتاج الخادم إلى استئنافه
الخطأ: تخزين مثيل فئة، أو وعد مفتوح، أو مرجع دفق في حالة يعتمد عليها تصدير head أو مكوّن معروض من الخادم.
لماذا هو خطأ: تسلسل Qwik يتعامل فقط مع القيم البسيطة القابلة للتسلسل — أي شيء آخر لا يمكن كتابته في HTML في وقت SSR، مما يكسر الآلية الدقيقة (قابلية الاستئناف) التي تجعل قصة SEO الخاصة بـ Qwik تعمل.
ما يجب فعله بدلاً من ذلك: أبقِ الكائنات غير القابلة للتسلسل خاصة بالعميل وخارج أي شيء يغذي البيانات الوصفية أو ترميز HTML المعروض من الخادم. حوّلها إلى بيانات بسيطة (قيمة محلولة، وليس الوعد أو مثيل الفئة) قبل أن تلمس routeLoader$() أو head.
تسمية Qwik “ترطيب كسول” في عرض تقديمي للعميل أو ملاحظة تدقيق
الخطأ: وصف سلوك Qwik كنسخة أسرع أو أكسل من الترطيب عند توثيق تدقيق أو إحاطة فريق تطوير.
لماذا هو خطأ: يضع توقعًا خاطئًا — “الترطيب الكسول” يوحي بأن المتصفح يعيد تنفيذ كل مكوّن في النهاية، فقط لاحقًا. Qwik لا يعيد تنفيذ المكوّنات عند التحميل إطلاقًا؛ هذا هو جوهر قابلية الاستئناف، والتمييز يغير ما ستبحث عنه عندما يكون شيء ما بطيئًا.
ما يجب فعله بدلاً من ذلك: استخدم “يستأنف” و”قابلية الاستئناف”، مطابقًا لمصطلحات الوثائق الخاصة بها، وتحقق من سكربت الإقلاع ~1 KB الخاص بـ Qwikloader في DevTools إذا كنت بحاجة إلى إثبات ادعاء “بدون ترطيب” لصاحب مصلحة متشكك.
مؤشرات الأداء الرئيسية الثابتة لموقع Qwik
هذه هي الأرقام التي يجب تتبعها بشكل مستمر، وليس فحص إطلاق لمرة واحدة — عرض القيمة الكامل لـ Qwik هو قصة أداء وقابلية زحف، لذا يحتاج كلا الجانبين إلى مقياس.
INP (ميداني)
ما يخبرك به: ما إذا كان الزوار الحقيقيون يعانون فعليًا من استجابة منخفضة تكلفة الترطيب التي يفترض أن تقدمها Qwik. هذا هو المقياس الذي صُممت بنية Qwik لتحقيقه بشكل مباشر.
كيفية سحبه: تقرير Core Web Vitals في Google Search Console، أو CrUX، أو CWV Checker الخاص بـ Patrick / Core Web Vitals History & Competitor Comparison لقراءة ميدانية لكل عنوان URL أو لكل أصل.
المعيار / النطاق الواقعي: الحد المنشور من Google هو “جيد” عند أو تحت 200ms، “يحتاج تحسينًا” 200–500ms، “ضعيف” فوق 500ms — نفس الحد لكل موقع، وليس خاصًا بـ Qwik. موقع قابل للاستئناف مع إقلاع نظيف لـ Qwikloader يجب أن يقع بشكل مريح في “جيد”، لكن جزءًا متضخمًا لكل تفاعل أو سكربت طرف ثالث ثقيل يمكن أن يرفعه.
الإيقاع: شهريًا، أو بعد أي إصدار يغيّر معالجات التفاعل؛ بيانات CrUX نفسها هي نافذة متدحرجة مدتها 28 يومًا.
TBT (مختبري)
ما يخبرك به: مقدار العمل على الخيط الرئيسي الذي يحدث عند التحميل في اختبار مُتحكم به — هنا ستكتشف تراجعًا قبل أن يظهر في INP الميداني.
كيفية سحبه: لوحة Lighthouse أو لوحة الأداء في Chrome DevTools، تُشغَّل ضد عنوان URL المباشر (وليس localhost، حيث تكون النتائج منخفضة بشكل مضلل).
المعيار / النطاق الواقعي: لا يوجد رقم “Qwik جيد” عالمي —
يعتمد على ما هو موجود في الصفحة (برامج نصية تابعة لجهات خارجية، عمل فك تشفير الصور،
تكلفة routeLoader$() على مستوى المسار). ما تتحقق منه هو أن TBT
يبقى قريبًا من الصفر مقارنة بنسخة مكافئة من الصفحة تستخدم الترطيب، وليس
مقابل هدف ثابت.
الإيقاع: قبل/بعد أي نشر يضيف نصًا برمجيًا لطرف ثالث، أو علامة تحليلات، أو مكوّنًا تفاعليًا جديدًا.
تغطية الصفحات المفهرسة
ما يخبرك به: ما إذا كان Google يزحف ويفهرس فعليًا الصفحات التي تتوقعها — الدليل العملي على أن “المحتوى موجود في HTML افتراضيًا” يترجم إلى فهرسة، وليس مجرد ميزة نظرية.
كيفية سحبه: تقرير فهرسة الصفحات في Search Console، مُصفى لبادئة عنوان URL لموقع Qwik؛ تحقق من ذلك مقابل عدد عناوين URL المُرسلة في خريطة موقعك.
المعيار / النطاق الواقعي: يعتمد كليًا على حجم الموقع وكم تعتزم فهرسته — لا يوجد هدف ثابت. تتبع الاتجاه (العدد المفهرس يتحرك نحو العدد المُرسل) بدلاً من مطاردة رقم محدد.
الإيقاع: أسبوعيًا أثناء وبعد الترحيل إلى Qwik؛ شهريًا بمجرد الاستقرار.
JS المنقول عند التحميل
ما يخبرك به: ما إذا كان ادعاء “الإقلاع بحوالي 1 كيلوبايت” صامدًا في الممارسة، أو ما إذا كانت البرامج النصية التابعة لجهات خارجية والكتل الأولية الضخمة قد أكلت من الميزة الهيكلية لـ Qwik.
كيفية سحبه: لوحة الشبكة في Chrome DevTools، مُصفاة إلى JS، على تحميل بارد مع تعطيل ذاكرة التخزين المؤقت.
المعيار / النطاق الواقعي: مُحمّل Qwikloader نفسه حوالي 1 كيلوبايت؛ أي شيء أكبر بشكل ملحوظ عند التحميل الأولي يأتي من شيء آخر في الصفحة (تحليلات، إعلانات، polyfill) — حقق في الأمر بدلاً من المقارنة مقابل رقم ثابت، حيث يُتوقع تباين من صفحة إلى أخرى.
الإيقاع: بعد أي تغيير في علامات الطرف الثالث، أو التحليلات، أو مكوّنات التخطيط المشتركة.
اختبر نفسك: Qwik SEO
خمسة أسئلة سريعة حول قابلية الاستئناف وجعل موقع QwikCity يحتل المراتب. اختر إجابة لكل سؤال، ثم تحقق.
موارد تستحق وقتك
كتاباتي ذات الصلة
- JavaScript SEO: A Definitive Guide — العرض، وتطابق DOM، وفهرسة المحتوى المبني بـ JS؛ الأساس الذي يبني عليه تدقيق Qwik.
- Core Web Vitals: A Complete Guide — ما تقيسه INP وLCP وCLS وكيف تؤثر في SEO — المقاييس التي تحسّنها بنية Qwik.
- The Beginner’s Guide to Technical SEO — أين يقع اختيار الإطار والعرض في الصورة الأكبر.
محاضراتي
- How Search Works (SlideShare) — شرحي للزحف والعرض والفهرسة والترتيب — خط الأنابيب الذي يجب أن يجتازه موقع Qwik. (ينطبق إخلاء المسؤولية الدائم الخاص بي: “This is my understanding of systems… not going to be 100% complete or accurate.”) (ترجمة) «هذا هو فهمي للأنظمة… لن يكون مكتملاً أو دقيقًا بنسبة 100%.»
من حول الصناعة
- Qwik — قابلية الاستئناف — أوضح شرح من المصدر الأساسي لكيفية استبدال التسلسل للترطيب.
- نظرة عامة على QwikCity — الإطار الفوقي: التوجيه، SSR/SSG، المُحمِّلات.
- Qwik — الصفحات / DocumentHead — تصدير
head،routeLoader$()، الرأس الديناميكي، والبيانات المنظمة. - Qwik — خرائط المواقع — إنشاء sitemap.xml و robots.txt.
- Builder.io — قابلية الاستئناف مقابل الترطيب — Miško Hevery حول لماذا يتم “تنفيذ الترطيب مرتين” وكيف تتجنبها قابلية الاستئناف.
- Google — أساسيات SEO لجافا سكريبت — العرض على مرحلتين وما تفعله الزواحف مع JS.
- r/TechSEO — المجتمع لتصحيح أخطاء عرض الأطر وأسئلة الفهرسة.
سجل التغييرات
تم التحديث في 11 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 11 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 6 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 18 يوليو 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.