Critical CSS و Minification؛ جمعبندی دو تکنیک کلیدی
تو این دوره چند بار از کنار Critical CSS و minification رد شدیم؛ یه بار تو فصل Render Blocking و یه بار تو بحث حجم فایل. حالا که به انتهای فصل پرفورمنس رسیدیم، وقتشه این دو تکنیک رو کنار هم بذاریم و ببینیم دقیقاً چطور با هم و در کنار بقیهی چیزهایی که یاد گرفتیم (compression، caching، حذف CSS بلااستفاده) یه استراتژی کامل میسازن.
یادآوری: Critical CSS دقیقاً چه مشکلی رو حل میکنه
تو فصل قبل دیدیم که CSS بهطور پیشفرض رندر رو مسدود میکنه؛ مرورگر تا فایل استایل رو کامل نگیره، چیزی نشون نمیده. Critical CSS این مشکل رو با جدا کردن استایلهای لازم برای بالای صفحه (و inline کردنشون تو خود HTML) دور میزنه، تا مرورگر مجبور نباشه برای اولین رندر منتظر یه فایل خارجی بمونه.
یادآوری: Minification دقیقاً چی رو کوچیک میکنه
Minification فاصلهها، خطهای جدید و کامنتهای اضافی رو از فایل CSS حذف میکنه؛ چیزهایی که فقط برای خوانایی انسانی لازمن، نه برای اجرای مرورگر. این کار حجم فایل نهایی رو کاهش میده و روی سرعت دانلود اثر میذاره.
این دو تکنیک، دو مشکل کاملاً متفاوت رو حل میکنن
یه نکتهی مهم که خیلی وقتها قاطی میشه: Critical CSS مشکل «ترتیب و زمانبندی» رو حل میکنه (کِی مرورگر میتونه شروع کنه به رندر کردن)، در حالی که minification مشکل «حجم» رو حل میکنه (چقدر باید دانلود بشه). یه پروژه ممکنه فایل CSS خیلی کوچیکی (بعد از minify) داشته باشه ولی هنوز هم بهخاطر نبود Critical CSS، رندر اولیهاش کند باشه؛ و برعکس، یه پروژه ممکنه Critical CSS خوبی داشته باشه ولی فایل اصلی minifyنشدهاش آنقدر بزرگ باشه که بقیهی صفحه دیر تکمیل بشه.
ترتیب اجرای این تکنیکها در یه پروژهی واقعی
تو یه فرآیند build معمولی، این مراحل معمولاً به این ترتیب اتفاق میافتن:
| مرحله | کاری که انجام میشه |
|---|---|
| ۱. نویسندگی | CSS خوانا با کامنت و فاصله نوشته میشه |
| ۲. حذف بلااستفاده | selector هایی که تو هیچجای پروژه match نمیشن حذف میشن |
| ۳. استخراج Critical CSS | بخش لازم برای بالای صفحه جدا و inline میشه |
| ۴. Minify | فاصله و کامنت از هر دو بخش (critical و بقیه) حذف میشه |
| ۵. Compress | سرور فایل نهایی رو با gzip یا براتلی فشرده میکنه |
نکتهی مهم اینجا ترتیبه: اگه Critical CSS رو بعد از minify استخراج کنید، کارتون سختتر میشه چون کد فشردهشده خوانا نیست؛ برعکسش (استخراج اول، minify بعد) طبیعیتره.
آیا Critical CSS هم باید minify بشه؟
بله، و این نکته گاهی فراموش میشه. چون Critical CSS مستقیم تو خود HTML قرار میگیره (نه یه فایل جدا)، هر بایت اضافهش مستقیم حجم خود صفحهی HTML رو زیاد میکنه که اونم باید دانلود بشه. پس حتی این بخش کوچیک هم باید minify بشه، شاید حتی با دقت بیشتری از بقیهی فایل، چون تأثیرش مستقیم روی اولین رندره.
رابطهی minification با compression
یه سؤال رایج اینه: اگه سرور قراره فایل رو gzip کنه، آیا اصلاً minify کردن لازمه؟ جواب بلهست، چون این دو مکمل هم هستن، نه جایگزین هم. Compression بیشتر روی الگوهای تکراری متن کار میکنه (مثل selector های مشابه یا مقادیر رنگ تکراری)، در حالی که minification کاراکترهای کاملاً بیفایده (فاصله، خط جدید) رو از اول حذف میکنه. فایل minifyشده و بعد compressشده تقریباً همیشه از فایل غیر minifyشدهی compressشده کوچیکتره.
اشتباه رایج: فراموش کردن source map
وقتی CSS رو minify میکنید، دیباگ کردنش تو DevTools مرورگر تقریباً غیرممکن میشه چون همهچیز تو یه خط فشردهست. راهحل، تولید یه فایل source map کنار فایل minifyشده هست؛ این فایل به DevTools میگه هر بخش از کد فشرده، دقیقاً معادل کدوم خط از فایل اصلی (خوانا) بوده. بدون source map، توسعهدهندهها معمولاً مجبور میشن رو نسخهی dev (غیر minify) کار کنن و نمیتونن مستقیم مشکلات نسخهی production رو بررسی کنن.
جمعبندی
Critical CSS و minification دو مشکل متفاوت (ترتیب رندر در برابر حجم فایل) رو حل میکنن و باید در کنار هم به کار برن، نه بهجای هم. ترتیب درست در فرآیند build معمولاً اینه: نویسندگی خوانا، حذف بلااستفاده، استخراج Critical CSS، minify کردن هر دو بخش، و در نهایت compression سمت سرور. فراموش نکنید حتی Critical CSS inline هم باید minify بشه، و برای دیباگ آسونتر، همیشه source map کنار نسخهی production نگه دارید.
