الموارد التي تحجب العرض

ما الموارد التي تحجب العرض، وكيف تؤخر CSS وJavaScript المتزامنة مسار العرض الحرج وCore Web Vitals بصورة غير مباشرة، وكيفية العثور عليها وإصلاحها عبر async وdefer وCSS الحرج واستعلامات media.

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

الموارد التي تحجب العرض هي ملفات CSS وJavaScript المتزامنة التي يجب على المتصفح تنزيلها ومعالجتها قبل الرسم. تحجب ورقة أنماط منطبقة في head العرض افتراضياً، وتحجب وسم script في head بلا async أو defer المحلل افتراضياً؛ وتُؤجل نصوص الوحدات افتراضياً. تُنزّل async بالتوازي وتنفذ عند الجاهزية بلا ترتيب، بينما تُنزّل defer بالتوازي وتنفذ بعد التحليل وبالترتيب. قد تؤخر هذه الموارد FCP وLCP، ويُستخدم LCP ضمن أنظمة ترتيب Core Web Vitals لدى Google، لكنه ليس عامل ترتيب مهيمناً موثقاً. تدخل كل الصفحات المؤهلة ذات الحالة 200 طابور عرض Google بصرف النظر عن JavaScript، وحد 2 MB هو حد جلب لكل مورد لا عقوبة خاصة بحجب العرض. اعثر على العوائق عبر Insight في Lighthouse 13 وCoverage في DevTools، وأصلحها بتأجيل JS غير الحرجة وتضمين CSS الحرج فقط عند ثبوت عنق الزجاجة واستخدام media، ثم أعد الاختبار.

الخلاصة — تؤخر الموارد التي تحجب العرض أول رسم للصفحة. تحجب ورقة CSS منطبقة في <head> العرض افتراضياً، أما media غير المطابقة أو disabled أو الإدراج الديناميكي بلا blocking="render" صريح فلا تفعل. ويحجب وسم <script> تقليدي أدرجه المحلل بلا async/defer المحلل افتراضياً، فتوقف تحليل HTML؛ وهذه آلية مرتبطة بنموذج سمة «حجب العرض» الرسمي لكنها متميزة عنه. يحمّل async بالتوازي وينفذ عند اكتمال التنزيل بلا ترتيب وقد يقاطع التحليل؛ ويحمّل defer بالتوازي وينفذ بعد تحليل HTML وبالترتيب؛ وتُؤجل نصوص الوحدات البرمجية افتراضياً. قد تؤخر هذه العوائق FCP وLCP، وتستخدم أنظمة ترتيب Google مقياس LCP، لكنه عامل ترجيح لا عاملاً مهيمناً، ولا توثق Google وزناً مباشراً لحجب العرض. تجلب Google بحد أقصى 2 MB لكل عنوان غير PDF، بما في ذلك الترويسات، وبصورة منفصلة لكل ملف JS/CSS مشار إليه؛ وهذا حد اقتطاع لا عقوبة خاصة بحجب العرض. كما تدخل كل الصفحات المؤهلة ذات الحالة 200 طابور العرض، سواء استخدمت JavaScript أم لا. اعثر على العوائق عبر Insight ‏“Render blocking requests” في Lighthouse 13 وتبويب Coverage في DevTools؛ وأصلحها عبر defer وCSS الحرج فقط عندما يثبت التتبع أنه عنق الزجاجة، وسمات media وإزالة الشيفرة غير المستخدمة، ثم أعد الاختبار بتتبعات متطابقة ومتكررة.

Evidence for this claim Stylesheets participate in the critical rendering path and can block first render until CSS is processed. Scope: Current official or standards documentation. Confidence: high · Verified: web.dev: Critical rendering path Evidence for this claim Classic scripts without async or defer can block HTML parsing while fetched and executed. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: script element

مسار العرض الحرج

لرسم صفحة، ينفذ المتصفح تسلسلاً ثابتاً: يحلل HTML إلى DOM، ويحلل CSS إلى CSSOM، ويجمعهما في شجرة عرض، ثم يحدد التخطيط ويرسم. هذا التسلسل هو مسار العرض الحرج، وكل ما يعطله يؤخر البكسل الأول. وكما صاغه Ilya Grigorik من Google، “optimizing the critical rendering path refers to prioritizing the display of content that relates to the current user action.” (ترجمة): «يشير تحسين مسار العرض الحرج إلى إعطاء الأولوية لعرض المحتوى المرتبط بإجراء المستخدم الحالي.» والموارد التي تحجب العرض هي العناصر الجالسة في ذلك المسار ويدها مرفوعة، فتجعل المتصفح ينتظر.

