سرعة الموقع

الخطوط الفارسية وسرعة الموقع

الخط الفارسي أثقل من نظيره اللاتيني، لكن أكبر توفير لا يأتي من تخفيف الملف؛ بل من ألا ترسل ملفات لا تلزم. فهذا الموقع يكتب خمسة أوزان في أنماطه ولا يرسل إلا ثلاثة ملفات خط، مجموعها ٧٤.٦ كيلوبايت.

  • الدرس 8 من 10
  • متوسط
  • مجاني، دون تسجيل

كل وزن، قبل الساب ست وبعده

الأوزان الثلاثة التي يرسلها هذا الموقع فعلا، قيست في ٨ سبتمبر ٢٠٢٦
  • الوزن العادي، للمتن ٤١.٧ كيلوبايت٢٤.٧ كيلوبايت

    الوزن الوحيد الذي تحتاجه كل صفحة تقريبا

  • الوزن العريض، للعناوين ٤١.٨ كيلوبايت٢٤.٩ كيلوبايت

    والوزن ٦٠٠ يأتي من هذا أيضا ولا ملف له

  • أثقل وزن، للعنوان الرئيسي ٤٢.٠ كيلوبايت٢٥.٠ كيلوبايت

    ووجوده يمنع افتعال عريض مزيف

الملف الكاملالملف المصغّر

يبين هذا الشكل الأوزان الثلاثة المرسلة فقط. أما الوزنان الآخران المكتوبان في الأنماط فلا ملف لهما البتة ويختارهما المتصفح من هذه الثلاثة، فالتوفير الحقيقي أكبر مما يبينه هذا الشكل.

آخر مراجعة: تُراجع الحقائق وأسماء الأدوات في هذا الدرس مقابل مصادرها في هذا التاريخ.

لماذا يكلف الخط الفارسي أكثر

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

والرقم الحقيقي من ملفات هذا الموقع: الخط الأساسي بالوزن العادي يحمل ٧٢٦ جليفا و٦٥٢ كدبوينت وحجمه ٤١.٧ كيلوبايت. ونسخته المصغّرة تحمل ٥٩٩ جليفا و٥٢٧ كدبوينت وحجمها ٢٤.٧ كيلوبايت.

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

وما نتناوله هنا سؤال آخر يُسأل أقل: بعد أن يخف ملفك، كم من تلك الملفات عليك أن ترسل فعلا؟ وعلى هذا الموقع وفّر جواب ذلك السؤال أكثر مما وفّر الساب ست.

الخطوط الفارسية وسرعة الموقع: كم وزنا تحتاج فعلا

كم وزنا تحتاج فعلا؟

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

حين يبلغ المتصفح نصا بوزن لا تملك له ملفا، فإنه لا يتركه بلا خط ولا يفتعل خطا؛ بل يختار أقرب وزن تملكه. والقاعدة مكتوبة في معيار CSS واتجاه البحث محدد: فللوزن دون خمسمئة تُفحص الأوزان الأدنى أولا ثم الأعلى؛ وللوزن فوق خمسمئة تُفحص الأعلى أولا ثم الأدنى.

والآن هذا الموقع. في ورقة الأنماط الرئيسية خمسة أوزان مكتوبة، ويمكنك عدّها بنفسك:

grep -ohE 'font-weight:[[:space:]]*[0-9]{3}' style.css | tr -d ' ' | cut -d: -f2 | sort -un

وناتجها خمسة أرقام: ٤٠٠ و٥٠٠ و٦٠٠ و٧٠٠ و٨٠٠. لكن في HTML الذي يقدمه هذا الموقع فعلا ثلاث كتل font-face فقط: ٤٠٠ و٧٠٠ و٨٠٠. فالوزن ٥٠٠ يُحَل إلى ٤٠٠ والوزن ٦٠٠ إلى ٧٠٠، لأن القاعدة أعلاه تقول ذلك، ولا يرى أحد الفرق على الصفحة.

احسب التوفير. فالملفات الثلاثة المرسلة ٢٤.٧ و٢٤.٩ و٢٥.٠ كيلوبايت، مجموعها ٧٤.٦ كيلوبايت؛ والأوزان الثلاثة نفسها كاملة ٤١.٧ و٤١.٨ و٤٢.٠ كيلوبايت. ولو أُرسلت الأوزان الخمسة كاملة بلا ساب ست لكانت ٢٠٨.٦ كيلوبايت. أي إن قرارين معا أزالا أكثر من ثلثي وزن الخط، وكان الثاني وحده، أي عدم إرسال وزنين، نحو ٥٠ كيلوبايت: أكثر مما يوفره الساب ست على ملف واحد.

وأمر آخر متصل بالقاعدة نفسها: لأن ٧٠٠ و٨٠٠ لكليهما ملف، لا يُضطر المتصفح أبدا إلى افتعال خط عريض. والعريض المفتعل يبدو على الخط الفارسي أسوأ منه على اللاتيني، ودرس التايبوغرافيا الفارسية يشرح السبب.

واعتراف صغير من ترتيبنا غير المكتمل: في مجلد خطوط هذا الموقع وزن سادس يشغل ٤١.٥ كيلوبايت ولا يشير إليه شيء في الكود. وهو لا يُرسل إلى زائر فلا يكلف سرعة، لكنه يستحق الحذف مثله مثل غيره.

font-display: لماذا اخترنا optional لا swap

حتى يصل ملف الخط، على المتصفح أن يقرر ما يفعل بالنص، وfont-display يكتب ذلك القرار. وكل درس تقريبا يوصي باستعمال swap. أما نحن فاخترنا optional ونكتب السبب، لأن هذا من المواضع التي تعمل فيها النصيحة الشائعة أسوأ مع الفارسية.

مع swap يرسم المتصفح النص فورا بخط بديل ويبدله لحظة وصول الخط الحقيقي. فالنص لا يكون خفيا أبدا، وهذا مكسب هذا الخيار. وثمنه في تلك اللحظة بالذات: تتغير عروض الحروف وتُعاد قسمة السطور وتهتز الصفحة كلها. وتلك الهزة هي انزياح التخطيط الذي يُقاس في درس Core Web Vitals.

ومع optional يمنح المتصفح الخط نافذة قصيرة. فإن وصل في وقته رُسمت الصفحة به من البداية، وإن لم يصل بقي البديل تلك الزيارة كلها ولم يقع أي تبديل. فينعدم انزياح التخطيط الناتج عن الخط انعداما قاطعا.

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

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

swap وoptional، مقايضتان مختلفتان

swap

  • يُرسم النص فورا بالبديل ولا يكون خفيا أبدا
  • ويحل الخط الحقيقي متى وصل، ولو متأخرا
  • وفي لحظة التبديل تهتز تخطيط الصفحة

optional

  • للخط نافذة قصيرة ولا يحل بعدها البتة
  • وينعدم انزياح التخطيط الناتج عن الخط قطعا
  • وقد لا يرى الزائر بطيء الاتصال خطك أبدا

ولا واحد منهما خطأ. اخترنا optional لأنه يعدم انزياح التخطيط قطعا، وثمنه أن بعض الزوار لا يرون خطنا في زيارتهم الأولى البتة.

ابدأ الخط أبكر: preload وEarly Hints

لا يعلم المتصفح أنه يحتاج خطا حتى يقرأ CSS، ولا CSS لديه حتى يصل HTML. فتنزيل الخط يبدأ متأخرا بطبعه، وكل ما في هذا القسم أن نبدأه أبكر.

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

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

وعلى هذا الموقع يعمل ذلك ويُرى من الخارج: فالطلب إلى الصفحة الأولى يعيد أولا استجابة 103 تحمل الخطين نفسيهما، ثم استجابة 200 بالصفحة ذاتها. ولتجربته على موقعك خذ الترويسات بأداة سطر أوامر وابحث عن سطر يبدأ بالرقم ١٠٣؛ فالمتصفح لا يعرض هذه الاستجابة في أدوات المطور.

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

من أين يبدأ الخط وكيف يسبق

  1. 1

    الاستجابة التمهيدية ١٠٣

    قبل جهوز HTML يتلقى المتصفح عنوان الخط

  2. 2

    سطر preload في الرأس

    خطا المنظر الأول فقط لا الأوزان الخمسة

  3. 3

    كتلة font-face في CSS

    هنا يعرف المتصفح أي الأوزان موجودة أصلا

  4. 4

    رسم النص

    بالخط الحقيقي إن وصل، وإلا فبمجموعة البدائل

الخطوة الأولى لا تعني شيئا إلا على صفحة يستغرق بناؤها وقتا. أما صفحة تأتي من الكاش وتجيب في عشرين مللي ثانية فلا سبق لها يُكسب.

مجموعة بدائل لا تقفز

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

والمجموعة التي يستعملها هذا الموقع بهذا الترتيب: الخط المخصص، ثم خط فارسي مفتوح المصدر شائع، ثم خط النظام الافتراضي، ثم وجهان معروف وجودهما على ويندوز، وأخيرا sans-serif. والمنطق بسيط: كل درجة تتجه إلى ما هو أرجح وجودا، والدرجة الأخيرة شيء موجود دائما.

وأمران لا يجوز نسيانهما عند اختيار مجموعة فارسية. الأول أن خطا لا يحمل إلا اللاتينية ليس عديم النفع في هذه المجموعة بل ضار: فالمتصفح ينتقل إلى الدرجة التالية للحروف الفارسية لكنه قد يأخذه للأرقام والحروف اللاتينية، فيُكتب نصك بخطين مختلفين. والثاني أن Tahoma يحمل الحروف الفارسية على ويندوز، ولهذا ما زال يظهر في أكثر المجموعات الفارسية؛ وهو ليس جميلا لكنه موجود، والوجود هو بالضبط ما تُراد له الدرجات الأخيرة.

وأمر يستحق الفعل ويُفعل أقل: اختبر المجموعة فعلا. احذف في أدوات مطور متصفحك اسم الخط الحقيقي من القاعدة وانظر إلى الصفحة. فإن بقيت مقروءة سهُل قرار optional؛ وإن بدت صفحة مكسورة فغيّر مجموعتك لا font-display.

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

ورقة الخطقبل النشر

افعل هذه

  • عُدّ الأوزان التي كتبتها فعلا في الأنماط
  • اشحن ملفات للأوزان التي لا يستطيع المتصفح حلها من غيرها فقط
  • اسبق تحميل خطوط المنظر الأول فقط
  • أرسل الخطوط بعمر كاش طويل؛ فهي لا تتغير أبدا
  • انظر إلى الصفحة مرة بلا الخط الحقيقي وتأكد أنها تُقرأ

لا تفعل هذه

  • سبق تحميل كل وزن تملكه
  • وضع خط لاتيني فقط في مجموعة بدائل فارسية
  • إرسال صيغ أقدم إلى جانب woff2
  • الساب ست بناء على الحروف الظاهرة في الصفحة اليوم

المسار السريع مع الذكاء الاصطناعي

الطريقة المعتادة لتخفيف الخط أن ترفع الملف إلى خدمة على الإنترنت وتأخذ المخرج. وهي تنفع ولها مشكلتان: قرار ما يُحذف ليس لك، وتكرارها في المرة التالية يبدأ من الصفر. أما المسار السريع فخطوتان، وأولاهما هي التي يقفز عنها الجميع تقريبا: قبل تخفيف الملفات، حدد أي الملفات يلزم أصلا. وللنموذج هنا دور جيد، وليس دوره القرار؛ بل يقارن قائمة الأوزان في أنماطك بقائمة الملفات التي تملكها ويقول أي الملفات يغطيها المتصفح بنفسه. وتلك المقارنة بالذات وفّرت نحو ٥٠ كيلوبايت على هذا الموقع.

  1. عُدّ الأوزان التي كتبتها في الأنماط. والأمر الوارد في القسم الثاني يفعل ذلك بالضبط، ومخرجه قائمة أرقام قصيرة.
  2. سلّم تلك القائمة مع قائمة ملفات الخط التي تملكها إلى النموذج واسأل أي الأوزان يمكن إسقاطها وإلى أي وزن باق يُحَل كل منها.
  3. صغّر الأوزان الباقية وحدها. والأداة القياسية لذلك pyftsubset من حزمة fontTools، وهي في وضعها الافتراضي تحفظ خصائص التنضيد التي يعتمد عليها الخط الفارسي.
  4. افحص المخرج بعينك لا برقم. انظر بالخط الجديد إلى فقرة فارسية وعنوان وبضعة أرقام وكلمة لاتينية. فإن انفصل حرف عن تاليه فالساب ست معطوب، وحجم الملف لا يقول شيئا عن ذلك.

وصفة جاهزة للنسخ

أريد تقليل عدد ملفات الخط التي يرسلها موقعي دون تغيير مظهره.

الأوزان المكتوبة في ملف الأنماط:
{الصق هنا ناتج أمر عدّ الأوزان}

ملفات الخط التي أملكها الآن، بأحجامها:
{الصق قائمة الملفات هنا}

