# رياكت

رياكت (بالإنجليزية: React)‏، مكتبة برمجية مبنية بلغة جافا سكربت، مفتوحة المصدر مُتخصصة بواجهات المستخدم طورتها شركة ميتا المعروفة سابقًا بفيسبوك، رياكت تُقدم طريقة سلسة وقوية لبناء الواجهات المستخدم، تسمح للمطورين بتصميم وتطوير مُكوِّنات واجهة مستخدم تفاعلية (بالإنجليزية: Interactive UI components)‏ ومن ثم إعادة استخدام المكون ذاته عدة مرات في أماكن متعددة.
تهدف رياكت إلى تسهيل دمج المنطق البرمجي مع واجهة المستخدم مباشرةً من أجل تسهيل التعامل مع كل مُكون على حدى.

## نظرة عامة

تُستخدم مكتبة رياكت في الغالب كأساس في تصميم واجهات المستخدم على الويب، كما تُستخدم رياكت أيضًا في تطوير تطبيقات الهواتف الذكية من خلال ريأكت نيتف (بالإنجليزية: React Native)‏، وبشكل عام تُركز مكتبة رياكت بشكل رئيسي على بناء المكونات ومفهوم إدارة الحالة (بالإنجليزية: State Management)‏ والتعامل مع الحالة ومع التغيرات التي تطرأ عليها ومن ثم تصيير المكون إلى واجهة المستخدم (بالإنجليزية: Render Component)‏، وإعادة تصيير المكون عند تغير الحالة (بالإنجليزية: Re-render)‏.

### رياكت في الويب

يُشاع استخدام مكتبة رياكت في بناء واجهات المواقع حيث كان الهدف الرئيسي من مكتبة رياكت هو التعامل مع واجهات المستخدم في مواقع الويب، تستخدم رياكت في برمجة واجهات المواقع خصوصًا تلك التي تتبع مفهوم الصفحة الواحدة (بالإنجليزية: Single Page Application)‏. وتقوم رياكت بشكل أساسي بتصيير كامل مكونات الصفحة في جهة العميل على المتصفح.
يمكن استخدام رياكت أيضًا في تصيير المكونات وتوليدها عن طريق خادم الويب من أجل تسريع عملية تحميل وعرض الصفحة على المتصفح يتم ذلك غالبًا باستعمال أدوات ومكتبات مُساعدة مثل نكست جي أس أو بحلول يدوية.
عند العمل على مشروع ويب مُتكامل غالبًا ما يتم استخدام مكتبات أُخرى بجانب رياكت أو كتابة كود مخصص، من أجل إتمام الوظائف الإضافية مثل إضافة تنقلات بين الصفحات "Routing"، وجلب البيانات "Data Fetching" أو باقي الوظائف الأخرى الضرورية في تطبيق الويب التي لا تعتمد بشكل كامل على واجهة المستخدم، حيث أن رياكت لا توفر هذه الخيارات بشكل افتراضي، يعمل المجتمع على توفير العديد من المكتبات والإضافات لتعمل مع رياكت دون الحاجة لإجاد حلول يدوية بكتابة كود مخصص.

### تطوير التطبيقات متعددة المنصات (Cross Platform)

قامت شركة فيسبوك (معروفة باسم شركة ميتا حاليًا) بتطوير تقنية رياكت نيتف حيث تسمح للمطورين باستخدام رياكت لبرمجة تطبيقات متعددة المنصات تعمل على أنظمة الهواتف مثل نظام iOS و Android بحيث تستند هذه التقنية على مبدأ مُشبه لرياكت في الويب وبطريقة الكتابة ذاتها ولكن بدلًا من التعامل مع DOM كما هو الحال في المتصفح، يتم تصيير المكونات إلى ما يقابلها في نظام التشغيل نفسه.

## مصطلحات أساسية

قاموس لمجموعة مصطلحات إنجليزية تتعلق بمكتبة رياكت مع تعريفها:
مصطلحات إنجليزية متعلقة بمكتبة ريأكت :
| المصطلح | التّعريف | ملاحظة |
| DOM | هي اختصار (بالإنجليزية: Document Object Model)‏، وتعني نموذج كائن المستند، ويُقصد بها الهيكل الشجري الخاص بالعناصر في صفحة الويب. | |
| UI Component | مُكون واجهة المستخدم (بالإنجليزية: UI Component)‏، وهو مُصطلح يُشاع استعماله أثناء مرحلة تصميم واجهة مستخدم رسومية حيث تُقسم الصفحة إلى أقسام وعناصر أساسية ومن ثم تصميمها، بدلًا من التعامل مع الصفحة كقالب واحد كامل بحد ذاته. | مثال: الشريط الجانبي في ويكيبيديا يُعد مُكونًا منفصلًا يعاد استخدامه في العديد من الصفحات. |
| React Component | مُكون رياكت (بالإنجليزية: React Component)‏، مُصطلح يُقصد به عنصر واجهة مستخدم بُني باستخدام مكتبة رياكت، وهي الطريقة المستخدمة لفصل كل مكون عن المكون الأخر في رياكت، وهذا المفهوم في علوم الحاسب يطلق عليه فصل الاهتمامات. | تُركز رياكت في مفهوم فصل العناصر في الصفحة إلى المُكونات. |
| JSX | اختصار JavaScript Syntax Extension، وهي طريقة للتعبير عن عناصر HTML داخل جافا سكريبت، وتُترجم في ريأكت إلى الوظيفة createElement. | JSX ابتُكرت من أجل تسهيل برمجة واجهات المستخدم عبر لغة جافاسكربت. |
| Single Page | تطبيق الصفحة الواحدة، هي إحدى طرق برمجة وتصميم صفحات الويب، وغالبًا ما تعتمد تطبيقات الصفحة الواحدة على مفهوم توليد الصفحة من جهة العميل (بالإنجليزية: Client Side Rendering)‏. | تُستخدم رياكت عادةً في هذا النوع من المواقع. |
| Routing | التوجيّه (بالإنجليزية: Routing)‏، هو مفهوم في الويب يُقصد به التنقل بين صفحة الويب الموجودة في الموقع نفسه، وبما أن تركيز رياكت هو إنشاء موقع بمفهوم الصفحة الواحدة يجب استخدام حلول من أجل التنقل بين الصفحات، فمكتبة رياكت لا تًقدم حلًا مباشرًا، وغالبًا ما تتم هذه العملية بمساعدة مكتبات طرف ثالث مثل ReactRouter أو بإنشاء حلول خاصة. | |
| Client Side | جهة العميل، أي العمليات التي تجري على المتصفح من خلال جافاسكربت. | تعمل رياكت بشكل أساسي في جهة العميل. |
| Server Side | جهة الخادم، العمليات التي تجري في جهة الخادم (سيرفر الويب). | |
| Client Side Rendering | التصيير من جهة العميل، يُقصد أن الصفحة يتم توليدها في جهة العميل. حيث يقوم المتصفح بتنزيل صفحة فارغة مع ملف جافاسكربت يحوي على الموقع، ويتم توليد الصفحة بالكامل من خلال جافاسكربت على المتصفح. | بشكل أساسي رياكت تقوم بتوليد الصفحة من جهة المستخدم. |
| Server Side Rendering | التصيير من جهة الخادم، يقصد به توليد الصفحة من جهة الخادوم (سيرفر الويب). حيث تُرسل صفحة HTML كاملة البيانات إلى العميل. | يُستخدم هذا المفهوم لتحسين الظهور في محركات البحث، ومن أجل تسريع عرض الصفحة للمستخدم. لتوليد الصفحات في جهة الخادم، يتم استخدام أُطر عمل أو مكتبات مساعدة مثل NextJS، أو إنشاء حلول خاصة. |
| Two Way Data Binding | ربط البيانات في كلا الإتجاهين، هو مفهوم في تصميم واجهات المستخدم يهدف لربط المكون الذي يظهر في واجهة المستخدم مع البيانات الموجودة في الكود البرمجي، بحيث لو تغيرت القيمة في الكود أو تلك المعروضة في واجهة المستخدم تتغير القيم في كليهما. | غالبًا ما يستخدم هذا النمط البرمجي على صفحات الويب، ولكن جاءت رياكت بمفهوم مُختلف. |
| Virtual DOM | نموذج كائن المستند الظاهري هو مفهوم برمجي وخوارزمية تستخدمها مكتبة رياكت من أجل تتبع التغيرات التي تطرأ في الحالة (State)، لعمل التغيرات اللازمة على مكونات الصفحة، ومن ثم تطبيق التغيرات على نموذج كائن المستند (DOM) الفعلي في الصفحة. | تُعد رياكت من أوائل المكتبات التي استخدمت هذا المفهوم، وقد أُستحدث هذا المفهوم لزيادة أداء وفاعلية مكتبة رياكت كونها تعتمد على مفهوم إعادة التصيير (بالإنجليزية: Re-Rendering)‏. |
| Props أو Prop | خصائص/ خاصية، يُستخدم هذا المصطلح للإشارة إلى البيانات التي تُنقل من مكون إلى آخر، وهي الطريقة التي تتبعها مكتبة رياكت في التعامل مع البيانات المتبادلة بين مُكون رياكت ومُكون رياكت آخر. | |
| PascalCase | باسكال كيس طريقة مُتبعة في التسمية، حيث يجب أن تبدأ كل كلمة بحرف لاتيني كبير وتليها الكلمة الاخرى أيضًا بحرف لاتيني كبير بدون مسافات، وهي الطريقة التي تُتبع عادةً أثناء تسمية مُكونات رياكت. | مثال UserCard، أو Navbar يعد اسمًا صالحًا لمُكون رياكت. |

## تاريخ رياكت

قام Jordan Walke وهو مهندس برمجيات سابق في فيسبوك، بإبتكار مكتبة رياكت React، وقد أطلق عليها اسم "FaxJS" حينما كانت لا تزال تحت مرحلة التطوير الأولية، أُستلهمت الفكرة من مكتبة XHP، المبنية بلغة PHP التي تهدف إلى تبسيط طريقة صنع مُكونات HTML (بالإنجليزية: HTML component)‏، أُستخدمت رياكت في فيسبوك على صفحة آخر الأخبار عام 2011، ومن ثم على انستجرام عام 2012، لتصبح مفتوحة المصدر في مايو عام 2013 في مؤتمر JSConf في الولايات المتحدة الامريكية.
أُعلن عن React Native، والتي تجعل مكتبة رياكت تعمل على مختلف المنصات يشمل ذلك أجهزة أندرويد وآي أو أس وUWP، جرى ذلك في حدث Facebook React.js Conf شباط 2015 واصبحت متاحة للعلن في مارس 2015.
في 2016 قامت شركة فيسبوك بإطلاق "Create React App" بعد نمو وإنتشار رياكت الكبير، وهي عبارة عن أداة تساعد المطورين على تهيئة بيئة عمل رياكت، دون القيام بتهيئتها بأنفسهم، حيث تقوم الأداة بتنزيل أغلب المكتبات الضرورية مثل React و React DOM ومكتبة Babel التي تقوم بترجمة JSX إلى جافاسكربت عادية وتقوم بعملية تحسين الكود Code Optimization، ويتم تجميع وربط كل المكتبات مع بعضها من خلال WebPack.
في 18 أبريل 2017، أعلنت فيسبوك عن React Fiber ، وهي عبارة عن إعادة هيكلة لرياكت بخوارزمية أساسية جديدة لمكتبة React، لبناء واجهات المستخدم. وأُعتبرت React Fiber الأساس لأي تحسينات مستقبلية وتطوير سِمة لإطار React.

## أمثلة على الاستخدام
### مُكون رياكت مكتوب بالطريقة الوظيفية باستخدام JSX

ما يلي هو مثال مبدئي بسيط لاستخدام React في HTML مع JSX و JavaScript.
الكود أعلاه يُعرف دالة تحمل اسم Greeter تُعبر عن مُكون رياكت مكتوب بالطريقة الوظيفية (بالإنجليزية: React Functional Component)‏ وتقوم بإرجاع JSX.

### مُكون رياكت مكتوب بالطريقة الوظيفية من دون JSX

يمكن كتابة نفس الكود أيضًا بدون استخدام JSX بالإعتماد على الوظيفة createElement بالشكل الآتي:
الكود أعلاه يقوم بإرجع وظيفة React.createElement التي تقوم بصنع عنصر رياكت.
وعند عرضها على متصفح الويب ستكون النتيجة:

## أبرز المميزات
### تصريحية (Declarative)

تتابع رياكت مفهومًا تصريحيًا سهلًا للغاية يُمكن المبرمج من كتابة كود واضح وسهل الفهم كما هو الحال في لغات البرمجة التصرحية. حيث يصمم المطور واجهة مرئية لكل حالة في التطبيق، وستتكفل رياكت بباقي العمل حينما تتغير الحالة وتقوم بإعادة تصيير المُكون. خلافًا لما هو في البرمجة الأمرية.

