Preload فونت (Font Preloading): راهنمای فنی بهینه‌سازی LCP و CLS مبتنی بر فونت

مفهوم Preload فونت و تاثیر آن بر سرعت بارگذاری

برای یک مدیر بازاریابی فنی مانند «سارا»، بهینه‌سازی فونت‌های وب (Web Fonts) یکی از چالش‌برانگیزترین و در عین حال پربازده‌ترین بخش‌های سئو فنی است. فونت‌ها اغلب به عنوان منابع «پنهان» (Hidden) در نظر گرفته می‌شوند؛ مرورگر تا زمانی که فایل‌های CSS را دانلود و پارس نکند، از وجود آن‌ها مطلع نمی‌شود. این تأخیر در کشف (Discovery Delay) مستقیماً منجر به دو مشکل اساسی Core Web Vitals می‌شود: LCP ضعیف و CLS بالا.

این راهنما یک تحلیل فنی عمیق از استراتژی Preload فونت است. این فقط یک «هک» ساده نیست، بلکه یک دستورالعمل ضروری برای کنترل «مسیر رندر بحرانی» (Critical Rendering Path) است. با استفاده صحیح از link rel=”preload”، شما به مرورگر «سرنخ» (Hint) می‌دهید تا فونت‌های حیاتی را زودتر بارگذاری کند. این مقاله به عنوان بخشی از استراتژی جامع بهینه‌سازی Core Web Vitals، به شما نشان می‌دهد که چگونه Preload فونت به طور مستقیم به بهینه سازی LCP فونت و رفع خطای CLS فونت منجر می‌شود.

چرا فونت‌ها LCP و CLS را تخریب می‌کنند؟ (مشکل FOIT و FOUT)

قبل از اجرای آموزش Preload فونت، باید بفهمیم که چرا فونت‌ها ذاتاً مشکل‌ساز هستند. مشکل در نحوه بارگذاری پیش‌فرض مرورگر نهفته است که منجر به دو پدیده مخرب برای تجربه کاربری (UX) می‌شود:

۱. FOIT (Flash of Invisible Text): قاتل LCP

FOIT یا «فلش متن نامرئی» زمانی رخ می‌دهد که مرورگر برای نمایش متن، منتظر دانلود فایل فونت سفارشی می‌ماند. در این مدت (که می‌تواند چندین ثانیه طول بکشد)، کاربر هیچ متنی را نمی‌بیند. این یک فضای خالی آزاردهنده ایجاد می‌کند.

ارتباط فنی با LCP: اگر بزرگترین عنصر محتوایی شما (LCP) یک بلاک متنی باشد (مانند عنوان اصلی <h1>)، متریک بهینه سازی LCP تا زمانی که آن متن نامرئی است، ثبت نمی‌شود. FOIT مستقیماً LCP شما را به تأخیر می‌اندازد. Preload فونت با کاهش زمان نامرئی بودن متن، مستقیماً این مشکل را حل می‌کند.

۲. FOUT (Flash of Unstyled Text): عامل CLS

FOUT یا «فلش متن بدون استایل» (که اغلب توسط font-display: swap ایجاد می‌شود) یک رویکرد بهتر اما همچنان ناقص است. در این حالت، مرورگر بلافاصله متن را با یک فونت سیستمی (Fallback) نمایش می‌دهد. سپس، هنگامی که فونت سفارشی دانلود شد، آن را با فونت سیستمی «جایگزین» (Swap) می‌کند.

ارتباط فنی با CLS: فونت سیستمی (مثلاً Arial) و فونت سفارشی شما (مثلاً Vazir) ابعاد، ضخامت و فواصل حروف متفاوتی دارند. این «جایگزینی» باعث می‌شود که متن به طور ناگهانی تغییر اندازه دهد و تمام چیدمان صفحه (Layout) جابجا شود. این جابجایی فونت یک عامل مستقیم در رفع خطای CLS است. یک استراتژی Preload فونت صحیح، زمان این «جایگزینی» را آنقدر کوتاه می‌کند که CLS به حداقل برسد.

Preload فونت چیست؟ (فراتر از یک تگ ساده)

Preload فونت یک «سرنخ منبع» (Resource Hint) اظهاری (Declarative) است. شما با استفاده از تگ <link rel="preload"> در <head> سند HTML خود، به مرورگر اعلام می‌کنید: «من می‌دانم که تو به زودی به این فایل فونت نیاز خواهی داشت. لطفاً همین الان آن را با اولویت بالا دانلود کن، اما هنوز آن را اجرا نکن.»