يحجب CSS العرض افتراضياً — عندما يكون منطبقاً

لا يرسم المتصفح المحتوى المنسق حتى يبني CSSOM من كل ورقة أنماط حاجبة منطبقة، ومرجع <link> لدى MDN صريح في النطاق: “only link elements in the document’s <head> can possibly block rendering. By default, a link element with rel="stylesheet" in the <head> blocks rendering when the browser discovers it during parsing.” (ترجمة): «لا يمكن أن تحجب العرض إلا عناصر link الموجودة في head بالمستند. وافتراضياً، يحجب عنصر link ذي rel=“stylesheet” في head العرض عندما يكتشفه المتصفح أثناء التحليل.» ومن دليل Optimize LCP في web.dev: “Style sheets loaded from the HTML markup will block rendering of all content that follows them.” (ترجمة): «ستحجب أوراق الأنماط المحملة من ترميز HTML عرض كل المحتوى الذي يليها.» وهذا مقصود، لأن رسم HTML بلا تنسيق ثم إعادة تنسيقه ينتج وميضاً قبيحاً، لكن لعبارة «افتراضياً» حدوداً حقيقية:

  • تُجلب ورقة الأنماط ذات سمة media غير المطابقة، مثل media="print" عند زيارة الشاشة، لكنها لا تحجب.
  • لا تُحمّل ورقة الأنماط ذات disabled ولا تُطبق حتى تزيل السمة.
  • لا تحجب ورقة الأنماط المضافة ديناميكياً عبر نص برمجي العرض إلا إذا ضبطت عليها أيضاً blocking="render" صراحة؛ فالإدراج الديناميكي يعطل السلوك الافتراضي.

ضمن هذا النطاق المنطبق، تظل ورقة الأنماط الحاجبة المتضخمة قادرة على احتجاز الصفحة كلها: فعندما يستغرق تحميلها وقتاً أطول من صورة LCP نفسها، لا يستطيع عنصر LCP الظهور حتى بعد اكتمال تنزيل مورده.

النصوص البرمجية: تحجب المحلل افتراضياً، وتحجب العرض عند الطلب رسمياً

يحجب وسم <script> تقليدي أدرجه المحلل في <head> بلا async أو defer المحلل افتراضياً: يتوقف المتصفح عن بناء DOM، ويجلب النص البرمجي وينفذه، ثم يستأنف. وتوضح وثائق PageSpeed القديمة من Google التكلفة: “whenever the parser encounters a script it has to stop and execute it before it can continue parsing the HTML. In the case of an external script the parser is also forced to wait for the resource to download, which may incur one or more network roundtrips and delay the time to first render of the page.” (ترجمة): «كلما صادف المحلل نصاً برمجياً، يتعين عليه التوقف وتنفيذه قبل متابعة تحليل HTML. وفي حالة نص برمجي خارجي، يُجبر المحلل أيضاً على انتظار تنزيل المورد، مما قد يتطلب رحلة شبكة ذهاباً وإياباً واحدة أو أكثر ويؤخر وقت العرض الأول للصفحة.» وكما يقول دليل Optimize LCP بصراحة: “it is almost never necessary to add synchronous scripts… to the <head> of your pages.” (ترجمة): «يكاد لا يكون من الضروري أبداً إضافة نصوص برمجية متزامنة إلى head في صفحاتك.»

تجدر الدقة هنا: حجب المحلل ونموذج سمة حجب العرض الرسمي في مواصفة HTML آليتان مرتبطتان لكنهما متميزتان. ووفق مرجع <script> لدى MDN، فإن الرمز blocking="render" “explicitly indicates that certain operations should be blocked until the script has executed,” (ترجمة): «يشير صراحة إلى وجوب حجب عمليات معينة حتى تنفيذ النص البرمجي،» كما أن “only script elements in the document’s <head> can possibly block rendering” (ترجمة): «لا يمكن أن تحجب العرض بهذه الطريقة إلا عناصر script الموجودة في head بالمستند»، و*“if such a script element is added dynamically via script, you must set blocking = "render" for it to block rendering.”* (ترجمة): «إذا أضيف عنصر script كهذا ديناميكياً عبر نص برمجي، فيجب ضبط blocking = “render” عليه كي يحجب العرض.» عملياً، تعطل وسم <head> الحاجبة للمحلل افتراضياً خط الأنابيب بما يكفي كيلا يغير التمييز ما تفعله غالباً؛ وتهم المسألة أساساً النصوص المدرجة ديناميكياً، التي تحتاج السمة الصريحة للمشاركة، كما أن دعم المتصفحات لـblocking="render" لا يزال محدوداً ويستحق التحقق قبل الاعتماد عليه.

