وقتی که پروژه را برای حالت ارائهی نهایی (Production ) بدون در نظر گرفتن Lazy Load، بیلد میکنیم احتمالا فایلهای تولید شده زیر را در پوشهی dist خواهیم دید:
- polyfills.js : برای ساختن برنامههای سازگار با انواع مرورگرها میباشد. به دلیل اینکه وقتی کدها را با جدیدترین ویژگیها مینویسیم، ممکن است که همهی مرورگرها توانایی پشتیبانی از آن ویژگیها را نداشته باشند.
- scripts.js : شامل اسکریپتهایی میباشد که در بخش scripts، در فایل angular.json تعریف کردهایم.
- webpack loader : runtime.js میباشد. این فایل شامل webpack utilitiesهایی میباشد که برای بارگذاری دیگر فایلها مورد نیاز است.
- styles.css : شامل style هایی است که در بخش styles، در فایل angular.json تعریف کردهایم.
- main.js : شامل تمامی کدها از قبیل کامپوننتها ( کدهای مربوط به css ، html ، ts) ، دایرکتیوها، pipes و سرویسها و ماژولهای ایمپورت شده از جمله third partyهای میباشد.
همانطور که متوجه هستید، فایل main.js در طول زمان بزرگتر و بزرگتر خواهد شد که این یک مشکل است. در این حالت برای مشاهدهی وب سایت، مرورگر نیاز دارد که فایل main.js را دانلود کرده و سپس در صفحه، آن را اجرا و رندر کند که این یک چالش برای کاربران موبایل با اینترنت ضعیف و هم چنین کاربران دسکتاپ میباشد.
آسانترین راه برای برطرف کردن این مشکل این است که پروژه را به چندین ماژول lazy load، تقسیم کنیم. وقتی که از lazy moduleها استفاده میکنیم، انگیولار chunk مربوط به آن را تولید میکند که در ابتدا بارگذاری نخواهد شد؛ مگر اینکه مورد نیاز باشند (معمولا با فعال سازی یک مسیر اتفاق میافتد).
وقتی که از lazy loading استفاده میکنیم، بعد از فرایند build، فایلهای جدیدی تولید خواهند شد، مثل 4.386205799sfghe4.js که یک چانک از یک lazy module میباشد و در زمان راه اندازی صفحه اول اجرا نخواهد شد که نتیجهی آن داشتن فایل main.js ای با حجم کم میباشد. بنابراین بارگذاری صفحهی اول، خیلی سریع انجام خواهد شد.
با این حال، بارگذاری هر قسمت میتواند بر روی کارآیی تاثیر داشته باشد (بارگذاری ممکن است کند باشد). خوشبختانه انگیولار یک راه را برای برطرف کردن این مشکل فراهم کرده است (
PreloadingStrategy ) . بعد از اینکه فایل main.js به صورت کامل بارگذاری و اجرا شد، کار پیش واکشی ماژولها را انجام میدهد و زمانیکه کاربری مسیری را درخواست میدهد، آْن مسیر را بدون درنگ مشاهده خواهد کرد.
#2 Debug bundles with Webpack Bundle Analyzer
حتی ممکن است بعد از تقسیم کردن منطق برنامه به چند ماژول lazy load، شما یک فایل main.js بزرگ داشته باشید. در این حالت میتوانید بهینه سازی بیشتری را با استفاده از Webpack Bundle Analyzer انجام دهید. با استفاده از این پکیج میتوانید آمارهایی را در رابطه با هر باندل داشته باشید. در ابتدا با استفاده از دستور زیر پکیج آنرا نصب کنید:
npm install --save-dev webpack-bundle-analyzer
سپس فایل package.json را باز کرده و در بخش scripts، مدخل زیر را اضافه کنید:
"bundle-report": "ng build --prod --stats-json && webpack-bundle-analyzer dist/stats.json"
توجه کنید که اگر خروجی برنامه شما مستقیما در dist میباشد، به صورت بالا عمل کنید؛ ولی اگر خروجی برنامه شما در پوشهی dist/YourApplicationName باشد، آن را به حالت زیر ویرایش کنید:
"bundle-report": "ng build --prod --stats-json && webpack-bundle-analyzer dist/YourApplicationName/stats.json"
در نهایت دستور زیر را اجرا کنید:
دستور بالا یک بیلد را برای پروژه برای حالت ارائهی نهایی (Production) همراه با آمارهایی در رابطه با هر باندل ایجاد میکند. در اینجا میتوانیم ببینیم که چه ماژولها/فایلهایی در هر باندل استفاده شدهاست. این مورد فوق العاده کمک میکند. هم چنین میتوانیم به صورت بصری ببینیم که چه چیزهایی در هر ماژول شامل شدهاند که بهتر بود آنجا نباشند:
#3 Use Lazy Loading for images that are not visible in page
وقتی که صفحه اصلی را در اولین بار، بارگذاری میکنیم، میتوانیم تصاویری را داشته باشیم که در صفحهی نمایش، نمایان نباشند (منظور viewport میباشد) و کاربر برای دیدن آن تصاویر باید صفحه را به پایین اسکرول کند. با این وجود وقتی که صفحه بارگذاری میشود، تصاویر هم بلافاصله دانلود میشوند. اگر تعداد تصاویر زیاد باشند این مورد میتواند بر روی performance تاثیر منفی داشته باشد. برای برطرف کردن این مشکل میتوان از lazy loading تصاویر استفاده کرد. در این حالت تصاویر زمانی بارگذاری میشوند که کاربر به آنها میرسد. یک JavaScript API به نام
Intersection Observer API وجود دارد که باعث میشود پیاده سازی lazy load خیلی آسان شود. علاوه بر این میتوان یک دایرکتیو را با قابلیت استفاده مجدد طراحی کرد (
lazy loading برای تصاویر با استفاده از Intersection Observer).
#4 Use virtual scrolling for large lists
با استفاده از
virtual scrolling میتوان المنتها را در Dom بر اساس بخشهای قابل مشاهدهای از یک لیست، Load یا unload کرد که برنامه را فوق العاده سریع میکند.