چرا مرورگرها نتایج عملکرد متفاوتی تولید می کنند - مجله Smashing
انتشار: دی 20، 1403
بروزرسانی: 30 خرداد 1404

چرا مرورگرها نتایج عملکرد متفاوتی تولید می کنند - مجله Smashing


من داشتم با مت زیونرت از DebugBear چت می کردم و در این فرآیند، او به طور اتفاقی به این موضوع اشاره کرد. حالت تنگ هنگام توصیف نحوه واکشی و اولویت بندی منابع توسط مرورگرها. می خواستم با سر تکان دهم که انگار می دانستم درباره چه چیزی صحبت می کند، اما در نهایت باید بپرسم: حالت "Tight" چیست؟

چیزی که من به دست آوردم دو اثر هنری بود، یکی از آنها ویدیوی زیر از رابین مارکس، کارشناس اجرای وب Akamai بود که چند هفته پیش در We Love Speed \u200b\u200bدر فرانسه صحبت می کرد:

مصنوع دیگر یک سند Google است که در ابتدا توسط پاتریک مینان در سال 2015 منتشر شد اما اخیراً در نوامبر 2023 به روز شده است. وبلاگ پاتریک از سال 2014 غیرفعال بوده است، بنابراین من به سادگی پیوندی به سند Google برای شما می گذارم تا بررسی کنید.

این تمام چیزی است که من دارم و می توانم در مورد این چیزی به نام حالت تنگ که به نظر می رسد تأثیر زیادی بر نحوه کار وب دارد در وب بیابم. رابین کمبود اطلاعات در مورد آن را در ارائه خود تصدیق کرد و میزان تحقیق اول شخص در سخنرانی او قابل توجه و ارزش توجه است زیرا تلاش می کند تا توصیف و نشان دهد که چگونه مرورگرهای مختلف منابع مختلف را با اولویت های متفاوت واکشی می کنند. با توجه به کمبود مطالب در مورد موضوع، تصمیم گرفتم آنچه را که توانستم از تحقیقات رابین و مقاله به روز شده پاتریک حذف کنم، به اشتراک بگذارم.

این اولین مرحله از دو مرحله است

این واقعیت که تاریخ انتشار اولیه پاتریک به سال 2015 می رسد، جای تعجب ندارد که در حال حاضر درباره چیزی تقریباً 10 ساله صحبت می کنیم. به روزرسانی 2023 انتشارات در «سال های وب» نسبتاً قدیمی است، با این حال وقتی سعی می کنم آن را جستجو کنم هنوز حالت تنگ وجود ندارد.

بنابراین، چگونه حالت تنگ را تعریف کنیم؟ پاتریک اینطور توضیح می دهد:

کروم منابع را در 2 مرحله بارگیری می کند. «حالت تنگ» فاز اولیه و محدودیت ها (sic) بارگیری منابع با اولویت پایین تر است تا زمانی که بدنه به سند متصل شود (در اصل، پس از اجرای همه اسکریپت های مسدودکننده در سر).»

- پاتریک مینان

بسیار خوب، بنابراین ما این فرآیند دو قسمتی را داریم که Chrome از آن برای واکشی منابع از شبکه استفاده می کند و بخش اول روی هر چیزی متمرکز است که «منبع با اولویت پایین تر» نیست. ما راه هایی داریم که به مرورگرها می گوییم کدام منابع ما فکر کنید در قالب Fetch Priority API و تکنیک های بارگذاری تنبلی که به صورت ناهمزمان منابع را هنگام ورود به نمای در اسکرول بارگذاری می کنند، اولویت پایینی دارند - همه این موارد رابین در ارائه خود پوشش می دهد. اما حالت تنگ روش خاص خود را برای تعیین اینکه چه منابعی باید ابتدا بارگیری شود دارد.

اسکرین شات حالت تنگ کروم
شکل 1: کروم منابع را در دو مرحله بارگیری می کند که فاز اول «حالت تنگ» نام دارد. (پیش نمایش بزرگ)

حالت تنگ منابع را متمایز می کند و هر چیزی را که به عنوان اولویت بالا و متوسط \u200b\u200bعلامت گذاری شده است، در نظر می گیرد. هر چیز دیگری محدود شده و در خارج باقی می ماند، تا زمانی که بدنه محکم به سند متصل شود، به داخل نگاه می کند، که نشان می دهد اسکریپت های مسدودکننده اجرا شده اند. در آن نقطه است که منابع مشخص شده با اولویت کم در مرحله دوم بارگیری در درب مجاز می شوند.

