React مكتبة JavaScript لبناء واجهات المستخدم، وAngular إطار عمل كامل لبناء تطبيقات الويب. مع React تكتب المكوّنات كدوال تُرجع JSX وتختار أدوات منفصلة للتوجيه والنماذج والبيانات؛ ومع Angular تكتب أصناف TypeScript مع قوالب HTML وتحصل على التوجيه والنماذج وعميل HTTP وحقن الاعتماديات جاهزة. إليك العدّاد نفسه بالاثنين.
نسخة Angular من ذلك المكوّن:
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-counter',
template: `
<button (click)="increment()">Clicked {{ count() }} times</button>
`,
})
export class CounterComponent {
count = signal(0);
increment() {
this.count.update((n) => n + 1);
}
}
الأفكار متطابقة واحدة بواحدة: useState(0) في React هي signal(0) في Angular، وonClick={...} هي (click)="..."، و{count} هي {{ count() }}. والفرق هو أين يعيش الكود: دالة واحدة تُرجع الترميز في React، وصنف مع نص قالب في Angular.
مكتبة مقابل إطار عمل
هذا هو الفرق الذي يقود معظم الفروق الأخرى. يغطي React العرض وحالة المكوّن. وكل ما عدا ذلك اختيارك:
- التوجيه: React Router، أو TanStack Router، أو المسارات المبنية على الملفات في إطار عمل.
- جلب البيانات:
fetchفي تأثير، أو TanStack Query، أو محمّلات إطار العمل ومكوّنات الخادم. - النماذج: حقول متحكم بها عادية، أو إجراءات النماذج في React 19، أو React Hook Form.
- الحالة العامة: السياق، أو Zustand، أو Redux Toolkit، أو Jotai.
تتخطى فرق كثيرة معظم هذه الخيارات بالبدء من إطار عمل لـ React مثل Next.js أو React Router في وضع إطار العمل، الذي يجمع التوجيه وتحميل البيانات والعرض على الخادم.
أما Angular فيتخذ هذه الخيارات نيابة عنك: @angular/router، والنماذج التفاعلية والنماذج المبنية على القوالب، وHttpClient، وحقن الاعتماديات، وإعداد الاختبارات، وأداة ng التي تولّد المكوّنات والخدمات. يبدو كل مشروع Angular متشابهًا في عمومه، وهذا سبب شائع لاختيار المؤسسات الكبيرة له. والتكلفة مساحة أكبر للتعلم وحرية أقل في استبدال قطعة.
JSX مقابل القوالب
تُرجع مكوّنات React كود JSX، وهو JavaScript. الشروط هي && أو معامل ثلاثي، والقوائم هي .map()، وكل ما تستطيع فعله في JavaScript تستطيع فعله في الترميز. أما قوالب Angular فهي HTML بصيغتها الخاصة: @if، و@for مع track، وربط [property]، وربط (event)، والإدراج {{ }}. تُبقي القوالب الترميز والمنطق منفصلين بوضوح؛ وتُبقيهما JSX في مكان واحد وتعطيك اللغة كاملة. إليك قائمة مرشحة، الميزة الثانية للمقارنة.
اكتب an في المربع وراقب وحدة التحكم: تعمل الدالة كلها من جديد مع كل ضغطة مفتاح، وتُعاد ببساطة حساب visible. والمكوّن نفسه في Angular، مع القالب في ملفه الخاص:
import { Component, computed, signal } from '@angular/core';
@Component({
selector: 'app-fruit-filter',
templateUrl: './fruit-filter.component.html',
})
export class FruitFilterComponent {
fruits = ['Apple', 'Banana', 'Cherry', 'Grape', 'Mango', 'Peach'];
query = signal('');
visible = computed(() =>
this.fruits.filter((f) => f.toLowerCase().includes(this.query().toLowerCase()))
);
}
<input #box [value]="query()" (input)="query.set(box.value)" placeholder="Filter fruit" />
<ul>
@for (fruit of visible(); track fruit) {
<li>{{ fruit }}</li>
} @empty {
<li>No match</li>
}
</ul>
في Angular يعلن computed أن visible تعتمد على query، فيعرف Angular أي قالب يقرؤها ولا يعيد حساب visible إلا عندما تتغير query. وفي React لا يوجد إعلان: يُعاد تشغيل المكوّن ويُعاد الحساب. ويؤدي key={fruit} في React وtrack fruit في Angular المهمة نفسها، إذ يخبران الإطار أي عنصر في القائمة هو أي عنصر.
JavaScript أولًا مقابل TypeScript أولًا
React هو JavaScript عادية مع JSX، وTypeScript خيار تضيفه (npm create vite@latest my-app -- --template react-ts). معظم مشاريع React الجديدة تضيفها، لكن يمكنك تعلم React دون معرفة الأنواع. أما Angular فمبني لـ TypeScript: المزخرفات وحقن الاعتماديات وفاحص أنواع القوالب كلها تفترضها. إذا كان فريقك يكتب كودًا محدد الأنواع أصلًا، فلا مشكلة؛ وإذا كنت جديدًا على البرمجة، فهذا شيء إضافي تتعلمه في الوقت نفسه. تُظهر صفحة React مع TypeScript كيف تعمل الأنواع في جانب React.
تدفق البيانات واكتشاف التغييرات
كلاهما يمرر البيانات إلى الأسفل عبر المدخلات (props في React، وinput() أو @Input() في Angular) ويرسل الأحداث إلى الأعلى عبر دوال الاستدعاء (دوال تُمرَّر كـ props في React، وoutput() أو @Output() في Angular). والفرق هو كيف يلاحظ كل منهما التغيير.
React يعامل الحالة كلقطات غير قابلة للتعديل. تستدعي دالة ضبط بقيمة جديدة، فيعيد React تشغيل دالة المكوّن، ويقارن JSX الجديدة بالقديمة، ويرقّع DOM. لا شيء يُتتبع تلقائيًا: دالة العرض هي رسم الاعتماديات. وهذا سهل الفهم، والتكلفة أنك تضيف أحيانًا memo أو useMemo أو useCallback (أو تدع React Compiler يضيفها) لتتخطى العمل.
Angular استخدم تاريخيًا Zone.js لاكتشاف أي حدث غير متزامن ثم فحص شجرة المكوّنات بحثًا عن روابط متغيرة. أما Angular الحديث فينتقل إلى الإشارات (signals): تتتبع signal وcomputed وeffect القيم التي يقرؤها كل قالب، فلا يفحص Angular إلا المكوّنات التي تغيّرت إشاراتها، ويمكن للإصدارات الحديثة العمل دون Zone.js كليًا. ولا تعيد قوالب Angular تشغيل دالة كاملة مع كل تغيير كما تفعل مكوّنات React.
في الكود اليومي يبدو الاثنان أقرب مما توحي به الآليات: تحتفظ بالحالة، وتشتق منها القيم، وتتبعها الشاشة.
إدارة الحالة
في React تكون الحالة المحلية useState أو useReducer، وتُرفع الحالة المشتركة إلى أب أو توضع في سياق، وكثيرًا ما تعيش حالة التطبيق كله في مكتبة مخزن صغيرة. وفي Angular تكون الحالة المحلية إشارات على المكوّن، وتعيش الحالة المشتركة عادة في خدمة تُحقن حيثما احتيج إليها؛ فحقن الاعتماديات هو جواب Angular المدمج عن سؤال «كيف يتشارك مكوّنان متباعدان البيانات». ويوجد NgRx للفرق التي تريد مخزنًا بأسلوب Redux. ليس لـ React نظام لحقن الاعتماديات؛ ويؤدي السياق دورًا مشابهًا.
جدول المقارنة
| React | Angular | |
|---|---|---|
| ما هو | مكتبة واجهات | إطار عمل كامل للتطبيقات |
| اللغة | JavaScript أو TypeScript | TypeScript |
| الترميز | JSX داخل JavaScript | قوالب HTML بصيغة Angular |
| شكل المكوّن | دالة تُرجع JSX | صنف مع مزخرف وقالب |
| الحالة المحلية | useState وuseReducer | الإشارات (signal وcomputed) |
| كيف تحدث التحديثات | يُعاد تشغيل المكوّن، ويقارن React المخرجات | تحدّث الإشارات واكتشاف التغييرات الروابط |
| الحالة المشتركة | props، والسياق، ومكتبة مخزن | الخدمات المحقونة، والإشارات، وNgRx |
| التوجيه | مكتبة منفصلة أو إطار عمل | مدمج (@angular/router) |
| النماذج | اختيارك، إضافة إلى إجراءات النماذج في React 19 | مدمجة (النماذج التفاعلية ونماذج القوالب) |
| HTTP | fetch أو مكتبة | مدمج (HttpClient) |
| حقن الاعتماديات | لا يوجد (أقرب شيء السياق) | مدمج |
| الأدوات | Vite أو أداة سطر أوامر لإطار عمل | Angular CLI (ng) |
| العرض على الخادم | Next.js، ووضع إطار العمل في React Router | Angular SSR |
| تطبيقات الهاتف | React Native | Ionic مع Capacitor، وNativeScript |
| تصونه | Meta والمجتمع |
منحنى التعلم
البدء بـ React أسرع. يستطيع المبتدئ الذي يعرف JavaScript بناء شيء حقيقي بعد تعلم المكوّنات وprops والحالة والتأثيرات، وتغطي صفحة ما هي React الفكرة كلها في دقائق. ثم ينتقل التعلم إلى وقت لاحق: عليك اختيار موجّه، ونهج لجلب البيانات، واستراتيجية للنماذج، ومشاريع React المختلفة تتخذ خيارات مختلفة.
أما Angular فبدايته أشد انحدارًا: TypeScript والمزخرفات والقوالب والإشارات وحقن الاعتماديات ووحدتا التوجيه والنماذج، وRxJS لبعض الواجهات. لكن بمجرد أن تعرفه، يستخدم كل مشروع Angular القطع نفسها بالطريقة نفسها، فيكون الانتقال بين المشاريع أسهل.
متى تختار أيًا منهما
اختر React عندما:
- تريد نواة صغيرة وحرية اختيار الباقي، أو تريد إطار عمل مثل Next.js للعرض على الخادم والمسارات المبنية على الملفات.
- تخطط لبناء تطبيقات هاتف أيضًا، حيث يعيد React Native استخدام نموذج المكوّنات نفسه.
- يكون الفريق في الغالب مرتاحًا مع JavaScript، أو تتعلم تطوير الواجهات الأمامية وتريد أقصر طريق إلى تطبيق يعمل.
اختر Angular عندما:
- يحتاج فريق كبير إلى بنية قياسية واحدة عبر مشاريع كثيرة، مع قرارات معمارية أقل للجدال حولها.
- تريد أن تُصان النماذج وHTTP والتوجيه وحقن الاعتماديات معًا من فريق واحد، وأن تُرقّى معًا عبر أداة سطر الأوامر.
- يكتب الفريق TypeScript أصلًا ويحب الخدمات المبنية على الأصناف والفصل الواضح بين القالب والمنطق.
كلاهما ناضج ومستخدم على نطاق واسع في الإنتاج وجيد للمسيرة المهنية. والمهارات تنتقل: المكوّنات، وتدفق البيانات في اتجاه واحد، والحالة المشتقة، والتحديثات التفاعلية أفكار واحدة في الاثنين.
الأسئلة الشائعة
أيهما أفضل، React أم Angular؟
لا أحدهما أفضل عمومًا. يعطيك Angular مجموعة أدوات واحدة كاملة وذات توجه محدد، تناسب الفرق الكبيرة التي تريد البنية نفسها في كل مشروع. ويعطيك React نواة صغيرة وحرية اختيار الباقي، ما يناسب الفرق التي تريد المرونة أو إطار عمل مثل Next.js.
هل تعلّم React أسهل من Angular؟
عادة نعم، في البداية. نواة React هي المكوّنات وprops والحالة وبضعة خطافات، وكلها بلغة JavaScript. أما Angular فيطلب منك تعلم TypeScript والمزخرفات (decorators) والقوالب وحقن الاعتماديات والإشارات ووحدته المختارة للنماذج وHTTP قبل أن تبني الكثير. ثم يحتاج Angular إلى قرارات أقل لاحقًا.
هل Angular إطار عمل وReact مكتبة؟
نعم. يأتي Angular بالتوجيه والنماذج وعميل HTTP وحقن الاعتماديات وإعداد الاختبارات وأداة سطر أوامر كإطار عمل واحد. أما React فلا يعرض إلا الواجهة؛ ويأتي التوجيه وجلب البيانات والنماذج من مكتبات منفصلة أو من إطار عمل لـ React مثل Next.js أو React Router.
هل يستخدم Angular لغة TypeScript ويستخدم React لغة JavaScript؟
Angular مكتوب لـ TypeScript وأدواته تفترضها. أما React فيعمل مع JavaScript العادية ومع TypeScript بالقدر نفسه من الجودة؛ ومعظم مشاريع React الجديدة تختار TypeScript، لكنها اختيارية.
هل يمكنني الانتقال من Angular إلى React؟
نعم، فالمفاهيم تنتقل: المكوّنات، والمدخلات (props)، والمخرجات (props من نوع دوال استدعاء)، والحالة التفاعلية. والتعديلات الرئيسية هي JSX بدلًا من القوالب، والخطافات بدلًا من أعضاء الأصناف، واختيار مكتبات للتوجيه والنماذج.