مستودع أحادي مع TypeScript: تنظيم الكود للمبتدئين
تطوير التطبيقات الحديثة باستخدام TypeScript غالباً ما يتطلب إدارة عدة حزم مترابطة (مثل مكتبة المكونات، خدمة الخلفية، والأدوات المساعدة). بدلاً من تخزين كل حزمة في مستودع منفصل (متعدد المستودعات)، تختار العديد من الفرق المستودع الأحادي — وهو مستودع واحد يحتوي على جميع المشاريع. في هذه المقالة، سنشرح كيفية تنظيم مستودع أحادي مع TypeScript، حتى لو كنت مبتدئاً.
ما هو المستودع الأحادي ولماذا هو مطلوب؟
المستودع الأحادي (monorepo) هو نهج يتم فيه تخزين كود عدة مشاريع (حزم، وحدات) في مستودع واحد. هذا لا يعني أن جميع المشاريع تندمج في كومة واحدة: فهي تبقى منفصلة منطقياً، ولكنها تحت سقف واحد.
مزايا لمشاريع TypeScript:
- إصدار موحد للتبعيات. تتجنب الموقف حيث تستخدم حزم مختلفة إصدارات مختلفة من TypeScript أو نفس المكتبة.
- إعادة هيكلة بسيطة. تغيير واجهة مشتركة أو نوع في مكان واحد يتم تحديثه فوراً في جميع الحزم التابعة.
- نشر مبسط. أدوات المستودع الأحادي (مثل Lerna أو Nx) تساعد في نشر الحزم المعدلة فقط تلقائياً.
- إعدادات مشتركة. يمكنك الحصول على ملف
tsconfig.jsonواحد لجميع الحزم، مع إمكانية تجاوزه عند الحاجة.
أدوات إنشاء المستودع الأحادي
للعمل مع المستودع الأحادي في TypeScript، توجد عدة أدوات شائعة:
- npm Workspaces — إمكانية مدمجة في npm بدءاً من الإصدار 7. بسيطة وفعالة.
- Yarn Workspaces — وظيفة مماثلة في مدير الحزم Yarn.
- Lerna — أداة كلاسيكية، تُستخدم غالباً فوق npm أو Yarn Workspaces.
- Nx — نظام قوي للمستودعات الأحادية مع إمكانيات متقدمة للتخزين المؤقت وتوليد الكود.
- Turborepo — أداة حديثة من Vercel، تركز على السرعة والبساطة.
في هذا الدليل، سنستخدم npm Workspaces، لأنه الطريقة الأبسط التي لا تتطلب تثبيت أدوات عالمية إضافية.
إعداد المستودع الأحادي خطوة بخطوة مع TypeScript
1. إنشاء الهيكل الجذري
ابدأ بإنشاء المجلد الجذر للمستودع الأحادي الخاص بك وتهيئة package.json:
mkdir my-monorepocd my-monoreponpm init -yالآن قم بتعديل package.json الجذري، بإضافة حقل workspaces. هذا سيوجه npm إلى مكان البحث عن حزمك:
{ "name": "my-monorepo", "private": true, "workspaces": [ "packages/*" ]}العلامة "private": true تمنع النشر العرضي للحزمة الجذرية في npm.
2. إنشاء الحزم
أنشئ هيكل المجلدات لحزمك. الهيكل النموذجي يبدو كالتالي:
my-monorepo/├── packages/│ ├── utils/ # أدوات مساعدة عامة│ ├── ui/ # مكتبة المكونات│ └── backend/ # تطبيق الخادم├── package.json└── tsconfig.jsonأنشئ مجلد packages وداخله مجلدات لكل حزمة. يجب أن تحتوي كل حزمة على package.json خاص بها. على سبيل المثال، للحزمة utils:
mkdir -p packages/utilscd packages/utilsnpm init -yقم بتعديل packages/utils/package.json، بإضافة الاسم وربما الإصدار:
{ "name": "@my-project/utils", "version": "1.0.0", "main": "dist/index.js", "types": "dist/index.