یک هشدار بزرگ برای آن وجود دارد، اما ما به آن خواهیم رسید. نکته مهمی که باید به آن توجه کرد این است که…

Chrome و Safari حالت فشرده را اعمال می کنند

بله، کروم و سافاری هر دو دارای نوعی حالت فشرده هستند که در پس زمینه اجرا می شوند. آخرین تصویر حالت فشرده کروم را نشان می دهد. بیایید سافاری بعدی را بررسی کنیم و این دو را با هم مقایسه کنیم.

تصویری از مقایسه حالت تنگ در کروم با حالت تنگ در سافاری.
شکل 2: مقایسه حالت تنگ در کروم با حالت تنگ در سافاری. توجه داشته باشید که کروم به پنج تصویر با اولویت بالا اجازه می دهد تا از حالت تنگ خارج شوند. (پیش نمایش بزرگ)

به آن نگاه کن! سافاری منابع با اولویت بالا را در واکشی اولیه خود، درست مانند کروم، متمایز می کند، اما رفتار بارگیری بسیار متفاوتی بین دو مرورگر دریافت می کنیم. توجه داشته باشید که چگونه به نظر می رسد سافاری پنج تصویر اول PNG را که با اولویت متوسط \u200b\u200bعلامت گذاری شده اند در جایی که کروم به آن ها اجازه می دهد حذف می کند. به عبارت دیگر، Safari همه منابع با اولویت متوسط \u200b\u200bو پایین را مجبور می کند تا زمانی که همه موارد با اولویت بالا بارگذاری شوند، در صف منتظر بمانند، حتی اگر ما دقیقاً با همان HTML کار می کنیم. ممکن است بگویید که رفتار سافاری بسیار منطقی است، همانطور که در تصویر آخر مشاهده می کنید که ظاهراً کروم برخی از منابع با اولویت بالا را خارج از حالت فشرده حذف می کند. واضح است که برخی از احمقانه ها در آنجا اتفاق می افتد که ما به آنها خواهیم رسید.

فایرفاکس کجای این همه است؟ هنگام ارزیابی اولویت منابع در یک صفحه، هیچ گونه اقدامات سختگیرانه اضافی انجام نمی دهد. ممکن است این رویکرد آبشار «کلاسیک» برای برداشت و بارگیری منابع در نظر گرفته شود.

مقایسه حالت فشرده کروم، سافاری و فایرفاکس
شکل 3: کروم و سافاری حالت تنگ را پیاده سازی کرده اند در حالی که فایرفاکس یک آبشار ساده را حفظ می کند. (پیش نمایش بزرگ)

کروم و سافاری حالت تنگ را به طور متفاوت راه اندازی می کنند

رابین در صحبت هایش این را مثل روز روشن می کند. کروم و سافاری هر دو طرفدار حالت تنگ هستند، اما در شرایط مختلف آن را فعال می کنند که می توانیم به شرح زیر بیان کنیم:

کرومسافاری
حالت تنگ فعال شددر حین مسدود کردن JS در is busy.While blocking JS or CSS anywhere is busy.

Notice that Chrome only looks at the document when prioritizing resources, and only when it involves JavaScript. Safari, meanwhile, also looks at JavaScript, but CSS as well, and anywhere those things might be located in the document — regardless of whether it’s in the or . That helps explain why Chrome excludes images marked as High priority in Figure 2 from its Tight Mode implementation — it only cares about JavaScript in this context.

So, even if Chrome encounters a script file with fetchpriority="high" در بدنه سند، فایل اولویت «بالا» در نظر گرفته نمی شود و پس از بقیه موارد بارگذاری می شود. سافاری در این میان افتخار می کند fetchpriority در هر نقطه از سند این به توضیح اینکه چرا کروم دو اسکریپت را در شکل 2 روی میز گذاشته است، کمک می کند، در حالی که به نظر می رسد سافاری آنها را در حالت تنگ بارگذاری می کند.

این بدان معنا نیست که سافاری در روند خود کار عجیبی انجام نمی دهد. با توجه به نشانه گذاری زیر: