تاریخ انتشار: ۳۰ سپتامبر ۲۰۱۹، آخرین بهروزرسانی: ۱۰ ژوئیه ۲۰۲۶
میتوانید تصاویر واکنشگرا را پیشبار کنید، که میتواند به مرورگر کمک کند تصویر صحیح را از srcset قبلاز رندر کردن برچسب img شناسایی کند و به این ترتیب تصاویر شما بسیار سریعتر بار شود.
نمای کلی تصاویر واکنشگرا
فرض کنید درحال مرور وب در صفحهنمایشی با عرض ۳۰۰ پیکسل هستید و صفحه تصویری با عرض ۱۵۰۰ پیکسل درخواست میکند. آن صفحه مقدار زیادی از داده تلفن همراه شما را هدر داده است چون صفحهنمایش شما نمیتواند با آن وضوح اضافی کاری انجام دهد. در حالت ایدهآل، مرورگر نسخهای از تصویر را واکشی میکند که فقط کمی پهنتر از اندازه صفحهنمایش شما است، مثلاً ۳۲۵ پیکسل. این کار باعث میشود تصویر با وضوح بالا بدون هدر رفتن دادهها بار شود و تصویر سریعتر بار شود.
تصاویر واکنشگرا
به مرورگرها اجازه میدهد منابع تصویری مختلفی را برای دستگاههای مختلف واکشی کنند. اگر از شبکه توزیع محتوای تصویر استفاده نمیکنید، چند بعد برای هر تصویر ذخیره کنید و آنها را در مشخصه srcset مشخص کنید. مقدار w به مرورگر میگوید که عرض هر نسخه چقدر است، بنابراین میتواند نسخه مناسب را برای هر دستگاهی انتخاب کند:
<img src="small.jpg" srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w" alt="…">
نمای کلی پیشبارگیری
پیشبارگیری به شما امکان میدهد منابع مهمی را که میخواهید در اسرع وقت بارگیری شوند، قبلاز اینکه در HTML کشف شوند، به مرورگر اطلاع دهید. این بهویژه برای منابعی مفید است که بهراحتی قابلکشف نیستند، مانند قلمهای موجود در برگههای سبک نگارش، تصاویر پسزمینه، یا منابع بارشده از دستورگان.
<link rel="preload" as="image" href="important.png" fetchpriority="high">
imagesrcset و imagesizes
عنصر <link> از مشخصههای imagesrcset و imagesizes برای
پیشبارگیری تصاویر واکنشگرا استفاده میکند. از آنها در کنار
<link rel="preload"> استفاده کنید، با نحو srcset و sizes که در
عنصر <img> استفاده شده است.
برای مثال، اگر میخواهید تصویر واکنشگرایی را که با این کد مشخص شده است پیشبارگیری کنید:
<img src="wolf.jpg" srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" sizes="50vw" alt="A rad wolf">
میتوانید این کار را با افزودن موارد زیر به <head> HTML خود انجام دهید:
<link rel="preload" as="image" href="wolf.jpg" imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" imagesizes="50vw" fetchpriority="high">
این کار درخواستی را بااستفاده از همان منطق انتخاب منبعی که
srcset و sizes استفاده میکنند آغاز میکند.
موارد استفاده
در زیر چند مورد استفاده برای پیشبارگیری تصاویر واکنشگرا آورده شده است.
پیشبار کردن تصاویر واکنشگرای تزریقشده بهصورت پویا
تصور کنید که درحال بار کردن پویای نگارههای اصلی بهعنوان بخشی از نمایش اسلاید هستید و میدانید کدام تصویر اول نمایش داده خواهد شد. در این حالت، احتمالاً میخواهید آن تصویر را در اسرع وقت نشان دهید و منتظر نمانید تا اسکریپت نمایش اسلاید آن را بار کند.
میتوانید این مشکل را در وبسایتی با گالری تصاویر بارشده بهصورت پویا بررسی کنید:
- این نمونه نمایشی نمایش اسلاید را در برگه جدیدی باز کنید.
- برای باز کردن DevTools، کلید
Control+Shift+J(یاCommand+Option+Jدر Mac) را فشار دهید. - روی برگه شبکه کلیک کنید.
- در فهرست کرکرهای Throttling (محدود کردن سرعت)، Fast 3G (نسل سوم سریع) را انتخاب کنید.
- چارگوش انتخاب غیرفعال کردن حافظه نهان را غیرفعال کنید.
- صفحه را مجدد بار کنید.
استفاده از preload در اینجا به تصویر اجازه میدهد تا زودتر از موعد بارگیری شود، بنابراین میتواند
آماده نمایش باشد وقتی مرورگر نیاز به نمایش آن دارد.
برای دیدن تفاوتی که پیشبارگیری ایجاد میکند، همان گالری تصویر بارگیریشده بهصورت پویا را بررسی کنید، اما با پیشبارگیری تصویر اول با دنبال کردن مراحل مثال اول.
پیشبار کردن تصاویر پسزمینه بااستفاده از image-set
اگر تصاویر پسزمینه متفاوتی برای تراکمهای مختلف صفحهنمایش دارید، میتوانید
آنها را در CSS خود با نحو image-set مشخص کنید. سپس مرورگر میتواند
براساس DPR صفحهنمایش،
انتخاب کند کدامیک را نمایش دهد.
background-image: image-set( "cat.png" 1x, "cat-2x.png" 2x);
مشکل تصاویر پسزمینه CSS این است که مرورگر آنها را تنها پساز بارگیری و پردازش همه CSS در <head> صفحه کشف میکند.
میتوانید این مشکل را در وبسایت نمونه با تصویر پسزمینه واکنشگرا بررسی کنید.
پیشبارگیری تصویر واکنشگرا به شما امکان میدهد آن تصاویر را سریعتر بار کنید.
<link rel="preload" as="image" imagesrcset="cat.png 1x, cat-2x.png 2x" fetchpriority="high">
با حذف مشخصه href میتوانید مطمئن شوید مرورگرهایی که از imagesrcset در عنصر <link> پشتیبانی نمیکنند، اما از image-set در CSS پشتیبانی میکنند، منبع صحیح را بارگیری میکنند. بااینحال، در این مورد از پیشبارگیری بهرهمند نخواهند شد.
میتوانید نحوه رفتار مثال قبلی را با تصویر پسزمینه واکنشگرای پیشبارگذاریشده در نسخه نمایشی پیشبارگذاری پسزمینه واکنشگرا بررسی کنید.
تأثیرات عملی پیشبارگذاری تصاویر واکنشگرا
پیشبار کردن تصاویر واکنشگرای شما میتواند از نظر تئوری سرعت آنها را افزایش دهد، اما در عمل چه میکند؟
برای پاسخ به این سؤال، دو نسخه از فروشگاه نمایشی برنامه وب پیشرونده ایجاد کردم: یکی که تصاویر را پیشبارگیری نمیکند، و دیگری که برخیاز آنها را پیشبارگیری میکند. چون سایت تصاویر را بااستفاده از جاوا اسکریپت بهصورت بارکردن کُند بار میکند، احتمالاً از پیشبار کردن تصاویری که در نمای اولیه ظاهر میشوند سود میبرد.
این کار نتایج زیر را برای بدون پیشبارگیری و برای پیشبارگیری تصویر ایجاد کرد:
- شروع پردازش تغییری نکرده است.
- شاخص سرعت کمی بهبود یافت (۲۷۳ میلیثانیه، چون تصاویر سریعتر میرسند و بخش بزرگی از ناحیه پیکسل را اشغال نمیکنند).
- آخرین قهرمان رنگشده بهطور قابلتوجهی (۱٫۲ ثانیه) بهبود یافت.
پیشبارگیری و <picture>
«گروه کاری عملکرد وب» درحال بحث درباره افزودن معادل پیشبارگیری برای
srcset و sizes است، اما نه برای عنصر <picture>
که مورد استفاده «جهت هنری» را
مدیریت میکند.
هنوز چند مشکل فنی برای حل کردن برای پیشبارگیری <picture> وجود دارد،
اما در این میان، راهحلهایی وجود دارد:
<picture>
<source srcset="small_cat.jpg" media="(max-width: 400px)">
<source srcset="medium_cat.jpg" media="(max-width: 800px)">
<img src="large_cat.jpg">
</picture>
منطق انتخاب منبع تصویر عنصر <picture> بهترتیب از مشخصههای media عناصر <source> عبور میکند، اولین موردی را که مطابقت دارد پیدا میکند، و از منبع پیوستشده استفاده میکند.
چون پیشبارگیری واکنشگرا مفهومی از «ترتیب» یا «اولین مطابقت» ندارد، باید نقاط شکست را به چیزی شبیه به موارد زیر ترجمه کنید:
<link rel="preload" href="small_cat.jpg" as="image" media="(max-width: 400px)" fetchpriority="high">
<link rel="preload" href="medium_cat.jpg" as="image" media="(min-width: 400.1px) and (max-width: 800px)" fetchpriority="high">
<link rel="preload" href="large_cat.jpg" as="image" media="(min-width: 800.1px)" fetchpriority="high">
پیشبارگیری و type
عنصر <picture> همچنین از مطابقت در اولین type پشتیبانی میکند تا به شما امکان دهد قالبهای تصویر مختلفی ارائه دهید تا مرورگر بتواند اولین قالب تصویری را که پشتیبانی میکند انتخاب کند.
این مورد استفاده فقط تاحدی با پیشبارگیری پشتیبانی میشود: مرورگرها باید فقط پیشبارگیریها را برای انواع پشتیبانیشده بارگیری کنند. بنابراین میتوانید از این برای جلوگیری از پیشبارگیری انواع mimetypes پشتیبانینشده توسط مرورگرها با گنجاندن این در پیشبارگیری استفاده کنید:
<link rel="preload" href="image.avif" type="image/avif" as="image" fetchpriority="high">
اما برخلاف <picture>، در اولین نوع پشتیبانیشده متوقف نخواهد شد. بنابراین اگر چندین پیشبارگیری برای چندین نوع گنجانده شده باشد، همه تصاویر پیشبارگیری خواهند شد:
این کار را نکنید — پیشبار کردن چند نوع:
<link rel="preload" href="image.avif" type="image/avif" as="image" fetchpriority="high">
<link rel="preload" href="image.jpg" type="image/jpg" as="image" fetchpriority="high">
بهجای آن، این کار را انجام دهید — ترجیحیترین نوع را پیشبارگیری کنید:
<link rel="preload" href="image.avif" type="image/avif" as="image" fetchpriority="high">
پیشبارگیری جدیدترین قالب (در این مورد AVIF) بهعنوان یک ارتقای پیشرو عمل میکند، که در آن مرورگرهای پشتیبانیکننده از آن نوع بهرهمند میشوند و مرورگرهای دیگر از پیشبارگیری بهرهمند نخواهند شد.
برای سایتهایی که تصویر بهسرعت در HTML قابلیافتن است، توصیه میکنیم از پیشبارگیری اجتناب کنید و درعوض، اسکنر پیشبارگیری تصاویر را از عناصر <picture> و <source> دریافت کند. این کار درهرصورت روال مطلوبی است، بهویژه هنگام استفاده از اولویت واکشی برای کمک به اولویتبندی تصویر مناسب، زیرا اجازه میدهد تصویر دقیق براساس پشتیبانی مرورگر پیشبار شود. همچنین خطر قدیمی شدن پیشبارگیری از نشانهگذاری اصلی را هنگام تغییر تصاویر یا صفحهها ازبین میبرد.
تأثیرات بر «بزرگترین نقاشی دارای محتوا» (LCP)
چون تصاویر میتوانند نامزدهای «بزرگترین نقاشی دارای محتوا» (LCP) باشند، پیشبار کردن آنها میتواند LCP وبسایت شما را بهبود بخشد.
صرفنظر از اینکه تصویری که پیشبارگذاری میکنید واکنشگرا باشد یا نه، پیشبارگذاریها زمانی بهترین عملکرد را دارند که منبع تصویر در بار داده نشانهگذاری اولیه قابلشناسایی نباشد. همچنین در سایتهایی که نشانگذاری را در سمت کارخواه ارائه میکنند، نسبتبه سایتهایی که نشانگذاری کامل را از سرور ارسال میکنند، بهبود بیشتری در LCP خواهید داشت.