من شيفرات JavaScript في صفحة الهاتف الوسيطة ضمن تقرير Web Almanac لعام 2024، كان 168 كيلوبايت من الطرف الأول و375 كيلوبايت من أطراف ثالثة.1 فأكثر من نصف السكربت في صفحة عادية، من حيث الحجم، كتبه شخص غير مالك الموقع. ووجد فصل التقرير عن الأطراف الثالثة أنها موجودة في 92% من الصفحات، وأن السكربت هو أكثر أنواع طلبات الأطراف الثالثة شيوعًا.2 وسكربت شبكة الإعلانات، الذي يضيفه الناشر لحمل إعلاناتها، أحد تلك الطلبات. وما يكلّفه ذلك السكربت للصفحة وقت التحميل يتوقف على طريقة كتابة العنصر الذي يحمّله أكثر مما يتوقف على ما يفعله.

يتوقف المتصفح عند عنصر script لا يحمل أي سمة

بموجب معيار HTML الحي (HTML Living Standard)، للمتصفح ثلاث طرق للتعامل مع السكربت الخارجي، ولا تختلف إلا بسمة على العنصر.3 الأولى، دون أي من السمتين، هي الافتراضية: فالسكربت «يُجلب ويُقيَّم فورًا، مع حجب التحليل حتى يكتمل الأمران كلاهما». والثانية، defer، تجلب الملف بالتوازي مع التحليل وتقيّمه «حين تنتهي الصفحة من التحليل». وفي الثالثة، async، يُجلب الملف أيضًا بالتوازي لكنه يُقيَّم «بمجرد أن يصبح متاحًا (وربما قبل اكتمال التحليل)». والوضع الأول وحده يوقف المحلّل بينما يعبر الملف الشبكة، ولا يُرسم شيء بعد العنصر حتى يصل الملف.

ويحوّل تدقيق Lighthouse من Google هذا التمييز إلى اختبار يستطيع الناشر إجراءه على صفحته. فهو يَسِم أي عنصر script في head المستند لا يحمل defer ولا async.4 ويُدرج التقرير «جميع الروابط التي تحجب الرسم الأول لصفحتك». والحجم ليس جزءًا من هذا التعريف، ولا الغرض كذلك. فسكربت التحليلات، وسكربت الإعلانات، ومحمّل الخطوط تُعامَل جميعها على حدّ سواء إذا وُضعت في head دون سمة.

سكربت الطرف الثالث هو الحالة التي كُتبت من أجلها إرشادات التحميل

إرشادات web.dev صريحة بشأن السكربتات القادمة من خارج الموقع. فهي تقول إن السكربتات المتزامنة «تؤخّر بناء DOM والعرض»، وDOM هو نموذج المتصفح العامل للمستند.5 والقاعدة المترتبة على ذلك هي «تحميل سكربتات الأطراف الثالثة دائمًا بشكل غير متزامن ما لم يكن على السكربت أن يعمل قبل أن يمكن عرض الصفحة». فالسمة async تناسب السكربت الذي يجب أن يعمل مبكرًا في عملية التحميل؛ والسمة defer تناسب «الموارد الأقل أهمية»، ومثالها مشغّل فيديو أسفل حدّ الطيّ. وسكربت الإعلانات الذي يعمل بعد ظهور النص على الشاشة يندرج تحت عنوان الموارد الأقل أهمية وفق هذا الاختبار.

وقد انتشرت هذه الممارسة، وإن لم تصل إلى كل صفحة. فقد وجد تقرير Web Almanac لعام 2024 السمة async في 87% من الصفحات، ارتفاعًا من 76% عام 2022، والسمة defer في 47%، ارتفاعًا من 42%.1 وتصف هذه الأرقام الصفحات بمجملها. فالصفحة التي تكون سكربتاتها الخاصة مؤجَّلة قد تظل تحمل عنصرًا حاجبًا واحدًا قدّمه طرف ثالث. ومقتطف التثبيت، ما لم يعدّله الناشر، يُحمَّل بالطريقة التي كتبتها الشبكة.

السكربت الذي ينتظر DOM لا يملك رسمًا أول ليحجبه

يَسِم المتصفح اللحظة التي ينتهي فيها المحلّل من بناء DOM بحدث. ووفقًا لـ MDN، فإن DOMContentLoaded «يُطلَق حين يكون مستند HTML قد حُلّل بالكامل، وتكون جميع السكربتات المؤجَّلة» قد نُزّلت ونُفّذت.6 ولا ينتظر الحدث الصور، ولا الإطارات الفرعية، ولا السكربتات غير المتزامنة. لذلك فإن السكربت الذي يبدأ عمله في تلك اللحظة يبدأ بعد أن يكون النص موجودًا، دون انتظار آخر صورة.

وشيفرة تضمين AdBubbles، adbubbles.js، تُحمَّل بعد أن يصبح DOM الصفحة جاهزًا. وهي ملف ثابت واحد، يُقدَّم عبر ذاكرة التخزين المؤقت لدى Cloudflare ومكتوب بلغة JavaScript المجرّدة دون أي اعتماديات. والبيانات الخاصة بالموقع التي تقرؤها هي أيضًا ملف ثابت، يُعاد إنشاؤه عند تغيّر أي حملة ويُخزَّن مؤقتًا على الحافة. لذلك لا تكلّف مشاهدة الصفحة خادم الإعلانات شيئًا، والطلب الديناميكي الوحيد هو إشارة صغيرة. ولا تفحص شيفرة التضمين إلا النطاق الذي ضبطه الناشر، وتتخطّى العناوين، والروابط، والشيفرات البرمجية، والنص المنسَّق مسبقًا، وعناصر التحكم في النماذج، والتنقل، والترويسة، والتذييل، وكل ما يحمل data-noads. وتصف ملاحظات التثبيت إعداد النطاق.

