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

تاريخ النشر: 6 مارس 2024

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

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

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

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

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

ومع ذلك، يمكن استخدام قواميس مخصّصة من إعداد المستخدمين مع 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. وأخيرًا، إذا كنت مهتمًا بمعرفة المزيد من التفاصيل حول طريقة عمل هذه الميزة، يمكنك الاطّلاع على الشرح المفصّل.