تقليل حجم الخط على الويب

يعد أسلوب الخط أمرًا أساسيًا للتصميم الجيد والعلامة التجارية وسهولة القراءة وإمكانية الوصول. تتيح خطوط الويب كل ما سبق وغير ذلك: يمكن اختيار النص والبحث عنه وتكبيره وملائمته لكثافة البكسل العالية، ما يوفر عرضًا متسقًا وواضحًا للنص بغض النظر عن حجم الشاشة ودرجة دقتها. إنّ WebFonts ضرورية لتصميم جيد وأداء جيد وتجربة مستخدم جيدة.

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

بنية خط الويب

خط الويب هو مجموعة من الرموز، وكل رمز هو شكل متجه يصف حرفًا أو رمزًا. نتيجة لذلك، يحدد متغيران بسيطان حجم ملف خط معين: مدى تعقيد مسارات المتجه لكل حرف رسومي وعدد الرموز الرسومية في خط معين. على سبيل المثال، يحتوي Open Sans، وهو أحد أكثر خطوط الويب رواجًا، على 897 رمزًا، بما في ذلك الأحرف اللاتينية واليونانية والسيريلية.

جدول رموز الخط

عند اختيار خط، من المهم مراعاة مجموعات الأحرف المتوافقة. إذا كنت بحاجة إلى ترجمة محتوى صفحتك إلى لغات متعدّدة، يجب استخدام خط يمكنه تقديم مظهر وتجربة متّسقان للمستخدمين. على سبيل المثال، تهدف مجموعة خطوط Noto من Google إلى توفير جميع لغات العالم. يُرجى العِلم أنّ حجم Noto الكامل، مع تضمين جميع اللغات، ينتج عنه تنزيل ملف ZIP بحجم أكبر من 1.1 غيغابايت.

في هذه المشاركة، ستتعرّف على كيفية تقليل حجم ملف خطوط الويب المرسَلة.

تنسيقات خطوط الويب

هناك حاليًا تنسيقان مُقترَحان لحاويات الخطوط مُستخدَمان على الويب:

تتوافق WOFF وWOFF 2.0 مع العديد من المتصفحات، وهي متوافقة مع جميع المتصفحات الحديثة.

  • عرض صيغة WOFF 2.0 للمتصفّحات الحديثة
  • إذا كان ذلك ضروريًا للغاية، مثلما إذا كنت بحاجة إلى إتاحة استخدام متصفّح Internet Explorer 11، على سبيل المثال، يمكنك عرض WOFF كخيار احتياطي.
  • يمكنك بدلاً من ذلك عدم استخدام خطوط الويب للمتصفّحات القديمة والرجوع إلى خطوط النظام. وقد يحقّق هذا الإجراء أداءً أفضل على الأجهزة القديمة ذات الإمكانيات المحدودة أيضًا.
  • بما أنّ WOFF وWOFF 2.0 يغطّيان جميع القواعد للمتصفّحات الحديثة والقديمة التي لا تزال قيد الاستخدام، لم يعُد استخدام EOT وTTF ضروريًا ويمكن أن يؤدي إلى زيادة أوقات تنزيل خطوط الويب.

خطوط الويب والضغط

يتضمّن كلّ من WOFF وWOFF 2.0 ميزة ضغط مدمجة. إنّ الضغط الداخلي في WOFF 2.0 يستخدم Brotli ويقدّم ضغطًا أفضل بنسبة 30% مقارنةً بـ WOFF. لمزيد من المعلومات، اطّلِع على تقرير تقييم WOFF 2.0.

أخيرًا، تجدر الإشارة إلى أنّ بعض تنسيقات الخطوط تحتوي على بيانات وصفية إضافية، مثل معلومات تلميحات الخط ومطابقة الأحرف التي قد لا تكون ضرورية على بعض المنصات، ما يتيح تحسين حجم الملف بشكل أكبر. على سبيل المثال، تحتفظ Google Fonts بأكثر من 30 صيغة محسَّنة لكل خط وترصد تلقائيًا الصيغة الأنسب لكل نظام أساسي ومتصفّح وتقدّمها.

تحديد مجموعة خطوط باستخدام @font-face

تسمح لك قاعدة CSS @font-face بتحديد موقع مورد خط معيّن وخصائص نمطه ونقاط رموز Unicode التي يجب استخدام هذا الخط لها. يمكن استخدام مجموعة من تعريفات @font-face هذه لإنشاء "مجموعة خطوط"، والتي سيستخدمها المتصفّح لتقييم موارد الخطوط التي يجب تنزيلها وتطبيقها على الصفحة الحالية.

استخدام خط متغيّر

يمكن أن تقلل الخطوط المتغيرة بشكل كبير حجم ملف الخطوط في الحالات التي تحتاج فيها إلى متغيرات متعددة للخط. بدلاً من الحاجة إلى تحميل الأنماط العادية والغامقة بالإضافة إلى النسخ المائل منها، يمكنك تحميل ملف واحد يحتوي على كل المعلومات. مع ذلك، ستكون أحجام ملفات الخطوط المتغيّرة أكبر من صيغة خط فردية، ولكنها أصغر من مجموعة الصِيَغ العديدة. بدلاً من استخدام خط متغيّر كبير واحد، قد يكون من الأفضل عرض صيغ الخطوط المهمة أولاً، مع تنزيل الصيغ الأخرى لاحقًا.

تتوفّر الخطوط المتغيّرة الآن في جميع المتصفحات الحديثة، ويمكنك الاطّلاع على مزيد من المعلومات في مقالة مقدّمة عن الخطوط المتغيّرة على الويب.

اختيار التنسيق المناسب

يوفّر كل تعريف @font-face اسم مجموعة الخطوط، التي تعمل كمجموعة منطقية من التعريفات المتعددة وخصائص الخطوط، مثل النمط وعرض الخط والتمديد، وموصّف src الذي يحدّد قائمة مُعطاة الأولوية لمواقع موارد الخطوط.

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome.woff2') format('woff2'),
       /* Only serve WOFF if necessary. Otherwise,
          WOFF 2.0 is fine by itself. */
       url('/fonts/awesome.woff') format('woff');
}

@font-face {
  font-family: 'Awesome Font';
  font-style: italic;
  font-weight: 400;
  src: local('Awesome Font Italic'),
       url('/fonts/awesome-i.woff2') format('woff2'),
       url('/fonts/awesome-i.woff') format('woff');
}

أولاً، تجدر الإشارة إلى أنّ الأمثلة أعلاه تحدّد مجموعة خطوط رائعة واحدة بنمطَين (عادي ومائل)، ويشير كل منهما إلى مجموعة مختلفة من موارد الخطوط. بدوره، يحتوي كل وصف src على قائمة بأشكال الموارد ذات الأولوية والمفصولة بفواصل:

  • يسمح لك التوجيه local() بالرجوع إلى الخطوط المثبَّتة على الجهاز وتحميلها واستخدامها. إذا كان الخط مثبتًا لدى المستخدم من قبل على نظامه، يتجاوز هذا الإجراء الشبكة بالكامل ويكون هو الأسرع.
  • تسمح لك التوجيهات url() بتحميل خطوط خارجية، ويُسمح لها بتضمين تلميح اختياري format() يشير إلى تنسيق الخط المُشار إليه من خلال عنوان URL المقدَّم.