### المُكونات

تتبع رياكت نهجًا في تقسيم عناصر واجهة المستخدم المرئية إلى عدة مكونات يسهل التعامل معها وإعادة استخدامها في أماكن مختلفة من التطبيق. حين التعامل مع المكونات في مشروع رياكت غالبًا تكون في داخل مجلد /src ويجب أن تتبع نمط التسمية باسكال كيس.

### ربط البيانات أُحادي الأتجاه

عادةً ما يتم تمرير خصائص (props) إلى مكون من المكون الأساسي. تقوم المكونات باستقبال الخصائص props كـ مجموعة واحدة من القيم غير القابلة للتغيير (كائن JavaScript). وكلما تغيرت قيمة أحد الخصائص، تقوم رياكت بإعادة تصيير المكون (re-render component).
مثال:

### مكونات ثابتة

تحتفظ الدول بقيم في جميع أنحاء المكون ويمكن تمريرها إلى المكونات الفرعية من خلال الدعائم:

### DOM الظاهري

ميزة أخرى ملحوظة هي في رياكت، وهي استخدام «نموذج كائن المستند الظاهري». تُنشأ رياكت نسخة مماثلة لبنية البيانات وتحفظها في الذاكرة العشوائية RAM، ومن ثم تقوم بمقارنة الاختلافات بين نسخة الافتراضية والتغيرات التي حصلت عند إعادة تصير الكائن، وبعدها تقوم بتحديث DOM المعروض في المتصفح بكافاءة. يسمح هذا للمبرمج بكتابة الكود كما لو أن الصفحة بأكملها يتم إعادة تصييرها في كل تغيير، بينما تقوم مكتبات مكتبة رياكت بإعادة تصيير المكونات التي تغيرت فعليًا فقط.

### أساليب دورة الحياة

تعتبر أساليب دورة الحياة هي التي تسمح بتنفيذ التعليمات البرمجية في نقاط التعيين خلال عمر المكون.
* يتيح shouldComponentUpdate للمطوّر منع إعادة عرض غير ضروري لأحد المكونات عن طريق إرجاع false إذا كان العرض غير مطلوب. يتم استدعاء componentDidMount بمجرد أن يكون المكون مركبًا (تم إنشاء المكون في واجهة المستخدم، غالبًا عن طريق ربطه بعقد DOM). يُستخدم هذا بشكل شائع لتشغيل تحميل البيانات من مصدر بعيد عبر واجهة برمجة التطبيقات. تقديم هو أسلوب دورة الحياة الأهم وواحد فقط المطلوبة في أي مكون. وعادة ما يطلق عليه في كل مرة يتم تحديث بيانات المكون، مما يعكس التغييرات في واجهة المستخدم.

### JSX

جافا سكريبت XML يرمز لها اختصارًا (JSX) تعد امتداد لبناء جملة لغة JavaScript. تشبه JSX في مظهرها HTML إلى حد ما، وتوفر طريقة لتنظيم عرض المكون باستخدام صيغة مألوفة للعديد من المطورين. عادةً ما يتم كتابة مكونات رياكت باستخدام JSX ، على الرغم من أنها ليست ضرورية حيث يمكن كتابة أكواد جافاسكربت خالصة بالإعتماد على وظائف رياكت دون استخدام JSX. يشبه JSX بنية مُلحق أخر أنشائته Facebook يُسمى XHP.
مثال على كود JSX:

#### العناصر المتداخلة

هناك عناصر متعددة في نفس المستوى تحتاج إلى وضعها في عنصر واحد مثل عنصرالموضح أعلاه، أو يتم إرجاعها كمصفوفة.

#### السمات

يوفر JSX نطاقًا من سمات العناصر المصممة لمراعاة تلك التي يوفرها HTML. يمكن أيضًا تمرير السمات المخصصة إلى المكون. سيتم استلام كل السمات بواسطة المكون على شكل دعائم.

#### تعبيرات JavaScript

يمكن استخدام تعبيرات JavaScript (وليس عبارات) داخل JSX مع الأقواس:
المثال أعلاه سوف يُنفذ وستكون النتيجة هي:

#### 11 عبارات شرطية

إذا تعذر استخدام عبارات-else داخل JSX ، فيمكن استخدام التعبيرات الشرطية بدلاً من ذلك. سيوضح المثال أدناه {i === 1 ? 'true': 'false'} كسلسلة 'true' لأن i يساوي 1.
يمكن استخدام الدالات و JSX في الشروط الشرطية:
المثال السابق سوف ينفذ:
تتطلب الشفرة المكتوبة في JSX أن يتم تحويلها إلى دوال عادية في جافاسكربت حتى تتمكن متصفحات الويب من تنفيذها، عادةً ما تُستخدم أداة مثل Babel أو بمساعدة من مُحزمات وحدات جافاسكربت مثل فيت وويب باك بحيث تنفذ هذه المعالجة بشكل عام أثناء عملية إنشاء برنامج قبل نشر تطبيق الويب.

### هيكلة ما بعد HTML

تُطبق البنية الأساسية لـ React بعد تقديم HTML في المتصفح. فمثلًا، يحتوي موقع Facebook على عناصر canvas مولدة دايناميكيًا، كما تستخدم كل من نتفليكس وبايبال مفهوم التوليد كل من جانب الخادم والعميل لتحسين تجربة المستخدم.

## راجع أيضًا

* تطوير الواجهات الأمامية
* مُحزم الوحدات ويب باك
* مُحزم الوحدات فيت جي اس
* تطبيق الصفحة الواحدة

## مراجع

* ↑ وصلة مرجع: https://registry.npmjs.com/react.
* ↑ "React – مكتبة JavaScript لبناء واجهات المستخدم". reactjs.org. مؤرشف من الأصل في 2022-04-11. اطلع عليه بتاريخ 2022-03-16.
* 1 2 3 Pete Hunt: React: Rethinking best practices -- JSConf EU (بالإنجليزية), Archived from the original on 2022-03-13, Retrieved 2022-03-13
* ↑ "JSX". facebook.github.io (بالإنجليزية). Archived from the original on 2022-04-02. Retrieved 2022-04-11.
* 1 2 VDOM vs lit-html - HTTP203 (بالإنجليزية), Google Chrome Developers, 7 Nov 2017, Archived from the original on 2021-03-30, Retrieved 2022-04-11
* ↑ "Rendering Mechanism | Vue.js". vuejs.org (بالإنجليزية الأمريكية). Archived from the original on 2022-03-13. Retrieved 2022-04-11.
* ↑ مستودع مكتبة FaxJS على غيت هب (بالإنجليزية), 11 Mar 2022, Archived from the original on 2021-12-16, Retrieved 2022-03-12
* ↑ "منشور فريق مهدسين شركة ميتا عن XHP". Facebook (بالإنجليزية). Archived from the original on 2022-03-13. Retrieved 2022-03-12.
* ↑ React.js Conf 2015 Keynote - Introducing React Native (بالإنجليزية), 29 Jan 2015, Archived from the original on 2022-02-14, Retrieved 2022-04-11
* ↑ "New README · facebook/create-react-app@760d32e". GitHub (بالإنجليزية). فريق رياكت. 9 Jul 2019. Archived from the original on 2022-04-08. Retrieved 2022-04-06.
* ↑ "Why did we build React? – React Blog". reactjs.org (بالإنجليزية). Archived from the original on 2022-03-03. Retrieved 2022-05-08.
* ↑ Account, PayPal Tech Blog Admin (9 Jul 2018). "Isomorphic React Apps with React-Engine". The PayPal Technology Blog (بالإنجليزية). Archived from the original on 2022-05-08. Retrieved 2022-05-08.
* ↑ Blog, Netflix Technology (19 Apr 2017). "Netflix Likes React". Medium (بالإنجليزية). Archived from the original on 2022-03-03. Retrieved 2022-05-08.

## مصادر خارجية

* الموقع الرسمي
* التوثيق العربي الرسمي للمكتبة
* رياكت: إعادة التفكير في العادات الحسنة في مؤتمر JSConf EU 2013 (مقطع فيديو على يوتيوب)
* الإطلاق الأول لمشروع مكتبة رياكت مفتوحة المصدر في مؤتمر JSConf US 2013 (مقطع فيديو على يوتيوب)
* بوابة برمجة الحاسوب
* بوابة برمجيات
* بوابة برمجيات حرة