این کار به طور موثری «کشف» فونت را از چرخه دانلود/پارس CSS جدا می‌کند. مرورگر دیگر منتظر نمی‌ماند تا CSS را بخواند تا بفهمد به چه فونتی نیاز دارد؛ این اطلاعات را مستقیماً از HTML اولیه دریافت می‌کند. این هسته اصلی آموزش Preload فونت است.


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

نمونه کد Preload فونت با استفاده از <link rel=” style=”width:100%; height:auto; margin-bottom: 20px;”>

کد استاندارد برای Preload فونت که باید در <head> صفحه قرار گیرد، به این شکل است:

<link rel="preload" href="/fonts/vazir-bold.woff2" as="font" type="font/woff2" crossorigin>

تشریح فنی اتریبیوت‌های تگ Preload

برای «سارا» به عنوان مدیر فنی، درک هر اتریبیوت ضروری است. اجرای اشتباه link rel=”preload” می‌تواند منجر به «دانلود دوگانه» (Double Download) شود.

تحلیل فنی اجزای تگ Preload:

  • rel="preload": به مرورگر می‌گوید که این یک منبع Preload است.
  • href="/fonts/vazir-bold.woff2": آدرس دقیق فایل فونت. (توصیه اکید: همیشه از فرمت مدرن woff2 استفاده کنید).
  • as="font": این اتریبیوت *حیاتی* است. این به مرورگر می‌گوید که این منبع یک «فونت» است و به آن اجازه می‌دهد تا اولویت‌بندی بارگذاری را به درستی تنظیم کند.
  • type="font/woff2": این اتریبیوت اختیاری اما به شدت توصیه شده است. به مرورگر کمک می‌کند تا بفهمد آیا اصلاً می‌تواند این نوع فایل را پشتیبانی کند یا خیر.
  • crossorigin: این اتریبیوت *مطلقاً ضروری* است. فونت‌ها تقریباً همیشه تحت قوانین CORS (Cross-Origin Resource Sharing) بارگذاری می‌شوند (حتی اگر در همان دامنه باشند). اگر اتریبیوت crossorigin را در تگ Preload فونت خود قرار ندهید، مرورگر آن فایل را *دو بار* دانلود خواهد کرد: یک بار از طریق Preload (به صورت ناشناس) و بار دوم هنگام فراخوانی @font-face (با CORS). این فاجعه عملکردی است.

برای مطالعه عمیق‌تر در مورد خطرات و نحوه پیاده‌سازی، مستندات web.dev گوگل در مورد Preload بهترین منبع است.

استراتژی ترکیبی: چرا Preload فونت + font-display: swap بهترین راه‌حل است؟

اینجاست که بسیاری از توسعه‌دهندگان دچار اشتباه می‌شوند. آنها فکر می‌کنند Preload فونت و font-display: swap دو راه‌حل رقیب هستند، در حالی که این دو، راه‌حل‌های *مکمل* و حیاتی برای یکدیگرند.

  • font-display: swap به تنهایی: مشکل FOIT را حل می‌کند (متن دیگر نامرئی نیست)، اما مشکل FOUT و CLS را ایجاد می‌کند (چون جایگزینی فونت ممکن است زمان‌بر باشد و باعث جابجایی شود).
  • Preload فونت به تنهایی: مشکل زمان‌بر بودن دانلود را حل می‌کند، اما اگر (به دلیل شبکه کند) فونت همچنان به موقع نرسد، مرورگر به حالت پیش‌فرض خود (معمولاً FOIT) بازمی‌گردد و LCP را به تأخیر می‌اندازد.

استراتژی برنده: ترکیب این دو

استراتژی فنی بهینه (که ما در «آدرینالیز» پیاده‌سازی می‌کنیم) استفاده همزمان از هر دو است:

  1. Preload فونت: ما فونت حیاتی را در <head> پریلود می‌کنیم تا اطمینان حاصل کنیم که دانلود آن *فوراً* و با اولویت بالا شروع می‌شود.
  2. font-display: swap: ما *همچنان* از این دستور در @font-face خود استفاده می‌کنیم.
مقایسه استراتژی Preload فونت در مقابل font-display: swap برای LCP و CLS