القواعد:
١. اعمل بخوارزمية مطابقة الخط في معيار CSS لا بالتخمين. ولكل وزن نحذف ملفه، قل أي وزن باق سيختاره المتصفح ولماذا.
٢. إن كان حذف وزن يجعل المتصفح يفتعل عريضا مزيفا فلا تحذفه وقل ذلك.
٣. لا تحذف وزنا لمجرد أنه استُعمل مرة واحدة في الأنماط؛ فالمعيار مقدار اختلاف أقرب وزن باق.
٤. احسب التوفير من أحجام الملفات التي أعطيتك إياها وحدها ولا تختلق أرقاما جديدة.
٥. لا تعد بشيء عن السرعة أو الترتيب.

اعطِ المخرج في ثلاثة أقسام: الملفات الباقية، والملفات الذاهبة وإلامَ يُحَل كل منها، ومجموع الحجم قبل وبعد.

قبل أن تثق بالناتج: يعرف النموذج خوارزمية مطابقة الخط ولم يرَ خطك، فأمران يبقيان لك لتفحصهما. الأول أن ملف خطك قد لا يكون الوزن الذي يدّعيه اسمه؛ فاسم الملف لا يضمن شيئا والنموذج يقرأ اسم الملف. والثاني وهو أهم أن عليك النظر في النتيجة: بعد حذف وزن، افتح صفحة يُستعمل فيها ذلك الوزن وقارن بعينك. فالفرق بين ٦٠٠ و٧٠٠ يظهر على عنوان كبير ولا يظهر على وسم صغير، ولا يحسم ذلك إلا النظر.

الذكاء الاصطناعي في هذا العمل

في شغل الخطوط يجيد الذكاء الاصطناعي عملا حقا وعملا آخر لا ينبغي أن يمسه البتة. يجيد الاستدلال على القواعد: فخوارزمية مطابقة الخط مكتوبة في معيار CSS، ويستطيع النموذج تشغيلها على قائمتك ويقول أي وزن يُحَل إلى أي. وما لا ينبغي أن يفعله إنتاج ملف الخط نفسه أو إعادة بنائه. وموقفنا: دع النموذج يمس القائمة لا الملف.

أدوات تساعد فعلا

  • Claude مناسب لذلك الاستدلال على القاعدة: يأخذ قائمة الأوزان ويشغّل خوارزمية المطابقة عليها ويلتزم بالقواعد إن وضعتها. وإيران ليست في قائمة الدول المدعومة لدى Anthropic، فلا تسجيل رسمي ولا قبول لبطاقة إيرانية.
  • Gemini مفيد للنظر في الصفحة نفسها: أعطه لقطتي شاشة لصفحة واحدة بخطين واسأل أين انزاح التخطيط. فتلك الإجابة تحسم أمجموعة بدائلك قريبة كفاية أم لا. وتقول صفحة غوغل نفسها إن تطبيق Gemini على الويب يعمل في أكثر من ٢٣٠ دولة وإقليما، وإيران ليست في تلك القائمة.
  • ChatGPT يكفي لعمل القائمة نفسه ولشرح خيارات أداة الساب ست. ولا ندّعي شيئا عن الوصول من إيران، لأن صفحة الدول المدعومة لدى OpenAI، كسائر ذلك النطاق، تعيد ٤٠٣ لهذا الخادم.

اين ينقلب ضدك

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

المصادر: MDN: font-display Anthropic: supported countries Google: where Gemini Apps are available

حدود هذه النصيحة

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

من عملنا نحن

الذي أعاننا في هذا العمل أكثر من أي ضبط آخر قاعدة داخل CSS نفسه، وقد فهمناها من قياس لا من درس. فورقة أنماط هذا الموقع تكتب خمسة أوزان، وكنا زمنا نرسل الملفات الخمسة جميعا. ثم عددنا الأوزان وقارناها بالملفات، فرأينا أن المتصفح يذهب إلى ٤٠٠ للوزن ٥٠٠ وإلى ٧٠٠ للوزن ٦٠٠، لأن خوارزمية مطابقة الخط تحكم بذلك. فحذفنا ملفين ولم يرَ أحد، ونحن منهم في مقارنة جنبا إلى جنب، أي فرق على الصفحة. وكان ذانك الملفان نحو ٥٠ كيلوبايت، أكثر مما يوفره الساب ست على ملف واحد. والدرس الذي بقي لنا: قبل أن تخفف الملفات، عُدّ كم منها يلزم أصلا.

اسئلة متابعة حقيقية

أقدّم الخط من خادمي أم من خدمة خارجية؟

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

أأحتاج صيغة غير woff2؟

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

أأستعمل خط النظام ولا أرسل خطا مخصصا البتة؟

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