ضبط ميزانيات للأداء باستخدام حزمة الويب

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

إليك تطبيق يحصّل الأيام المتبقية حتى حلول العام الجديد. وقد تم إنشاؤه باستخدام React وmoment.js. (تمامًا مثل التطبيقات الواقعية التي تعتمد بشكل متزايد على الإطارات والمكتبات. 😉)

تطبيق يحصّل الأيام المتبقية حتى حلول عيد رأس السنة

القياس

يحتوي هذا الدرس التطبيقي على الترميز في حزمة ويب.

  1. انقر على Remix to Edit (إنشاء ريمكس لتعديله) ليصبح المشروع قابلاً للتعديل.
  2. انقر على Terminal (ملاحظة: إذا لم يظهر الزر "محطة دفع"، قد تحتاج إلى استخدام خيار "ملء الشاشة").
  3. للحصول على قائمة بمواد العرض وأحجامها مصنَّفة حسب اللون، اكتب webpack في وحدة التحكّم.
webpack

يتم تمييز الحِزمة الرئيسية باللون الأصفر لأنّ حجمها أكبر من 244 كيلوبايت (250 كيلوبايت).

إخراج Webpack يعرض حجم الحِزمة 323 كيلوبايت
تحذير من Webpack بشأن حِزمة JavaScript كبيرة الحجم ⚠️

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

تحذير من Webpack بأنّ مادة العرض تتجاوز الحدّ الأقصى المقترَح للحجم
تحذير من Webpack بشأن حِزمة JavaScript كبيرة الحجم ⚠️

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

اقتراح لتحسين أداء Webpack
اقتراح لتحسين أداء Webpack 💁

تحديد ميزانية أداء مخصّص

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

في هذا العرض التوضيحي البسيط، جرِّب استخدام ميزانية أكثر تحفظًا واضبطها على 100 كيلوبايت (97.7 كيلوبايت). في webpack.config.js، أضِف ما يلي:

module.exports = {
  //...
  performance: {
    maxAssetSize: 100000,
    maxEntrypointSize: 100000,
    hints: "warning"
  }
};

يتم ضبط ميزانية الأداء الجديدة بوحدة البايت:

  • ‫100,000 بايت لمواد العرض الفردية (maxAssetSize)
  • 100000 بايت لنقطة الإدخال (maxEntrypointSize)

في هذه الحالة، هناك حزمة واحدة فقط تعمل أيضًا كنقطة دخول.

القيم المتاحة للتلميحات هي:

  1. warning (تلقائي): يعرض هذا الخيار رسالة تحذير صفراء، ولكن التصميم ناجح. من الأفضل استخدام هذا الإجراء في بيئات التطوير.
  2. error: يتم عرض رسالة خطأ باللون الأحمر، ولكن لا يزال الإصدار ناجحًا. ننصح باستخدام هذا الإعداد لإصدارات الإصدار العلني.
  3. false: لا يتم عرض أي تحذيرات أو أخطاء.
خطأ في أداء Webpack بخط أحمر
"خطأ" في تلميح أداء Webpack 🚨

تحسين

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

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

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

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

في app/components/Countdown.jsx، أزِل ما يلي:

const today = moment();
const yearEnd = moment().endOf('year');
const daysLeft = yearEnd.diff(today, 'days');

واحذف هذا السطر:

const moment = require('moment');

يتطلب الأمر بعضًا من الرياضيات، ولكن يمكنك تنفيذ العدّ التنازلي نفسه باستخدام vanilla JavaScript:

const today = new Date();
const year = today.getFullYear();
const yearEnd = new Date(year,11,31); //months are zero indexed in JS
const timeDiff = Math.abs(yearEnd.getTime() - today.getTime());
const daysLeft = Math.ceil(timeDiff / (1000 * 3600 * 24));

أزِل الآن moment.js من package.json وشغِّل webpack في وحدة التحكّم مرة أخرى لإنشاء الحِزمة المحسّنة.

بهذه السهولة. لقد خفّضت حجم التطبيق بمقدار 223 كيلوبايت (230 كيلوبايت) وأصبح ضمن الميزانية.🎉

حجم حِزمة Webpack بعد التحسين هو 97.7 كيلوبايت

مراقب

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