إعداد افتراضي آخر ينبغي معرفته: تُؤجل نصوص type="module" افتراضياً، ولا تحتاج سمة defer، ما لم تُضف async لتغيير الجدولة.

الفرق بين async وdefer — ليستا متماثلتين

هذا أهم تمييز منفرد لإصلاح JavaScript التي تحجب العرض. ينزل كلاهما النص البرمجي بالتوازي مع تحليل HTML، فلا يحجب أيهما المحلل أثناء التنزيل. لكنهما يختلفان في التنفيذ:

  • async — تنفذ فوراً عند اكتمال التنزيل، مما قد يقاطع التحليل، وتعمل بلا ترتيب مضمون. تناسب النصوص الخارجية المستقلة حقاً، مثل التحليلات والإعلانات، التي لا تتعامل مع DOM ولا تعتمد بعضها على بعض.
  • defer — تنفذ بعد اكتمال تحليل HTML، بترتيب المستند. تناسب النصوص التي تعتمد على DOM أو بعضها على بعض، أي معظم شيفرتك.
  • نصوص الوحدات (type="module") — مؤجلة افتراضياً؛ أضف async إذا أردت تحديداً التنفيذ وفق ترتيب جاهزية الوحدات.

إذا أردت تذكر قاعدة واحدة: استخدم defer لكل ما يعتمد على ترتيب أو على DOM، وasync فقط للنصوص الخارجية المستقلة التي لا يهم انتظارها.

كيف يؤثر ذلك في SEO؟

السلسلة حقيقية، لكن لها حدود حقيقية. لا تبالغ فيها في أي من الاتجاهين:

  1. تؤخر الموارد التي تحجب العرض First Contentful Paint، أي لحظة ظهور أي محتوى أول مرة.
  2. قد تؤخر Largest Contentful Paint، مقياس التحميل الأساسي لدى Google، لكن وجود مورد معلّم لا يثبت أنه عنق الزجاجة المهيمن في البيانات الميدانية، وإزالته لا تضمن تحسن LCP؛ إذ يبلغ Insight في Lighthouse عن تأخير محتمل من تتبع واحد، لا عن أثر ميداني مضمون.
  3. LCP مقياس من Core Web Vitals، يُقاس عند الشريحة المئوية 75 من بيانات ميدانية حقيقية خلال 28 يوماً، وتقول Google إن Core Web Vitals “are used by our ranking systems.” (ترجمة): «تستخدمها أنظمة الترتيب لدينا.» والحد «الجيد» لـLCP هو ≤2٫5 s.
  4. لا تحدد وثائق تجربة الصفحة لدى Google وزناً أو سلسلة أو عامل ترجيح مباشر لحجب العرض، ولا تقدم ضماناً للترتيب بعد إزالة العوائق؛ فهي تقول إن الملاءمة تظل الحاسمة، لكن “having a great page experience can contribute to success in Search” (ترجمة): «قد تسهم تجربة صفحة رائعة في النجاح في البحث» عندما يوجد قدر كبير من المحتوى المفيد المتشابه للاختيار منه.

حافظ على صدق الوزن. تمثل عبارة Martin Splitt المعايرة الصحيحة: “a fast website is a little more helpful than a slow website,” (ترجمة): «الموقع السريع أكثر فائدة بقليل من الموقع البطيء،» لكن “content is still the king.” (ترجمة): «المحتوى لا يزال الملك.» يستحق إصلاح المورد الذي يؤخر LCP فعلاً من أجل تجربة المستخدم وبوصفه مدخلاً من مدخلات عديدة تزنها أنظمة Google؛ وليس رافعة ذات مضاعف ترتيب مخصص وموثق.

زاوية كفاءة الزحف — بعد التصحيح

كنت قد صغت سابقاً JavaScript الثقيلة التي تحجب العرض بوصفها شيئاً «يدفع» الصفحات إلى طابور العرض أو «يجبرها» عليه. هذا غير دقيق، ويستحق تصحيحاً صريحاً: تنص وثائق JavaScript SEO الحالية لدى Google على أن “all pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (ترجمة): «تُرسل كل الصفحات ذات رمز حالة HTTP ‏200 إلى طابور العرض، بصرف النظر عن وجود JavaScript في الصفحة.» تدخل كل صفحة مؤهلة ذلك الطابور، ولا تنشئ الموارد التي تحجب العرض مدخلاً خاصاً إليه.

Evidence for this claim Google's current guidance says all eligible pages returning HTTP 200 enter its rendering queue regardless of whether JavaScript is present, so render-blocking JavaScript should not be claimed to force a page into that queue. Scope: crawling, rendering, indexing Confidence: high · Verified: Understand the JavaScript SEO basics

ما يغيره نوع المورد هو مقدار العمل الذي يحدث عند وصول الصفحة إلى العرض. وجدت تجربة Onely أن Google احتاجت وقتاً أطول 9 مرات للزحف الكامل إلى صفحات معروضة بـJavaScript مقارنة بصفحات HTML مطابقة (313 ساعة مقابل 36 ساعة) في إعداد اختبارهم، لأن “pages that require rendering have to wait in a rendering queue in addition to the crawl queue which applies to all pages.” (ترجمة): «الصفحات التي تتطلب العرض عليها انتظار طابور العرض إضافة إلى طابور الزحف الذي ينطبق على كل الصفحات.» تعامل مع ذلك دليلاً على أن المحتوى الذي يتطلب العرض على جانب العميل يحمل تكلفة حقيقية في وقت الفهرسة في تلك الدراسة، لا دليلاً على أن ملف CSS أو JS حاجباً بعينه هو ما يسبب الدخول إلى الطابور.

في حجم الملف، تصف وثائق الزحف لدى Google حد جلب يبلغ 2 MB لكل عنوان URL غير PDF، بما في ذلك ترويسات HTTP، ويطبق منفصلاً على كل مورد تطلبه؛ فيحصل نص برمجي كبير أو ورقة أنماط كبيرة في <head> على عداد 2 MB خاص به، لا ميزانية مشتركة مع HTML. وهذا حد جلب/اقتطاع لا «حد معالجة»، ولا توثق Google عقوبة خاصة للزحف أو الفهرسة مرتبطة تحديداً بالموارد التي تحجب العرض، عدا خطر الاقتطاع العام.

Evidence for this claim Google currently fetches up to 2 MB, including HTTP headers, for each individual non-PDF URL; referenced resources such as JavaScript and CSS have separate per-URL counters and the same 2 MB fetch limit. This supports a per-resource fetch boundary, but not the article's 'processing limit' wording or a special crawl/indexing penalty for render-blocking resources. Scope: fetching and WRS Confidence: high · Verified: Inside Googlebot: crawling 101

يجدر تفنيد أمر آخر هنا: لا يملك عارض Google مهلة زمنية ثابتة. وكما وثقت في دليلي إلى JavaScript SEO، “there is no fixed timeout for the renderer. It runs with a sped-up timer to see if anything is added at a later time.” (ترجمة): «لا توجد مهلة ثابتة للعارض. إنه يعمل بمؤقت مسرّع لمعرفة ما إذا كان شيء سيُضاف لاحقاً.» المشكلة ليست مهلة خمس ثوان؛ بل تأخير الطابور قبل بدء العرض.

ويمتد هذا الآن إلى زواحف الذكاء الاصطناعي. قال Gary Illyes عام 2026 إنه “if sites used relatively good HTML and no JavaScript (or SSR), both base model training, and web and agentic RAG would be a piece of cake from raw data processing perspective.” (ترجمة): «لو استخدمت المواقع HTML جيداً نسبياً وبلا JavaScript، أو استخدمت SSR، لكان تدريب النماذج الأساسية وRAG للويب والوكلاء أمراً سهلاً جداً من منظور معالجة البيانات الخام.» تمثل JavaScript الثقيلة على جانب العميل مشكلة تتجاوز Googlebot بكثير.

