تعزيز كفاءة الضغط باستخدام القواميس المشتركة

ضغط البيانات هو أسلوب تم اختباره على فترة زمنية لتحسين الأداء ويقلل من حجم موارد الصفحة المؤهَّلة. كان من الشائع استخدام gzip على خوادم الويب لفترة من الوقت بشكل أساسي لضغط موارد الصفحات الشائعة المستندة إلى نص مثل ملفات HTML وCSS وJavaScript وإرسالها إلى العميل حيث يمكن فك ضغطها. وتتمثل النتيجة في أوقات تحميل أسرع للموارد بدون التأثير في السلوك المقصود للصفحة.

وعلى الرغم من فعالية برنامج gzip في حد ذاته، فقد تم إدخال تحسينات إضافية على الضغط على الويب في السنوات الأخيرة. في عام 2016، تم شحن خوارزمية Brotli في Chrome، ما أدى إلى تحقيق نسب ضغط أفضل بشكل عام للموارد المؤهلة. بحلول نهاية عام 2017، أصبحت جميع المتصفحات الحديثة متوافقة مع Brotli، وبدأ دعم الخادم لها في الانتشار على نطاق أوسع. وفي الآونة الأخيرة، شحن Chrome ضغط ZStandard.

لا يتوقف العمل عند هذا الحد برغم ذلك! لا يزال فريق Chrome يعمل على جعل القواميس المشتركة قابلة للاستخدام على الويب، وهي متاحة الآن في مرحلة التجربة والتقييم لكل من Botli وZStandard. يمكن للقواميس المشتركة أن تُكمِّل ضغط Brotli وZStandard لتقديم نسب ضغط أعلى بكثير للمواقع الإلكترونية التي تحمِّل رموزًا معدّلة بشكل متكرر، ويمكن أن تحقّق نِسب ضغط تبلغ 90% أو أفضل في بعض الحالات. تحتوي هذه المشاركة على مزيد من التفاصيل حول كيفية عمل القواميس المشتركة، وكيف يمكنك التسجيل في تجارب المصدر لاستخدامها مع Brotli وZStandard على موقعك الإلكتروني.

شرح القواميس المشتركة

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

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

في ما يلي مثال على مدى فعالية قاموس الضغط المخصص: لنفترض أن موقعك الإلكتروني يستخدم إطار العمل Angular، وأن الإصدار الحالي الذي تستخدمه هو الإصدار 1.7.9. يبلغ هذا الإصدار من إطار العمل Angular حوالي 172 كيلوبايت غير مضغوط. وعند ضغطه بإعدادات Brotli التلقائية، يصبح حجمه حوالي 53 كيبيبايت. وهذا يؤدي إلى الحصول على نسبة ضغط تبلغ 70% تقريبًا. ومع ذلك، لنفترض أنك قررت الترقية إلى Angular 1.8.3 في وقت لاحق. نظرًا لأن هذا الإصدار من Angular هو بنفس حجم الإصدار 1.7.9 تقريبًا، يمكنك توقع نسبة الضغط نفسها إلى حد كبير مثل الإصدار السابق.

هذا هو المكان الذي يمكن أن يكون فيه القاموس المخصص مفيدًا باستخدام عملية تُعرف باسم ضغط دلتا، وهي عندما يمكن استخدام قاموس لإصدار سابق من مورد لضغط نسخة أحدث. باستخدام المثال السابق، إذا ضغطت الإصدار 1.8.3 من Angular باستخدام الإصدار 1.7.9 كقاموس، ستكون الناتج أكثر من 4 كيلوبايت. ويمثّل ذلك نسبة ضغط تبلغ %98 تقريبًا. من الواضح أن القواميس المضغوطة يمكن أن يكون لها تأثير كبير في أداء التحميل، كما أن فعاليتها قد تحققت في الواقع الفعلي!

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

كيفية إعلان Chrome عن إتاحة القواميس المشتركة

تعلن جميع المتصفّحات عن خوارزميات الضغط المتوافقة من خلال عنوان الطلب Accept-Encoding. يكون محتوى العنوان قائمة مفصولة بفواصل من الترميزات المتوافقة:

Accept-Encoding: gzip, br, zstd

ينص عنوان Accept-Encoding هذا على أنّ المتصفّح الذي يطلب المورد يتوافق مع خوارزميات الضغط gzip وBrotli وZStandard. بعد ذلك يمكن لخادم الويب الذي يستجيب للطلب أن يحدد الخوارزمية التي سيتم استخدامها عند الاستجابة للطلب.

عند تفعيل إمكانية استخدام القاموس المشترك وتوفير قاموس ذي صلة لأحد الموارد، تتم إضافة رموز مميزة إضافية إلى عنوان Accept-Encoding. هذه الرموز المميّزة هي br-d لـ Brotli وzstd-d لـ Zstandard. سيتضمن Chrome أيضًا تجزئة قاموس متاح، والتي سيتم تناولها بعد ذلك.

Accept-Encoding: gzip, br, zstd, br-d, zstd-d
Available-Dictionary: :pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4=:

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

ضغط القاموس المشترك للموارد الثابتة

