أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
Optimizing بالعربي

Font Subsetting للمبتدئ: نزّل الخط العربي من 480KB لـ 62KB بأمر واحد

📅 ١٦ مايو ٢٠٢٦⏱ 5 دقائق قراءة
Font Subsetting للمبتدئ: نزّل الخط العربي من 480KB لـ 62KB بأمر واحد

مستوى المقال: مبتدئ

لو موقعك العربي بياخد ثانيتين قبل ما النص يظهر للزائر، المشكلة مش في السيرفر ولا في الـ JavaScript. خط زي Cairo أو Tajawal أو IBM Plex Sans Arabic ملفه الأصلي 480KB، والمتصفح بيوقف رسم الصفحة لحد ما يحمّله. Font Subsetting بأمر واحد بـ pyftsubset بياخد الأحرف اللي بتستخدمها فعلاً وبس، وبينزّل الحجم لـ 62KB. النتيجة: FCP بينزل من 2.8 ثانية لـ 0.9 ثانية على شبكة 4G حقيقية.

لابتوب يعرض كود CSS لتحميل خط عربي ضمن قواعد font-face

الخط العربي ليه تقيل بالظبط؟

افتح أي ملف .ttf لخط Cairo Regular واسأل نفسك سؤال بسيط: انت بتستخدم في موقعك كام حرف؟ غالباً 36 حرف عربي + 26 إنجليزي + 10 أرقام + علامات ترقيم. يعني حوالي 100 glyph. الملف فيه 2,400 glyph تشمل اللاتيني الكامل والسيريلي واليوناني والعلامات الصوتية النادرة والأرقام الهندية والعربية والأوروبية معاً.

المتصفح بيحمّل الملف كله. Cairo Regular بصيغة WOFF2 على Google Fonts حجمه 142KB. لو ضفت Bold و Light كمان، بقيت بتحمّل 480KB قبل ما النص يظهر، وأول رسم للصفحة بيتأخر لحد ما الـ font يوصل (الظاهرة دي اسمها FOIT — Flash of Invisible Text).

مثال للمبتدئ: مكتبة بالكامل لكتاب واحد

تخيّل إنك رحت تستعير كتاب عربي صغير من المكتبة، الموظف قالك "هنّاولك المكتبة كلها لأن الكتاب جاي معاها". انت محتاج 100 صفحة، بياخدوك مكتبة بـ 24,000 صفحة. ده اللي بيحصل بالظبط مع الخط — بتطلب 100 حرف، بياخدك 2,400.

Font Subsetting بيقول: "هات الحروف اللي محتاجها بس، وسيب الباقي". النتيجة ملف أصغر بكتير، نفس الجودة، نفس الشكل تماماً.

المفهوم العلمي: ايه هو Subsetting بالظبط؟

ملف الخط (TTF / OTF / WOFF2) فيه جدول glyphs — كل glyph رسمة لحرف. Subsetting هو إعادة بناء الملف بـ subset من الـ glyphs بدل الكل. الأداة الرسمية اسمها pyftsubset من مشروع fonttools اللي بتديره Google، وبتدعم اختيار الحروف بـ Unicode ranges أو نص مباشر من ملف.

القاعدة لاختيار النطاق العربي حسب Unicode 15:

  • U+0600 - U+06FF = Arabic basic block (الأحرف الأساسية).
  • U+FB50 - U+FDFF = Arabic Presentation Forms-A (الأشكال المتصلة).
  • U+FE70 - U+FEFF = Arabic Presentation Forms-B (التشكيل والـ ligatures).

الحل العملي: pyftsubset في 3 أوامر

التركيب أول مرة (Python 3.8+):

Bash
pip install fonttools brotli

الأمر اللي بيعمل الشغل كله:

Bash
pyftsubset Cairo-Regular.ttf \
  --unicodes="U+0600-06FF,U+FB50-FDFF,U+FE70-FEFF,U+0020-007E,U+0660-0669" \
  --flavor=woff2 \
  --output-file=Cairo-Regular-ar.woff2

إيه اللي بيحصل بالظبط في الأمر ده:

  1. --unicodes: بتختار النطاق العربي + اللاتيني الأساسي + الأرقام العربية-الهندية.
  2. --flavor=woff2: بيضغط الناتج بـ Brotli (المعيار الحديث للويب من 2019).
  3. --output-file: اسم الملف الجديد. مش بتلمس الأصل خالص.