عندما يحدّد المتصفّح أنّ الخط مطلوب، ينتقل إلى قائمة الموارد المقدّمة بالترتيب المحدّد ويحاول تحميل المورد المناسب. على سبيل المثال، باتباع المثال أعلاه:

  1. ينفّذ المتصفّح تنسيق الصفحة ويحدّد أشكال الخطوط المطلوبة لعرض النص المحدّد على الصفحة. ولا ينزّل المتصفح الخطوط التي ليست جزءًا من نموذج كائن CSS (CSSOM) للصفحة، لأنّها غير مطلوبة.
  2. يتحقق المتصفّح من توفّر كل خط مطلوب على الجهاز.
  3. إذا لم يكن الخط متاحًا على الجهاز، يتكرر المتصفِّح على التعريفات الخارجية:
    • إذا كان هناك تلميح تنسيق، يتحقّق المتصفح ممّا إذا كان يتيح التلميح قبل بدء التنزيل. إذا لم يكن المتصفّح متوافقًا مع التلميح، ينتقل المتصفّح إلى التلميح التالي.
    • إذا لم يكن هناك تلميح للتنسيق، سينزِّل المتصفِّح المورد.

يتيح لك الجمع بين الإرشادات المحلية والخارجية مع نصائح التنسيق المناسبة تحديد جميع تنسيقات الخطوط المتاحة والسماح للمتصفّح بمعالجة الباقي. يحدِّد المتصفّح الموارد المطلوبة ويختار التنسيق الأمثل.

مجموعة فرعية لنطاق Unicode

بالإضافة إلى سمات الخط، مثل النمط والسُمك والتمديد، تسمح لك قاعدة @font-face بتحديد مجموعة من نقاط ترميز Unicode المتوافقة مع كل مورد. يتيح لك ذلك تقسيم خط Unicode كبير إلى مجموعات فرعية أصغر (مثل المجموعات الفرعية اللاتينية والسيريلية واليونانية) وتنزيل الرموز المطلوبة فقط لعرض النص على صفحة معيّنة.

يسمح لك المعرّف unicode-range بتحديد قائمة مفصولة بفواصل لقيم النطاق، ويمكن أن تكون كل قيمة منها على شكل واحد من الأشكال الثلاثة التالية:

  • رمز نقطة واحد (مثلاً U+416)
  • نطاق الفاصل (على سبيل المثال، U+400-4ff): يشير إلى نقاط الترميز لبداية ونطاق نطاق
  • نطاق أحرف البدل (على سبيل المثال، U+4??): تشير أحرف ? إلى أي رقم سداسي عشري

على سبيل المثال، يمكنك تقسيم مجموعة Awesome Font إلى مجموعتَين فرعيتَين، إحداهما لاتينية والأخرى يابانية، ويقوم المتصفّح بتنزيل كلّ منهما حسب الحاجة:

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome-l.woff2') format('woff2');
  /* Latin glyphs */
  unicode-range: U+000-5FF;
}

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome-jp.woff2') format('woff2');
  /* Japanese glyphs */
  unicode-range: U+3000-9FFF, U+ff??;
}

ويتيح لك استخدام مجموعات فرعية لنطاق Unicode وملفات منفصلة لكل متغير أسلوبي للخط تحديد مجموعة خطوط مركبَّة تكون أسرع وأكثر كفاءة للتنزيل. لا ينزّل الزوّار سوى الأسعار المتغيرة والمجموعات الفرعية التي يحتاجون إليها، ولا يُجبرون على تنزيل مجموعات فرعية قد لا يرونها أو يستخدمونها مطلقًا على الصفحة.

