أفضل الممارسات للخطوط

تحسين خطوط الويب لـ "مؤشرات أداء الويب الأساسية"

تتناول هذه المقالة أفضل الممارسات المتعلّقة بأداء الخطوط. هناك مجموعة متنوعة من الطرق التي تؤثر بها خطوط الويب في الأداء:

تنقسم هذه المقالة إلى ثلاثة أقسام: تحميل الخط وعرض الخط وعرض الخط. يوضّح كل قسم آلية عمل هذا الجانب المحدّد من دورة حياة الخط ويقدّم أفضل الممارسات ذات الصلة.

جارٍ تحميل الخط

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

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

لقطة شاشة لعلامة التبويب "التوقيت" في أدوات المطوّرين

فهم @font-face

قبل التعمّق في أفضل الممارسات المتعلقة بتحميل الخطوط، من المهمّ فهم آلية عمل @font-face وتأثير ذلك في تحميل الخطوط.

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

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

من المفاهيم الخاطئة الشائعة أنّه يتم طلب خط عند العثور على بيان @font-face، ولكن هذا غير صحيح. لا يؤدي @font-face بحد ذاته إلى بدء تنزيل الخط. بدلاً من ذلك، لا يتم تنزيل الخط إلا إذا تمت الإشارة إليه من خلال النمط المستخدَم في الصفحة. على سبيل المثال:

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

h1 {
  font-family: "Open Sans"
}

بعبارة أخرى، في المثال أعلاه، لن يتم تنزيل Open Sans إلا إذا كانت الصفحة تحتوي على عنصر <h1>.

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

بيانات الخطوط المضمّنة

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

<head>
  <style>
    @font-face {
        font-family: "Open Sans";
        src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    }

    body {
        font-family: "Open Sans";
    }

    ...etc.

  </style>
</head>

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

الاتصال المُسبَق بأصول خارجية مهمة

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

<head>
  <link rel="preconnect" href="https://fonts.com">
</head>

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

<head>
  <link rel="preconnect" href="https://fonts.com">
  <link rel="preconnect" href="https://fonts.com" crossorigin>
</head>

عند استخدام تلميح المورد preconnect، تذكَّر أنّ مقدّم الخطوط قد يعرض أوراق الأنماط والخطوط من مصادر منفصلة. على سبيل المثال، هذه هي الطريقة التي سيتم بها استخدام تلميح المورد preconnect لخطوط Google.

<head>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>

يُرجى توخّي الحذر عند استخدام preload لتحميل الخطوط.

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

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

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

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

إرسال الخطوط

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

استخدام الخطوط المستضافة ذاتيًا

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

إذا كنت تفكر في استخدام خطوط ذات استضافة ذاتية، تأكَّد من أنّ موقعك الإلكتروني يستخدم شبكة توصيل المحتوى (CDN) وHTTP/2. وبدون استخدام هذه التقنيات، من غير المرجح أن تقدم الخطوط المستضافة ذاتيًا أداءً أفضل. لمزيد من المعلومات، يُرجى الاطّلاع على شبكات توصيل المحتوى.

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

استخدام WOFF2

من بين خطوط الخطوط الحديثة، يُعدّ WOFF2 هو الأحدث ويوفّر أوسع توافقًا مع المتصفّح ويقدّم أفضل أنواع الضغط. ولأنّه يستخدم Brotli، يضغط WOFF2 بنسبة %30 أفضل من WOFF، ما يؤدي إلى تنزيل بيانات أقل وبالتالي أداء أسرع.

نظرًا لتوافق المتصفّحات مع هذا النوع من ملفات الخطوط، ينصح الخبراء الآن باستخدام WOFF2 فقط:

نعتقد أنّه حان الوقت أيضًا لإعلان أنّه يجب استخدام WOFF2 فقط وعدم الاعتماد على أيّ تنسيق آخر.

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

برام شتاين، من "منجم الويب لعام 2022"

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

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

يُعلم المعرّف unicode-range في تعريف @font-face المتصفّح بالأحرف التي يمكن استخدام الخط معها.

@font-face {
    font-family: "Open Sans";
    src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    unicode-range: U+0025-00FF;
}

سيتم تنزيل ملف الخط إذا كانت الصفحة تحتوي على حرف واحد أو أكثر يتطابق مع نطاق Unicode. يُستخدَم unicode-range عادةً لعرض ملفات خطوط مختلفة استنادًا إلى اللغة المستخدَمة في محتوى الصفحة.

غالبًا ما يتم استخدام unicode-range مع تقنية المجموعات الفرعية. يتضمّن الخط الفرعي جزءًا أصغر من الرموز المميّزة التي كانت مضمّنة في ملف الخط الأصلي. على سبيل المثال، بدلاً من عرض جميع الأحرف لجميع المستخدمين، قد ينشئ الموقع الإلكتروني خطوطًا فرعية منفصلة للأحرف اللاتينية والسيريلية. يختلف عدد الأحرف الرسومية لكل خط بشكل كبير: عادةً ما تكون الخطوط اللاتينية بحجم يتراوح بين 100 و1000 حرف رسومي لكل خط، وقد تحتوي خطوط CJK على أكثر من 10,000 حرف. يمكن أن تؤدي إزالة الأحرف غير المستخدَمة إلى تقليل حجم ملف الخط بشكل كبير.