فتح حساب ناشر لا يكلّف شيئًا، وكذلك إضافة شيفرة التضمين إلى موقع. والناشر الذي يضيف موقعًا يستطيع طلب زحف يبيّن أيّ كلماته قابلة للبيع حاليًا. ويُختار النطاق، والحد الأقصى للفقاعات في كل صفحة، وفئات المعلنين المستبعدة من الحساب نفسه.

الإشارة المرسلة عند مغادرة القارئ هي النصف الآخر من التكلفة

لحظة مغادرة القارئ هي الفرصة الأخرى للسكربت كي يبطئه. فشيفرات التحليلات التي تُبلغ عند تفريغ الصفحة اعتمدت ذات يوم على تقنيات مثل «استدعاء XMLHttpRequest متزامن حاجب».7 وتسجّل MDN أن جميع تلك الطرق «تحجب تفريغ المستند، مما يبطئ الانتقال إلى الصفحة التالية». والطريقة sendBeacon تحل محلها. فهي ترسل طلب HTTP POST صغيرًا بشكل غير متزامن. ويرسل المتصفح البيانات «حين تتاح لوكيل المستخدم فرصة لذلك، دون تأخير التفريغ أو الانتقال التالي».

وتُبلغ شيفرة التضمين باستخدام sendBeacon، وترسل ثلاثة أنواع من الإشارات. تُرسل مشاهدة واحدة لكل تحميل صفحة. ويُرسل فتح واحد حين تبقى الفقاعة ظاهرة لمدة ثانية واحدة، وتُرسل نقرة واحدة حين يتبع القارئ الرابط داخل الفقاعة. ولا يغادر الصفحةَ شيءٌ آخر.

لا تضع AdBubbles أي ملف تعريف ارتباط، ولا تخزّن أي معرّف، ولا تجمع أي بيانات شخصية من القرّاء. ويُقرأ بلد القارئ من ترويسة طلب تضيفها Cloudflare لا من عنوان IP مخزَّن. ومطابقة الكلمات على صفحات الناشر مع المعلن الذي اشتراها هي كل ما تفعله AdBubbles. وليس لـ AdBubbles أي رأي في مَن مِن الناس يرى الفقاعة، ولا تتبع القارئ أبدًا من صفحة أو موقع إلى التالي، ولا تعد بأي نتيجة. وموقفنا من الخصوصية منشور كاملًا.

المتصفحات اليوم تحصي ما يكلّفه الإعلان وتتصرف بناءً على المجموع

يبيّن التدخل ضد الإعلانات الثقيلة (Heavy Ad Intervention) في Chrome ما يعدّه أحد مورّدي المتصفحات أكثر من اللازم. فالإعلان لا يُعدّ ثقيلًا إلا «إذا لم يتفاعل معه المستخدم (على سبيل المثال، لم يلمسه أو ينقر عليه)».8 وبعد ذلك، يكفي أيٌّ من ثلاثة حدود. الأول أكثر من 4 ميغابايت من عرض النطاق الترددي للشبكة. والثاني أكثر من 15 ثانية من وقت الخيط الرئيسي في أي نافذة مدتها 30 ثانية، والثالث أكثر من 60 ثانية إجمالًا.

وحين يُطلَق التدخل، يُستبدل محتوى إطار الإعلان «برسالة تفيد بإزالة الإعلان»، وتعمل الآلية على إطارات iframe الموسومة بأنها إعلانات.8 والمقياس هو البايتات ووقت الخيط الرئيسي؛ ولا دور لمحتوى الإعلان. والفقاعة تُعرض داخل Shadow DOM ضمن مستند الناشر نفسه لا في iframe، لذلك فإن هذه الآلية موجّهة إلى نوع مختلف من الإعلانات. أما ما تضيفه شيفرة التضمين إلى صفحة معيّنة، من حيث البايتات ووقت الخيط الرئيسي، فهو أمر ستبيّنه قياسات تلك الصفحة نفسها.

والفحص الذي يستطيع الناشر إجراؤه على صفحته لا يحتاج إلى أكثر من متصفح. فمصدر الصفحة يُدرج كل عنصر script في head، وكلٌّ منها إما يحمل async أو defer وإما لا يحمل أيًّا منهما. ويُدرج قسم الفرص (Opportunities) في Lighthouse العناصر التي لا تحمل أيًّا منهما بوصفها روابط تحجب الرسم الأول.4 ومقتطف الشبكة الوارد في تلك القائمة يحجب الصفحة وفق تعريف المعيار، أيًّا كان ما تقوله وثائق الشبكة عن حجمه. وما إذا كان سكربت الإعلانات سينضم إلى تلك القائمة تحدّده السمة على عنصره، والسمة مكتوبة في المقتطف قبل أن يلصقه أي ناشر.