تتوافق unicode-range مع جميع المتصفّحات تقريبًا. للتوافق مع المتصفحات القديمة، قد تحتاج إلى استخدام "الضبط الفرعي اليدوي". في هذه الحالة، عليك الرجوع إلى توفير مورد خط واحد يحتوي على جميع المجموعات الفرعية اللازمة وإخفاء الباقي من المتصفّح. على سبيل المثال، إذا كانت الصفحة تستخدم أحرفًا لاتينية فقط، يمكنك إزالة الأحرف الرسومية الأخرى وعرض هذه المجموعة الفرعية المحدّدة كمصدر مستقل.

  1. تحديد المجموعات الفرعية المطلوبة:
    • إذا كان المتصفّح يتيح استخدام مجموعة فرعية من نطاق Unicode، سيختار تلقائيًا المجموعة الفرعية المناسبة. ما على الصفحة سوى تقديم ملفات المجموعة الفرعية وتحديد نطاقات الترميز المميّز العالمي المناسبة في قواعد @font-face.
    • إذا كان المتصفح لا يتيح استخدام مجموعات فرعية لنطاق Unicode، يجب أن تخفي الصفحة جميع المجموعات الفرعية غير الضرورية، أي أنّ على المطوّر تحديد المجموعات الفرعية المطلوبة.
  2. إنشاء مجموعات فرعية من الخطوط:
    • استخدِم أداة pyftsubset المفتوحة المصدر لإضافة مجموعات فرعية وتحسين خطوطك.
    • ستُنشئ بعض خوادم الخطوط، مثل Google Font، مجموعة فرعية تلقائيًا.
    • تسمح بعض خدمات الخطوط بإنشاء مجموعة فرعية يدويًا من خلال مَعلمات طلب البحث المخصّصة، والتي يمكنك استخدامها لتحديد المجموعة الفرعية المطلوبة لصفحتك يدويًا. راجِع المستندات من مقدّم الخطوط.

اختيار الخطوط وتركيبها

قد تتألف كل مجموعة خطوط من عدّة صيغ أسلوبية (عادي وغامق ومائل) ودرجات متعددة لكل نمط. وقد يحتوي كلّ منها بدوره على أشكال رموز مختلفة جدًا، مثل المسافات أو الأحجام أو الأشكال المختلفة تمامًا.

سمات الخط

يوضّح الرسم البياني أعلاه مجموعة خطوط تتضمّن ثلاثة مستويات مختلفة من الخط العريض:

  • 400 (متوسط).
  • 700 (غامق).
  • ‫900 (غامق جدًا)

ويتم ربط جميع خيارات المنتج الأخرى البينية (المشار إليها باللون الرمادي) تلقائيًا بأقرب صيغة من خلال المتصفّح.

عند تحديد قيمة وزن لا يتوفّر لها وجه، يتم استخدام وجه بقيمة وزن قريبة. بشكل عام، يتم ربط الخطوط العريضة بوجوه ذات خطوط سميكة، ويتم ربط الخطوط الخفيفة بوجوه ذات خطوط خفيفة.

خوارزمية مطابقة الخطوط في CSS

ينطبق منطق مماثل على الصيغ المائلة. يتحكّم مصمّم الخط في الصيغ التي سينشئها، ويمكنك التحكّم في الصيغ التي ستستخدمها على الصفحة. وبما أنّ كلّ صيغة هي عملية تنزيل منفصلة، من الأفضل إبقاء عدد الصيغ منخفضًا. على سبيل المثال، يمكنك تحديد نوعَين عريضَين لمجموعة Awesome Font:

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome-l.woff2') format('woff2');
  /* Latin glyphs */
  unicode-range: U+000-5FF;
}

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 700;
  src: local('Awesome Font'),
       url('/fonts/awesome-l-700.woff2') format('woff2');
  /* Latin glyphs */
  unicode-range: U+000-5FF;
}

يعرِض المثال أعلاه عائلة Awesome Font التي تتألف من موردَين يغطّيان المجموعة نفسها من الأحرف اللاتينية (U+000-5FF) ولكنّهما يقدّمان "سمكَين" مختلفَين: عادي (400) وغامق (700). ومع ذلك، ماذا يحدث إذا حدّدت إحدى قواعد CSS وزن خط مختلفًا أو ضبطت قيمة السمة font-style على italic؟

  • إذا لم يكن هناك تطابق تام للخط، يستبدل المتصفّح أقرب تطابق.
  • في حال عدم العثور على أي تطابق في الأسلوب (على سبيل المثال، لم يتم تحديد أي صيغ مائلّة في المثال أعلاه)، ينشئ المتصفّح صيغة الخط الخاصة به.
إنشاء الخطوط