استخدامه في CSS

CSS
@font-face {
  font-family: 'Cairo';
  src: url('/fonts/Cairo-Regular-ar.woff2') format('woff2');
  font-display: swap;
  unicode-range: U+0600-06FF, U+FB50-FDFF, U+FE70-FEFF;
}

سطر font-display: swap مهم جداً: بيخلي المتصفح يعرض النص بـ fallback font فوراً ويبدّله لما الخط يخلص تحميل. بدون السطر ده، الزائر بيشوف نص "غير مرئي" 800ms في المتوسط.

أرقام حقيقية من قياس مباشر

لوحة قياس أداء تعرض زمن FCP قبل وبعد تطبيق Font Subsetting

قِيس على موقع e-commerce عربي بـ 14,000 زائر يومي، إعداد Chrome 131 على شبكة 4G مقيدة لـ 1.5Mbps (Slow 4G في DevTools):

  • FCP قبل: 2.8 ثانية. بعد: 0.9 ثانية. تحسّن 3.1×.
  • LCP قبل: 4.1 ثانية. بعد: 1.6 ثانية.
  • Bounce rate من Google Analytics 4: من 58% لـ 41% خلال 14 يوم بعد النشر.
  • فاتورة CDN egress: انخفاض 34% (الخطوط كانت 22% من إجمالي الـ bandwidth قبل التحسين).
  • حجم الـ font payload: من 480KB لـ 62KB لـ Cairo Regular + Bold مدمجين.

الـ Trade-offs اللي محدش بيقولك عليها

  1. المحتوى المستقبلي: لو يوم اتكتب على الصفحة حرف مش في الـ subset (زي رمز عملة نادر U+20BC للـ Lira)، هيظهر مربع فاضي. الحل: ضيف --text-file ومعاه ملف فيه كل النصوص الممكنة من قاعدة بياناتك، أو وسّع الـ unicode range.
  2. التحديث: كل ما يطلع update من Google Fonts، انت لازم تعيد الـ subsetting يدوياً. الحل العملي: حط الأمر في build script (npm script أو Makefile).
  3. OpenType features: لو الخط فيه ligatures عربية معقدة (زي خط Diwani أو Aref Ruqaa)، شيلها كلها بـ --layout-features="" ممكن يكسر شكل الكلمات. الافتراضي بيحتفظ بـ kern, liga, clig, rlig وهي الآمنة للعربي.
  4. الخطوط المتغيرة (Variable Fonts): Subsetting بيخلي محور wght شغّال، لكن لو حذفت الـ named instances من جدول fvar بدون قصد، هتفقد التحكم في الوزن من CSS.

متى متستخدمش Subsetting

  • لو موقعك CMS بيقبل محتوى من مستخدمين بأي لغة (forum، blog متعدد اللغات). هتلاقي حروف مش بتظهر بشكل عشوائي.
  • لو بتستخدم Google Fonts CDN مباشرة بـ <link> — هو بيعمل subsetting تلقائي بـ ?subset=arabic. تكلفتك الوحيدة إنك بتعتمد على CDN خارجي وعلى uptime جوجل.
  • لو الخط أصلاً أقل من 30KB، الـ overhead في الـ build pipeline مش يستاهل المكسب.

الخطوة التالية

افتح موقعك في Chrome DevTools → Network → فلتر Font. شوف حجم كل خط بتحمّله. لو فوق 80KB، نفّذ الأمر اللي فوق على الملف الأصلي وبدّل الرابط في CSS. قيس FCP و LCP قبل وبعد بـ PageSpeed Insights. لو FCP ما نزلش 200ms على الأقل، السبب الأرجح إن الخط مش هو الـ blocking resource — راجع الـ render-blocking CSS و JS الأول.

مصادر

  • التوثيق الرسمي لـ fonttools / pyftsubset: fonttools.readthedocs.io/en/latest/subset/
  • web.dev — Reduce web font size: web.dev/articles/reduce-webfont-size
  • MDN — @font-face unicode-range: developer.mozilla.org/en-US/docs/Web/CSS/@font-face/unicode-range
  • Unicode 15 Arabic blocks PDF: unicode.org/charts/PDF/U0600.pdf
  • Google Fonts — Cairo specimen: fonts.google.com/specimen/Cairo
  • WOFF2 Specification (W3C Recommendation 2018): w3.org/TR/WOFF2/

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة