مستودع واحد مع JavaScript: تنظيم الكود عملياً
\n\nغالباً ما يواجه تطوير المشاريع المعقدة باستخدام JavaScript (Node.js) مشكلة إدارة الكود. عندما يكون لديك عدة حزم أو مكتبات أو خدمات مصغرة، كل منها يعيش في مستودعه الخاص، يؤدي ذلك إلى تكرار الكود، وصعوبة مزامنة الإصدارات، وإبطاء CI/CD. الحل هو المستودع الواحد (monorepo). في هذه المقالة، سنشرح كيفية تنظيم مستودع واحد مع JavaScript عملياً: من اختيار الأدوات إلى إعداد البناء والنشر.
\n\nما هو المستودع الواحد ولماذا هو مطلوب؟
\n\nالمستودع الواحد هو نهج لإدارة الكود يتم فيه تخزين جميع الحزم والمكتبات وتطبيقات المشروع في مستودع واحد. على عكس المستودعات المتعددة (كل حزمة في مستودعها الخاص)، يقدم المستودع الواحد:
\n\n- \n
- سجل تغييرات موحد: سهولة تتبع كيفية تأثير التغييرات في جزء على جزء آخر. \n
- إعادة استخدام الكود: الأدوات والمكونات المشتركة تعيش في مكان واحد دون نشرها في npm. \n
- إعادة هيكلة مبسطة: تغيير API لحزمة واحدة يظهر فوراً في جميع الحزم التابعة. \n
- إعدادات CI/CD موحدة: ملف تكوين واحد لجميع الحزم. \n
بالنسبة لـ JavaScript (Node.js)، يعتبر المستودع الواحد مهماً بشكل خاص، لأنه يسمح بالتخلص من "جحيم التبعيات" وتسريع التطوير. دعونا ننظر في التنفيذ العملي.
\n\nأدوات المستودع الواحد في JavaScript
\n\nهناك العديد من الأدوات الشائعة في السوق. سننظر في اثنتين رئيسيتين: npm workspaces (مدمج في npm) و Lerna (وظائف متقدمة).
1. مساحات عمل npm (دعم مدمج)
\n\nبدءاً من npm v7، يدير مدير الحزم مساحات العمل. هذه هي أبسط طريقة للبدء. مثال على هيكل المشروع:
\n\nmy-monorepo/\n├── packages/\n│ ├── core/\n│ │ ├── package.json\n│ │ └── index.js\n│ ├── utils/\n│ │ ├── package.json\n│ │ └── helpers.js\n│ └── app/\n│ ├── package.json\n│ └── server.js\n├── package.json\n└── lerna.json (اختياري)\n\nملف package.json الجذر:
{\n "name": "my-monorepo",\n "private": true,\n "workspaces": ["packages/*"]\n}\n\nالآن جميع الحزم في packages/* مرتبطة تلقائياً. لتثبيت التبعيات، يكفي تنفيذ npm install في الجذر. يتم تحديد التبعيات بين الحزم بشكل قياسي:
// packages/app/package.json\n{\n "name": "@my/app",\n "dependencies": {\n "@my/core": "*",\n "@my/utils": "*"\n }\n}\n\nتقوم مساحات عمل npm بإنشاء روابط رمزية في مجلد node_modules، لذلك تعمل عمليات الاستيراد كما هو الحال مع الحزم العادية.
2. Lerna (إدارة متقدمة)
\n\nLerna هي أداة لإدارة المستودعات الواحدة مع إمكانية النشر، وإدارة الإصدارات، وتنفيذ البرامج النصية بالتوازي. التثبيت:
\n\nnpm install --global lerna\n\nالتهيئة في المشروع:
\n\nlerna init\n\nملف lerna.json:
{\n "version": "independent",\n "npmClient": "npm",\n "packages": ["packages/*"]\n}\n\nالوضع independent يسمح لكل حزمة بأن يكون لها إصدارها الخاص. الأوامر الرئيسية:
- \n
lerna bootstrap— تثبيت التبعيات وربط الحزم. \n lerna run build— تنفيذ البرنامج النصيbuildفي جميع الحزم. \n lerna publish— نشر الحزم المعدلة في npm. \n
تنظيم الكود عملياً
\n\nلننظر في مثال لإعداد مستودع واحد لتطبيق ويب مع خلفية Node.js وأدوات مساعدة مشتركة.
\n\nالخطوة 1: الهيكل الأساسي
\n\nسنقوم بإنشاء ثلاث حزم:
\n\n