Kodokon kodokon.com

أداء التحميل: defer وasync وpreload وprefetch

رتّب تنفيذ سكربتاتك بواسطة defer وasync، ثم وجّه الشبكة بواسطة preload وpreconnect وprefetch.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

الوسم <script src> الكلاسيكي يحجب تحليل HTML: يتوقف المتصفح، ويُنزّل، ويُنفّذ، ثم يستأنف. سمتان تغيّران المعادلة. defer تُنزّل بالتوازي مع التحليل وتُنفّذ السكربتات بترتيب المستند، مباشرةً قبل DOMContentLoaded: إنها الخيار الافتراضي لشيفرة تطبيقك التي قد تعتمد على DOM وعلى سكربتات أخرى. أما async فتُنزّل أيضًا بالتوازي لكنها تُنفّذ بمجرد وصول الملف، بلا ترتيب مضمون: احتفظ بها للسكربتات المستقلة مثل التحليلات، التي لا تعتمد على شيء.

HTML
<script src="/js/analytics.js" async></script>
<script src="/js/vendor.js" defer></script>
<script src="/js/app.js" defer></script>
vendor.js سيُنفَّذ دائمًا قبل app.js

لا يكتشف المتصفح بعض الموارد الحرجة إلا متأخرًا جدًا: خط مُشار إليه داخل ملف CSS، أو صورة تُحمَّل في JavaScript. تُصلح <link rel="preload"> هذا الاكتشاف المتأخر بالتصريح عن المورد مباشرةً في <head>، مع السمة as الإلزامية كي يطبّق المتصفح الأولوية الصحيحة والتخزين المؤقت الصحيح. الحالة النموذجية: خطوط الويب، التي لولا ذلك لا تُطلب إلا بعد تنزيل CSS وتحليله.

HTML
<link rel="preload" as="font" type="font/woff2"
      href="/fonts/inter-var.woff2" crossorigin>
<link rel="preload" as="image"
      href="/img/hero-1600.jpg" fetchpriority="high">
اكتشاف مبكّر لخط ولصورة LCP

العائلة الأخيرة: تلميحات الشبكة منخفضة الأولوية. تُنشئ <link rel="preconnect"> الاتصال الكامل مسبقًا (DNS وTCP وTLS) بمصدر خارجي ستستخدمه قطعًا: حتى 300 مللي ثانية موفّرة على الطلب الأول. أما dns-prefetch فهي ابنة عمّها الخفيفة (تحليل DNS فقط)، مفيدة كبديل للمصادر الأقل يقينًا. وprefetch تُنزّل، أثناء الخمول، موردًا مخصّصًا لـ التنقّل التالي: صفحة الدفع من السلّة مثلًا. المقايضة واضحة: preload تخدم الصفحة الحالية، وprefetch تراهن على التالية.

HTML
<link rel="preconnect"
      href="https://api.example.com">
<link rel="dns-prefetch"
      href="https://cdn.example.com">
<link rel="prefetch" href="/checkout.html">
اتصالات مبكّرة ورهان على التنقّل التالي

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما الضمان الذي تقدّمه defer ولا تقدّمه async؟
    • التنزيل بالتوازي مع تحليل HTML
    • التنفيذ بترتيب المستند، قبل DOMContentLoaded
    • التنفيذ قبل أي تصيير للصفحة
  2. لماذا تكون crossorigin ضرورية على preload لخط من المصدر نفسه؟
    • تُطلب الخطوط دائمًا في وضع CORS؛ من دونها، يُنزَّل الملف مرتين
    • إنها متطلّب أمني لصيغة WOFF2
    • من دونها، يُحجب preload بواسطة CSP الافتراضية
  3. ما الاستخدام الصحيح لـ rel="prefetch"؟
    • تسريع مورد حرج على الصفحة الحالية
    • تنزيل مورد مرجّح للتنقّل التالي بأولوية منخفضة
    • إجبار ملف على التخزين المؤقت الدائم