0Pricing
React Academy · درس

التبعيات النظيرة وTree Shaking

صرّح عن React كتبعية نظيرة، وفعّل Tree Shaking الخالي من الآثار الجانبية، واختبر الحزمة المنشورة

التبعيات النظيرة وTree Shaking درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

ما الاعتماديات النظيرة؟

تعلن الاعتماديات النظيرة عن الحزم التي تتطلبها مكتبتك، لكنها تتوقع من المستخدم توفيرها. في package.json الخاص بمكتبتك، يجب أن يكون React ضمن peerDependencies لا dependencies. وعندما يثبت المستخدم مكتبتك، لا يثبت npm أو yarn React تلقائيًا؛ فتطبيق المستخدم يحتوي على React أصلًا، وتتشارك مكتبتك المثيلة نفسها.

لماذا لا نضع React في dependencies؟

إذا كان React ضمن dependencies في مكتبتك، فقد يثبت npm نسخة ثانية من React إلى جانب نسخة المستخدم. يؤدي وجود مثيلين من React في التطبيق نفسه إلى تعطيل جميع Hooks وظهور الخطأ "Invalid hook call". وبإعلان React كـ peerDependency، تخبر npm: "أحتاج إلى React، لكن استخدم النسخة الموجودة لدى المستخدم أصلًا."

peerDependenciesMeta للاعتماديات النظيرة الاختيارية

قد تكون بعض الاعتماديات النظيرة اختيارية، مثل مكتبة تدعم كلًا من styled-components وCSS Modules. حدّد الاعتماديات النظيرة الاختيارية باستخدام peerDependenciesMeta: { 'styled-components': { optional: true } }. لن يحذّر npm المستخدمين من الاعتماديات النظيرة الاختيارية المفقودة، لكن يظل بالإمكان توفير أنواع TypeScript عند تثبيت الحزمة الاختيارية.

حقل sideEffects

يخبر حقل sideEffects في package.json أدوات التجميع ما إذا كانت مكتبتك آمنة لإجراء tree-shaking عليها. ويخبر ضبط "sideEffects": false webpack وRollup والأدوات المشابهة بأن استيراد أي وحدة من مكتبتك لا يسبب آثارًا جانبية، ولذلك يمكن حذف جميع الصادرات غير المستخدمة بأمان من حزمة المستخدم.

sideEffects مع استيرادات CSS

تُعد استيرادات CSS أثرًا جانبيًا شائعًا، إذ تحقن الأنماط في الصفحة نتيجة استيرادها. فإذا كانت مكتبتك تستورد ملفات CSS، اضبط "sideEffects": ["*.css", "*.scss"] لإخبار أدوات التجميع بأن ملفات JavaScript آمنة لإجراء tree-shaking عليها، لكن يجب تضمين ملفات CSS دائمًا عند استيرادها.

tree-shaking دقيق باستخدام الصادرات المسمّاة

لتحقيق أقصى قابلية لـ tree-shaking، صدّر كل مكوّن كصادرات مسمّاة من ملفه الخاص. وفي index.ts، أعد تصدير كل شيء: export { Button } from './Button'. عندما يستورد المستخدم Button فقط، تستطيع أداة التجميع حذف جميع المكوّنات الأخرى. وتتيح ملفات التجميع التي تعيد التصدير تطبيق هذا النمط.

اختبار فعالية tree-shaking

استخدم bundlejs.com لاختبار tree-shaking: ألصق جملة الاستيراد، وسيعرض الموقع حجم الحزمة الفعلي. وتتيح حزمة npm المسماة size-limit تحديد ميزانيات الحجم في package.json وإفشال CI إذا تجاوز حجم الاستيراد الحد: "size-limit": [{ "path": "dist/index.js", "limit": "10 KB" }].

ميزانية حجم النشر

حدّد ميزانية لحجم استيرادات مكتبتك. شغّل npx size-limit في CI لفرضها. ويشير نمو تأثير الحزمة بمرور الوقت إلى توسع غير منضبط في النطاق. ينبغي لمكتبة مكوّنات مركّزة أن تُبقي استيرادات المكوّنات الفردية ضمن بضعة كيلوبايتات. أطلق تنبيهًا عند حدوث تراجعات قبل وصولها إلى المستخدمين.

مكتبات CSS-in-JS في مكتبات المكوّنات

تجنب styled-components وEmotion في مكتبات المكوّنات التي تنوي توزيعها. تتطلب حلول CSS-in-JS وقت التشغيل هذه من المستخدم تثبيت المكتبة والإصدار نفسيهما، مما يسبب تعارضات في الاعتماديات النظيرة. وحتى إذا كان المستخدم يستعمل Tailwind أو CSS عاديًا، فعليه تضمين وقت تشغيل CSS-in-JS في الحزمة. فضّل CSS Modules، التي تُترجم إلى CSS عادي وقت البناء.

CSS Modules في المكتبات

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

devDependencies مقابل peerDependencies

توضع أدوات التطوير الخاصة بك (tsup وTypeScript ومكتبات الاختبار وStorybook) ضمن devDependencies، إذ لا تحتاج إليها إلا أثناء التطوير، وتُستبعد من npm install لدى المستخدمين. ويوضع React ضمن كل من peerDependencies (لأنه متطلب وقت التشغيل) وdevDependencies (للحاجة إليه عند ترجمة مكتبتك واختبارها محليًا).

معنى حقل sideEffects

ما الذي يبلغه ضبط "sideEffects": false في package.json الخاص بالمكتبة إلى أدوات التجميع؟

مراجعة الدرس: الاعتماديات النظيرة وtree-shaking

أعلن عن React ضمن peerDependencies (لا dependencies) لكي يتشارك المستخدمون مثيلة React الموجودة في تطبيقاتهم. يتيح sideEffects: false إجراء tree-shaking كامل لمكتبتك. استخدم sideEffects: ['*.css'] لحماية استيرادات CSS من الحذف. وتزيد الصادرات المسمّاة من الملفات الفردية دقة tree-shaking إلى أقصى حد. افرض ميزانية للحجم باستخدام size-limit في CI. وفضّل CSS Modules على CSS-in-JS في المكتبات لتجنب تعارضات الاعتماديات النظيرة.

الأسئلة الشائعة

هل درس «التبعيات النظيرة وTree Shaking» مجاني؟

نعم — نص درس «التبعيات النظيرة وTree Shaking» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «التبعيات النظيرة وTree Shaking»؟

صرّح عن React كتبعية نظيرة، وفعّل Tree Shaking الخالي من الآثار الجانبية، واختبر الحزمة المنشورة تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التبعيات النظيرة وTree Shaking»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التجميع باستخدام Rollup وtsup للمكتبات
  2. مخرجات الحزم المزدوجة ESM وCJS
  3. التبعيات النظيرة وTree Shaking
  4. النشر إلى npm والإصدارات الدلالية
← العودة إلى React Academy