بهترین روش لود بهینه JavaScript با defer و async چیست؟

بدون دیدگاه

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

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

یک فایل جاوااسکریپت به طور معمول به این روش در صفحه لود می شود:

<script src="script.js"></script>

هر زمان که یک مفسر HTML (منظور از مفسر یا تجزیه گر همان مرورگر مثل کروم یا فایرفاکس است) این خط را پیدا می‌کند، درخواست برای واکشی اسکریپت داده می‌شود، و اسکریپت به اجرا درمی آید.

هنگامی که این فرآیند انجام شد، تفسیر صفحه می‌تواند ازسر گرفته شود و بقیه HTML را می توان تحلیل کرد.

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

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

جای قرارگیری مهم است

وقتی در حال یادگیری HTML هستید معمولا گفته می شود تگ اسکریپت را در بخش <head> صفحه قرار دهید:

<html>
<head>
<title>Title</title>
<script src="script.js"></script>
</head>
<body>
...
</body>
</html>

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

در همین رابطه :   شروع کار با Angular2

این بد است چون زمان زیادی این بین تلف می شود. یک راه‌حل بسیار رایج برای این مساله این است که تگ اسکریپت را به جای بالای صفحه در پایین صفحه قرار دهید، درست قبل از بسته شدن برچسب </body>.

با انجام این کار، لود و اجرای اسکریپت، بعد از این که همه صفحه بارگیری و تفسیر شد، انجام می‌شود، که یک بهبود عظیم در سرعت صفحه ایجاد می کند.

این بهترین کاری است که می‌توانید انجام دهید،در صورتی که لازم است از مرورگرهای قدیمی‌تر پشتیبانی نیز کنید که از دو ویژگی نسبتا جدید HTML پشتیبانی نمی‌کنند: async و defer.

Async و Defer

هر دو async و defer ویژگی‌های بولی هستند. کاربرد آن‌ها هم مشابه است:

<script async src="script.js"></script>
<script defer src="script.js"></script>

اگر شما هر دو ویژگی را مشخص کنید، async در مرورگرهای مدرن اولویت دارد در حالی که مرورگرهای قدیمی از defer پشتیبانی می کنند.

این ویژگی ها وقتی موثر هستند که در بخش head استفاده شوند والا اگر طبق چیزی که در بالا گفته شد در آخر صفحه از آنها استفاده کنید تاثیری ندارند.

مقایسه کارایی

بدون استفاده از defer یا async، در head

اینجا می بینید چگونه یک اسکریپت بدون async و defer وقتی در بخش head صفحه قرار دارد، لود می شود:

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

بدون استفاده از defer یا async، در body

اینجا می بینید چگونه یک اسکریپت بدون async و defer وقتی در بخش انتهایی body قرار دارد، لود می شود:

در همین رابطه :   23 ابزار توسعه برای بهینه سازی و افزایش سرعت وب سایت - بخش اول

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

با استفاده از  async، در head

اینجا می بینید چگونه یک اسکریپت با ویژگی async وقتی در بخش head قرار دارد، لود می شود:

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

با استفاده از  defer، در head

اینجا می بینید چگونه یک اسکریپت با ویژگی defer وقتی در بخش head قرار دارد، لود می شود:

اسکریپت موازی با صفحه دریافت می شود ولی هنگامی اجرا می شود که تفسیر صفحه کاملا انجام شده باشد.

این حالت تقریبا مثل زمانی است که اسکریپت را در انتهای صفحه لود می کردیم ولی چون اینجا اسکریپت از قبل دریافت شده است و فقط اجرایش باقی مانده، بهینه تر است.

بنابراین راه حل برنده ما در زمینه سرعت این گزینه است 🏆

توقف تفسیر صفحه

async تفسیر صفحه را متوقف می کند در حالی که defer این کار را نمی کند.

domInteractive

اسکریپت با ویژگی defer درست بعد از رویداد domInteractive اجرا می شود، که بعد از لود کامل HTML صفحه اتفاق می افتد.

CSS و تصاویر در این زمان هنوز در حال لود و تفسیر هستند.

وقتی این هم انجام شد، مرورگر رویداد domComplete و سپس onLoad را اعلام می کند.

در همین رابطه :   چگونه سرعت وبسایت را با Leverage Browser Caching افزایش دهیم ؟

domInteractive خیلی مهم است زیرا زمان بندی ان معیار مهمی برای اندازه گیری سرعت صفحه است.

خلاصه کن و بهترین راه حل رو بهم بگو

چشم. بهترین روش برای افزایش سرعت لود صفحه وقتی از اسکریپت ها استفاده می کنی، قرار دادن اسکریپت ها در بخش head و اضافه کردن ویژگی defer به تگ script هست:

<head>

<script defer src="script.js"></script>

</head>

این تنها سناریو هست که رویداد domInteractive را سریع تر صدا می زند.

با در نظر گرفتن مزایا defer، به نظر می‌رسد انتخاب بهتری نسبت به async در انواع سناریوهای مختلف باشد.

منبع

دسته بندی : JavaScript

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

More in JavaScript
معرفی ۵۳۴ روش مختلف برای Reload صفحه در JavaScript!

احتمالا با دیدن عنوان مطلب کمی تعجب کرده اید ولی درست است . در جاوا اسکریپت شما می توانید با...

Close