قد يوفّر بعض موفّري الخطوط إصدارات مختلفة من ملفات الخطوط مع مجموعات فرعية مختلفة تلقائيًا. على سبيل المثال، تُجري Google Fonts ذلك تلقائيًا:

/* devanagari */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJbecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* latin-ext */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJnecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

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

من الممكن أيضًا إنشاء مجموعة فرعية من الخطوط يدويًا إذا كان موفِّر الخطوط يسمح بذلك، إما من خلال واجهة برمجة تطبيقات (تتيح خدمة Google Fonts ذلك من خلال توفير مَعلمة text)، أو من خلال تعديل ملفات الخطوط يدويًا ثمّ استضافتها بنفسك. تتضمن أدوات إنشاء مجموعات فرعية من الخطوط الخط الفرعي والرسم البياني. ومع ذلك، تحقَّق من توفّر ترخيص للخطوط التي تستخدمها يسمح بإنشاء مجموعات فرعية واستضافتها ذاتيًا.

استخدام عدد أقل من خطوط الويب

إنّ أسرع خط يتم إرساله هو الخط الذي لم يتم طلبه في المقام الأول. خطوط النظام والخطوط المتغيّرة هما طريقتان لتقليل عدد خطوط الويب المُستخدَمة على موقعك الإلكتروني.

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

لاستخدام خط النظام في CSS، أدرِج system-ui كعائلة الخطوط:

font-family: system-ui

تعتمد فكرة الخطوط المتغيّرة على إمكانية استخدام خط متغيّر واحد كبديل لملفات خطوط متعددة. تعمل الخطوط المتغيّرة من خلال تحديد نمط خط "تلقائي" وتوفير "محاور" للتلاعب بالخط. على سبيل المثال، يمكن استخدام خط متغيّر مع محور Weight لتنفيذ الأحرف التي كانت تتطلّب في السابق خطوطًا منفصلة للخط الفاتح والعادي والغامق والغامق جدًا.

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

عرض الخط

عندما يواجه المتصفّح خط ويب لم يتم تحميله بعد، يواجه معضلة: هل يجب الانتظار إلى أن يصل خط الويب قبل عرض النص؟ أم يجب عرض النص بخط احتياطي إلى أن يصل خط الويب؟

تتعامل المتصفحات المختلفة مع هذا السيناريو بشكلٍ مختلف. سيحظر متصفّح Firefox ومتصفّحات Chromium تلقائيًا عرض النص لمدة تصل إلى 3 ثوانٍ إذا لم يتم تحميل خط الويب المرتبط، وسيحظر Safari عرض النص إلى أجل غير مسمى.

يمكن ضبط هذا السلوك باستخدام سمة font-display. قد يؤدي هذا الاختيار إلى تداعيات كبيرة، فمن الممكن أن يؤثر font-display في سرعة عرض أكبر جزء من المحتوى على الصفحة (LCP) وسرعة عرض المحتوى على الصفحة (FCP) وثبات التنسيق.

اختيار استراتيجية font-display مناسبة

تُعلم font-display المتصفّح بالطريقة التي يجب أن يتّبعها في عرض النص عندما لا يكون قد تم تحميل خط الويب المرتبط. ويتم تحديدها حسب كل خط.

@font-face {
  font-family: Roboto, Sans-Serif
  src: url(/fonts/roboto.woff) format('woff'),
  font-display: swap;
}

هناك خمس قيم محتملة لسمة font-display:

القيمة فترة الحظر فترة الاستبدال
تلقائي يختلف حسب المتصفّح يختلف حسب المتصفّح
حظر من ثانيتَين إلى 3 ثوانٍ غير محدد
تبديل 0 ملي ثانية غير محدد
Fallback 100 مللي ثانية 3 ثوانٍ
اختياري 100 مللي ثانية لا ينطبق
  • فترة الحظر: تبدأ فترة الحظر عندما يطلب المتصفّح خط ويب. خلال فترة الحظر، إذا لم يكن خط الويب متاحًا، يتم عرض الخط بخط احتياطي غير مرئي، وبالتالي لن يظهر النص للمستخدم. إذا لم يكن الخط متاحًا في نهاية فترة الحظر، سيتم عرضه بالخط الاحتياطي.
  • فترة الاستبدال: تأتي فترة الاستبدال بعد فترة الحظر. إذا أصبح خط الويب متاحًا خلال فترة الاستبدال، سيتم "استبداله".

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

في معظم المواقع الإلكترونية، إليك الاستراتيجيات الثلاث الأكثر ملاءمةً:

  • إذا كان الأداء هو أولوية قصوى: استخدِم font-display: optional. هذا هو الأسلوب الأكثر "فعالية": يتم تأخير عرض النص لمدة لا تزيد عن 100 ملي ثانية، وهناك ضمان بعدم حدوث أي تغييرات في التنسيق مرتبطة بتبديل الخط. ومع ذلك، فإنّ الجانب السلبي هنا هو أنّه لن يتم استخدام خط الويب إذا وصل متأخّرًا.

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

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

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

تقليل الاختلاف بين الخط الاحتياطي وخط الويب

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

الخاتمة

لا تزال خطوط الويب تؤثر سلبًا في الأداء، ولكن لدينا مجموعة متنامية من الخيارات التي تتيح لنا تحسينها للحدّ من هذا التأثير قدر الإمكان.