يوضّح المثال أعلاه الفرق بين نتائج الخط الفعلي ونتائج الخط الذي تم إنشاؤه من خلال التجميع لخط Open Sans. يتم إنشاء جميع الصيغ المجمّعة من خط واحد بوزن 400. كما ترى، هناك فرق ملحوظ في النتائج. لم يتم تحديد تفاصيل كيفية إنشاء الصيغة الغامقة والنسخة المائلة. وبالتالي، تختلف النتائج من متصفح إلى آخر، وهي تعتمد بشكل كبير على الخط.

قائمة التحقّق من تحسين حجم الخط على الويب

  • تدقيق استخدام الخطوط ومراقبته: لا تستخدِم عددًا كبيرًا جدًا من الخطوط على صفحاتك، وقلِّل عدد الصيغ المستخدَمة لكل خط. ويساعد ذلك في تقديم تجربة أكثر اتساقًا وأسرع للمستخدمين.
  • تجنُّب التنسيقات القديمة إن أمكن: تنسيقات EOT وTTF وWOFF أكبر من WOFF 2.0. EOT وTTF هما تنسيقان غير ضروريين تمامًا، حيث قد يكون WOFF مقبولاً إذا كنت بحاجة إلى استخدام Internet Explorer 11. إذا كنت تستهدف المتصفّحات الحديثة فقط، يُعدّ استخدام WOFF 2.0 فقط هو الخيار الأسهل والأكثر فعالية.
  • إنشاء مجموعة فرعية من موارد الخطوط: يمكن إنشاء مجموعة فرعية من العديد من الخطوط أو تقسيمها إلى نطاقات متعددة من الرموز المميّزة لعرض الرموز فقط التي تتطلّبها صفحة معيّنة. ويؤدي ذلك إلى تقليل حجم الملف وتحسين سرعة تنزيل المورد. ومع ذلك، عند تحديد المجموعات الفرعية، احرص على تحسين الخطوط لإعادة استخدامها. على سبيل المثال، لا تنزِّل مجموعة مختلفة ولكن متداخلة من الأحرف في كل صفحة. من الممارسات الجيدة تحديد مجموعة فرعية استنادًا إلى النص: على سبيل المثال، اللاتينية والسيريلية.
  • منح الأولوية لـ local() في قائمة src: يضمن إدراج local('Font Name') أولاً في قائمة src عدم إرسال طلبات HTTP للخطوط المثبَّتة.
  • استخدِم Lighthouse لاختبار ضغط النصوص.

التأثيرات على مقياسَي "سرعة عرض أكبر محتوى مرئي" (LCP) و"متغيّرات التصميم التراكمية" (CLS)

استنادًا إلى محتوى صفحتك، يمكن اعتبار عُقد النص مرشّحة من أجل سرعة عرض أكبر محتوى مرئي (LCP). لذلك، من المهم التأكّد من أنّ خطوط الويب صغيرة قدر الإمكان من خلال اتّباع النصائح الواردة في هذه المقالة لكي يتمكن المستخدمون من رؤية النص على صفحتك في أقرب وقت ممكن.

إذا كنت قلقًا من أنّه على الرغم من جهود التحسين التي بذلتها، قد يستغرق ظهور نص الصفحة وقتًا طويلاً جدًا بسبب مورد خطوط الويب الكبير، وتحتوي السمة font-display على عدد من الإعدادات التي يمكن أن تساعدك على تجنُّب النص غير المرئي أثناء تنزيل الخط. ومع ذلك، قد يؤدي استخدام القيمة swap إلى حدوث تغييرات كبيرة في التصميم تؤثر في متغيّرات التصميم التراكمية (CLS) لموقعك الإلكتروني. ننصحك باستخدام القيم optional أو fallback إن أمكن.

إذا كانت خطوط الويب مهمة لعلامتك التجارية، وبالتالي لتجربة المستخدم، ننصحك بتثبيتها مسبقًا كي يحصل المتصفّح على ميزة إضافية عند طلبها. يمكن أن يؤدي ذلك إلى تقليل فترة الاستبدال في حال استخدام font-display: swap أو فترة الحظر في حال عدم استخدام font-display.