مستودع واحد مع JavaScript: تنظيم الكود عملياً

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مستودع واحد مع 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
\n\n

بالنسبة لـ JavaScript (Node.js)، يعتبر المستودع الواحد مهماً بشكل خاص، لأنه يسمح بالتخلص من "جحيم التبعيات" وتسريع التطوير. دعونا ننظر في التنفيذ العملي.

\n\n

أدوات المستودع الواحد في JavaScript

\n\n

هناك العديد من الأدوات الشائعة في السوق. سننظر في اثنتين رئيسيتين: npm workspaces (مدمج في npm) و Lerna (وظائف متقدمة).

\n\n

1. مساحات عمل npm (دعم مدمج)

\n\n

بدءاً من npm v7، يدير مدير الحزم مساحات العمل. هذه هي أبسط طريقة للبدء. مثال على هيكل المشروع:

\n\n
my-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\n
{\n  "name": "my-monorepo",\n  "private": true,\n  "workspaces": ["packages/*"]\n}
\n\n

الآن جميع الحزم في packages/* مرتبطة تلقائياً. لتثبيت التبعيات، يكفي تنفيذ npm install في الجذر. يتم تحديد التبعيات بين الحزم بشكل قياسي:

\n\n
// packages/app/package.json\n{\n  "name": "@my/app",\n  "dependencies": {\n    "@my/core": "*",\n    "@my/utils": "*"\n  }\n}
\n\n

تقوم مساحات عمل npm بإنشاء روابط رمزية في مجلد node_modules، لذلك تعمل عمليات الاستيراد كما هو الحال مع الحزم العادية.

\n\n

2. Lerna (إدارة متقدمة)

\n\n

Lerna هي أداة لإدارة المستودعات الواحدة مع إمكانية النشر، وإدارة الإصدارات، وتنفيذ البرامج النصية بالتوازي. التثبيت:

\n\n
npm install --global lerna
\n\n

التهيئة في المشروع:

\n\n
lerna init
\n\n

ملف lerna.json:

\n\n
{\n  "version": "independent",\n  "npmClient": "npm",\n  "packages": ["packages/*"]\n}
\n\n

الوضع independent يسمح لكل حزمة بأن يكون لها إصدارها الخاص. الأوامر الرئيسية:

\n\n
    \n
  • lerna bootstrap — تثبيت التبعيات وربط الحزم.
  • \n
  • lerna run build — تنفيذ البرنامج النصي build في جميع الحزم.
  • \n
  • lerna publish — نشر الحزم المعدلة في npm.
  • \n
\n\n

تنظيم الكود عملياً

\n\n

لننظر في مثال لإعداد مستودع واحد لتطبيق ويب مع خلفية Node.js وأدوات مساعدة مشتركة.

\n\n

الخطوة 1: الهيكل الأساسي

\n\n

سنقوم بإنشاء ثلاث حزم:

\n\n

المدونات

توصيات الكتب