كيفية العثور عليها

  • لوحة Performance في Chrome DevTools / ‏Lighthouse 13 — يعرض Insight الحالي “Render blocking requests”، الذي انتقل إليه التدقيق الأقدم “Eliminate render-blocking resources” في Lighthouse 13، النصوص الموجودة في <head> من دون async/defer وأوراق الأنماط من دون disabled أو media غير مطابقة، ويقدر المللي ثواني الممكن توفيرها من تتبع واحد. ويقول Connor Clark: “render-blocking requests are network requests that prevent a page’s initial render, potentially delaying Largest Contentful Paint.” (ترجمة): «طلبات حجب العرض هي طلبات شبكة تمنع العرض الأولي للصفحة، وقد تؤخر Largest Contentful Paint.» إذا كنت تقرأ ناتجاً أقدم من PageSpeed Insights ما زال يقول “Eliminate render-blocking resources”، فهي الإشارة الأساسية نفسها تحت الاسم السابق لـLighthouse 13.
  • تبويب Coverage في Chrome DevTools — يعلّم البايتات بالأخضر إذا كانت حرجة ومستخدمة في الرسم الأول، وبالأحمر إذا لم تُستخدم حينه. كثرة CSS/JS الأحمر قائمة مرشحيك.
  • شلال WebPageTest — افحص كل شيء قبل خط Start Render.
  • شغله أكثر من مرة — يعكس التتبع الواحد حالة مدير الموافقة وتحميل وسوم الطرف الثالث والذاكرة المؤقتة وسلوك CSP في ذلك التشغيل. كرر التتبع بارداً ودافئاً قبل اعتبار المورد المعلّم حقيقة ثابتة.
Read a waterfall from left to right: first paint cannot cross the boundary until every required blocking request has finished.

An illustrative navigation contains HTML from 0 to 180 milliseconds, blocking CSS from 120 to 420 milliseconds, synchronous JavaScript from 210 to 610 milliseconds, a non-blocking analytics request from 250 to 500 milliseconds, and font loading from 420 to 610 milliseconds. First paint occurs at 610 milliseconds. The example explains timing mechanics; it is not a live trace.

كيفية إصلاحها

JavaScript

  • أجّل النصوص غير الحرجة عبر defer<script src="app.js" defer></script>. تنزيل متواز وتنفيذ مرتب بعد التحليل. وهذا الإعداد الافتراضي الآمن لشيفرتك.
  • استخدم async للنصوص الخارجية المستقلة<script src="analytics.js" async></script>. وذلك فقط عندما لا يهم الترتيب ولا جاهزية DOM فعلاً.
  • انقل النصوص إلى نهاية <body> — البديل الأقدم عندما يتعذر إضافة السمات؛ يصل إليها المحلل أخيراً.

CSS — قرارات مشروطة، لا أنماطاً شاملة

  • ضمّن CSS الحرج داخل الصفحة فقط عندما يبين التتبع أن CSS عنق الزجاجة الفعلي — استخرج الأنماط اللازمة للمحتوى الظاهر فوق الطية إلى كتلة <style> داخلية كي لا يحتاج الرسم الأول إلى رحلة شبكة. وينطبق تحذير Google: “inlining CSS is an advanced performance technique that can improve performance, but can also lead to bugs if not implemented properly.” (ترجمة): «تضمين CSS داخل الصفحة تقنية أداء متقدمة قد تحسن الأداء، لكنها قد تؤدي أيضاً إلى أخطاء إن لم تنفذ بصورة صحيحة.» ضمّن المجموعة الحرجة فقط، وعيّن مسؤولاً عن إعادة توليدها عند تغير القوالب، وافحص الانحراف عبر حالات الصفحة؛ فنسخة CSS حرج قديمة تعيد بصمت وميض المحتوى غير المنسق أو الأنماط المفقودة.
  • أجّل الباقي مع مطابقة الطلب بدقة — حمّل ورقة الأنماط الكاملة بنمط <link rel="preload" as="style" onload="this.rel='stylesheet'">. لا يُعاد استخدام preload للطلب النهائي إلا إذا تطابقت URL وas وtype و crossorigin/نمط CORS؛ ويسبب التلميح غير المطابق جلب المورد مرتين بدلاً من تجاوز رحلة الشبكة.
  • سمات media — تتيح media="print" أو media="(min-width: 900px)" للمتصفح تنزيل ورقة أنماط دون حجب العرض عندما لا يطابق الاستعلام.
  • أزل CSS غير المستخدم وصغّره — بيانات أقل للحجب وتنزيل أسرع.
  • تحقق قبل النشر — أعد فحص الجلبات المكررة/غير المستخدمة وFOUC وأي انزياح تخطيط جديد بعد تغيير CSS الحرج أو preload، عبر تتبع متكرر لا تشغيل محظوظ واحد.

خاص بالمنصة (WordPress) — تنفذ WP Rocket، لتأخير/تأجيل JS وتحسين تسليم CSS، وAutoptimize، لتنفيذ async/defer وتضمين CSS الحرج، وAsync JavaScript كل ما سبق عبر واجهات إضافات. فهي تطبق تقنيات async/defer/CSS الحرج نفسها، وفهم ما يفعله كل إعداد هو ما يجنبك كسر القالب.

قراءات ذات صلة في هذا الموقع

Add an expert note

Pin an expert quote

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