NestJS — Node.js للمؤسسات

مقدمة إلى NestJS

12 دقيقة الدرس 1 من 48

مقدمة إلى NestJS

NestJS هو إطار عمل تقدّمي لـ Node.js لبناء تطبيقات خادم فعّالة وموثوقة وقابلة للتوسّع. بينما يمنحك Express الخام لوحة فارغة، يمنحك NestJS بنية ذات رأي — هيكلًا متناسقًا يتوسّع من مشروع نهاية أسبوع إلى نظام مؤسسي كبير دون أن ينهار تحت وزنه.

أي مشكلة يحلّها NestJS؟

إنّ Express وFastify بسيطان وبلا رأي مُسبق. هذه الحرية رائعة حتى يكبر الفريق: فكل مطوّر يُنظّم الكود بطريقته، ويتسرّب منطق العمل إلى معالجات المسارات، ويصبح الاختبار مؤلمًا. يحلّ NestJS ذلك بتوفير بنية جاهزة: نظام وحدات، وحقن تبعيات، وفصل واضح للمسؤوليات مستوحى من Angular.

الفكرة الأساسية: ليس NestJS بديلًا عن Express — فهو افتراضيًا يعمل فوقه (ويمكن تشغيله على Fastify بدلًا منه). إنّه يضيف بنية، لا محرّك HTTP جديدًا.

الركائز الثلاث

  • TypeScript أولًا: مبني من أجل TypeScript بدعم كامل للمُزخرِفات (decorators) والأنواع العامة والكتابة القويّة (وتعمل JavaScript العاديّة أيضًا).
  • كائنية + دالّية: يجمع بين البرمجة كائنية التوجّه والدالّية والتفاعلية الدالّية.
  • البنية: الوحدات والمتحكّمات والمزوّدات تمنح كل تطبيق الشكل المتوقَّع نفسه.

اللبنات الأساسية

كل ما تبنيه تقريبًا في NestJS هو واحد من ثلاثة أشياء:

  • المتحكّمات (Controllers) — تستقبل طلبات HTTP وتُعيد الاستجابات.
  • المزوّدات/الخدمات (Providers/Services) — تحتوي منطق العمل، وتُحقَن أينما لزم.
  • الوحدات (Modules) — تجمع المتحكّمات والمزوّدات المرتبطة في ميزة متماسكة.

لمحة أولى عن متحكّم وخدمة:

// cats.controller.ts import { Controller, Get } from '@nestjs/common'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { constructor(private readonly catsService: CatsService) {} @Get() findAll(): string[] { return this.catsService.findAll(); } } // cats.service.ts import { Injectable } from '@nestjs/common'; @Injectable() export class CatsService { findAll(): string[] { return ['Tom', 'Felix']; } }

لاحظ المُزخرِفَين @Controller() و@Injectable(). يقرأ NestJS هذه البيانات الوصفية ليربط كل شيء معًا — أنت تصف ما هو الصنف، ويتولّى الإطار كيفية ربطه.

NestJS مقابل Express مقابل Fastify

  • Express: بسيط ومرن وبلا بنية — تصمّم المعماريّة بنفسك.
  • Fastify: مثل Express لكنه أسرع، بنهج قائم على المخطّطات (schemas).
  • NestJS: إطار حول Express/Fastify يضيف الوحدات وحقن التبعيات والاختبار والأعراف.
متى تختار NestJS: للفِرَق والمنتجات طويلة العمر وواجهات API ذات منطق عمل حقيقي والخدمات المصغّرة وأي شيء تتوقّع صيانته لسنوات. أما لسكربت صغير عابر، فقد يكون Express الخام أخفّ.

لماذا يتوسّع؟

لأنّ التبعيات تُحقَن بدل ربطها يدويًا، تبقى الأصناف صغيرة وقابلة للاختبار، وتبقى الميزات معزولة في وحدات، وتنطبق الأنماط نفسها سواء كنت تبني REST أو GraphQL أو WebSockets أو خدمات مصغّرة. تعلّم البنية مرّة واحدة وتنتقل معك إلى كل مكان.

مفهوم خاطئ شائع: يُنتقَد NestJS أحيانًا بأنه "كثير القوالب الجاهزة". في الحقيقة، تؤتي البنية ثمارها لحظة أن يلمس الكودَ أكثرُ من شخص — فالتناسق هو الهدف.

الخلاصة

يجلب NestJS بنية ذات رأي وقائمة على TypeScript إلى Node.js، مبنيّة على ثلاث ركائز: المتحكّمات والمزوّدات والوحدات، يربطها معًا المُزخرِفات وحقن التبعيات. في الدرس التالي ستثبّت Nest CLI وتُنشئ مشروعك الأول.