مورد الصفحة الثابتة هو مورد ينتج دائمًا الاستجابة نفسها لعنوان URL المطلوب. ومن الأمثلة الشائعة على موارد الصفحة الثابتة القابلة للضغط، ملفات JavaScript وCSS. يتم عادةً تحديد نُسخ من هذه الموارد لأغراض التخزين المؤقت بطريقة ما، وأحيانًا يتم ذلك باستخدام تجزئة من محتوى الملف في اسم الملف (على سبيل المثال styles.abcd1234.css)، أو طريقة أخرى لبصمة المورد. وتتناسب أنواع الموارد هذه بشكل كبير مع ضغط دلتا الذي توفره القواميس المشتركة، حيث يتم تخزين الموارد الثابتة مؤقتًا غالبًا لفترات زمنية طويلة وتميل إلى تحديثها ببعض التكرارات.

يمكن تحديد قاموس لمورد ثابت من خلال ضبط عنوان الاستجابة Use-As-Dictionary له. يأخذ العنوان أحد أزواج المفتاح/القيمة، ولكن الشرط الوحيد المطلوب هو match، الذي يقبل بنية URLPattern التي تحدِّد مسار المورد حيث يجب استخدام القاموس:

Use-As-Dictionary: match="/dist/styles.*.css"

يمكن اعتبار عنوان Use-As-Dictionary آليةً تنطبق على الإصدارات المستقبلية من مورد يتطابق مع النمط المحدّد داخله. لنفترض أن موقعك الإلكتروني يشحن جميع أنماطه في ملف CSS واحد. للتبسيط، لنفترض أنّ الإصدار الأول من هذا المورد يتوفّر في /dist/styles.v1.css، وتم إرساله مع عنوان استجابة Use-As-Dictionary يحتوي على القيمة match التي تبلغ /dist/styles.*.css.

بعد مرور بعض الوقت، يمكنك تعديل خدمة مقارنة الأسعار (CSS) الخاصة بموقعك الإلكتروني وشحن نسخة جديدة منها على /dist/styles.v2.css. بما أنّ القيمة match المستخدَمة في عنوان الاستجابة Use-As-Dictionary من الإصدار السابق تنطبق على هذا الطلب، سيرسل المتصفّح عنوان Available-Dictionary يحتوي على تجزئة من القاموس مرمّز على شكل تسلسل بايت للحقل المنظَّم:

Accept-Encoding: gzip, br, zstd, br-d, zstd-d
Available-Dictionary: :pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4=:

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

إذا كنت تشحن رمزًا جديدًا لموقعك الإلكتروني بشكل متكرر، قد يؤدي ضغط دلتا إلى حدوث تأثير كبير. ومع ذلك، فإن العملية مرنة. إذا لم يحدِّد المتصفِّح أنّ هناك قاموسًا متاحًا في ذاكرة التخزين المؤقت الخاصة بالمستخدم، لن يحدّد الرمز المميز br-d أو zstd-d الإضافي في عنوان Accept-Encoding. وفي هذه الحالة، ينطبق تدفق الضغط القياسي.

ضغط القاموس المشترك للموارد الديناميكية

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

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

<link rel="dictionary" href="/dictionary.dat">

عندما يصادف Chrome العنصر <link> هذا، قد يجلب القاموس عندما تكون الصفحة غير نشطة، وبأولوية منخفضة لتجنب تزايد الطلب على معدل نقل البيانات. يجب أن تحدّد استجابة القاموس نفسه عنوان Use-As-Dictionary وأن تحدّد مسار المورد الديناميكي الذي ينطبق عليه:

Use-As-Dictionary: match="/product/*"

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

ضغط الموارد الثابتة في وقت الإصدار

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

تستخدم معظم الحزم المستندة إلى Node.js والتي تدعم الضغط مكتبة Zlib المدمجة في Node. يوفّر Zlib توافقًا مع Brotli وبرامج الحِزم التي تستخدمها عادةً، وتوفّر واجهة لتمرير الخيارات مباشرةً إلى Zlib، والتي تدعم الضغط بمساعدة القاموس. فيما يلي بعض برامج الحِزم التي تتيح استخدام القواميس:

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

ننصحكم بتجربتها.

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

  1. إذا كنت تريد تعديل ضغط القاموس المشترك بنفسك للتعرف على كيفية عمله، يمكنك تفعيل الميزة التجريبية نقل قاموس مضغوط في صفحة chrome://flags.
  2. إذا كنت تريد تجربة ذلك على الموقع الإلكتروني للإصدار العلني ومعرفة كيف يمكن للمستخدمين الحقيقيين الاستفادة من ضغط القواميس المشترك، يمكنك التسجيل في مرحلة التجربة والتقييم للحصول على رمز مميّز، والاطّلاع على طريقة عمل مراحل التجربة والتقييم.

الخلاصة

نحن متحمسون للغاية لهذا التطور الكبير في تقنية الضغط على الويب، ومدى سرعته في جعل التطبيقات الحالية التي يستخدمها الناس يوميًا. ننصحك بتجربة هذه الميزة، والأهم من ذلك، نريد أن نعرف رأيك في حال استخدامها. إذا عثرت على خطأ، يمكنك تقديمه على crbug.com. للحصول على موارد وأدوات إضافية، يمكنك الانتقال إلى use-as-dictionary.com. وأخيرًا، إذا أردت الاطّلاع على مزيد من التفاصيل حول آلية عمل هذه الأخطاء، يمكنك اعتبار الشرح خطوة تالية جيدة.