نتیجه این ترکیب چیست؟ در ۹۵٪ موارد (در شبکه‌های سریع)، Preload فونت باعث می‌شود که فونت سفارشی آنقدر سریع دانلود شود که قبل از رندر شدن متن، آماده است. در این حالت، font-display: swap عملاً فرصتی برای اجرا پیدا نمی‌کند و کاربر مستقیماً فونت صحیح را می‌بیند (بهترین بهینه سازی LCP فونت).

در ۵٪ موارد (در شبکه‌های بسیار کند)، font-display: swap به عنوان یک «بیمه» عمل می‌کند. مرورگر متن را بلافاصله با فونت سیستمی نمایش می‌دهد (جلوگیری از FOIT) و به محض اینکه فونت پریلود شده آماده شد (که باز هم سریع‌تر از حالت عادی خواهد بود)، جایگزینی (Swap) اتفاق می‌افتد. این کار *مدت زمان* FOUT را به حداقل می‌رساند و جابجایی فونت را کاهش می‌دهد.

کد CSS شما باید به این شکل باشد (همانطور که web.dev توصیه می‌کند):

@font-face {
  font-family: 'Vazir';
  src: url('/fonts/vazir-bold.woff2') format('woff2');
  font-weight: 700;
  font-display: swap; /* <-- این بیمه شماست */
}

چگونه فونت‌های حیاتی (Critical) برای Preload را شناسایی کنیم؟

این یک اشتباه رایج است: «تمام فونت‌های سایتم را Preload می‌کنم!». این کار فاجعه‌بار است. Preload فونت یک دستور با اولویت بالاست. اگر شما ۱۰ فونت را Preload کنید، در واقع پهنای باند را از منابع حیاتی‌تری مانند CSS یا تصویر LCP می‌دزدید.

شما باید *فقط و فقط* فونت‌هایی را Preload کنید که برای رندر محتوای بالای صفحه (Above-the-fold) در بارگذاری اولیه *ضروری* هستند.

چک لیست فنی شناسایی فونت حیاتی:

  1. صفحه را بارگذاری کنید و DevTools را باز کنید. به تب “Performance” بروید و پروفایل بارگذاری صفحه را ضبط کنید.
  2. LCP خود را پیدا کنید. در نوار “Timings”، نشانگر “LCP” را پیدا کنید. آیا عنصر LCP شما یک بلاک متنی است؟ (مثلاً عنوان <h1>)
  3. فونت LCP را شناسایی کنید. روی عنصر LCP کلیک کنید و در تب “Computed” ببینید از چه font-family و font-weight استفاده می‌کند. (مثلاً: Vazir, Bold).
  4. فایل فونت را پیدا کنید. به تب “Network” بروید و بر اساس نام (مثلاً “vazir”) فیلتر کنید. فایل فونت دقیق (مثلاً vazir-bold.woff2) را پیدا کنید.
  5. تبریک می‌گویم. این فایل، کاندیدای شماره یک شما برای Preload فونت است.

معمولاً، شما فقط به Preload فونت برای ۱ یا ۲ فایل در هر صفحه نیاز دارید (مثلاً فونت اصلی بدنه در حالت Regular و فونت عناوین در حالت Bold).

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

نتیجه‌گیری: Preload فونت به مثابه یک ابزار جراحی دقیق

برای «سارا» به عنوان مدیر بازاریابی فنی، Preload فونت یک ابزار جراحی دقیق است، نه یک چکش سنگین. این تکنیک، وقتی به درستی اجرا شود، کنترل بی‌نظیری بر «مسیر رندر بحرانی» به شما می‌دهد.

به یاد داشته باشید:

  • Preload فونت مشکل «کشف دیرهنگام» (Late Discovery) را حل می‌کند و مستقیماً بهینه سازی LCP فونت را هدف قرار می‌دهد.
  • font-display: swap مشکل «متن نامرئی» (FOIT) را حل می‌کند و به عنوان یک «بیمه» برای جلوگیری از بدترین حالت عمل می‌کند.
  • ترکیب این دو، استراتژی نهایی برای رفع خطای CLS فونت و جلوگیری از جابجایی فونت است، زیرا مدت زمان FOUT را به حداقل می‌رساند.

با اجرای آموزش Preload فونت به شیوه‌ای که در این راهنما تشریح شد، شما E-E-A-T فنی خود را به گوگل اثبات می‌کنید و گامی بزرگ در جهت دستیابی به امتیازات عالی در Core Web Vitals برمی‌دارید.