رياكت

**رياكت** ، مكتبة برمجية مبنية بلغة جافا سكربت، مفتوحة المصدر مُتخصصة بواجهات المستخدم  طورتها شركة ميتا المعروفة سابقًا بفيسبوك، رياكت تُقدم طريقة سلسة وقوية لبناء الواجهات المستخدم، تسمح للمطورين بتصميم وتطوير **مُكوِّنات** واجهة مستخدم تفاعلية  ومن ثم إعادة استخدام المكون ذاته عدة مرات في أماكن متعددة.

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

## نظرة عامة

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

### رياكت في الويب
يُشاع استخدام مكتبة **رياكت** في بناء واجهات المواقع حيث كان الهدف الرئيسي من مكتبة رياكت هو التعامل مع واجهات المستخدم في مواقع الويب، تستخدم رياكت في برمجة واجهات المواقع خصوصًا تلك التي تتبع مفهوم الصفحة الواحدة .
وتقوم رياكت بشكل أساسي بتصيير كامل مكونات الصفحة في جهة العميل على المتصفح.

يمكن استخدام رياكت أيضًا في تصيير المكونات وتوليدها عن طريق خادم الويب من أجل تسريع عملية تحميل وعرض الصفحة على المتصفح يتم ذلك غالبًا باستعمال أدوات ومكتبات مُساعدة مثل **[[نكست جي إس|نكست جي أس]]** أو بحلول يدوية.

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

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

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

## مصطلحات أساسية
قاموس لمجموعة مصطلحات إنجليزية تتعلق بمكتبة رياكت مع تعريفها:

## تاريخ رياكت
قام Jordan Walke وهو مهندس برمجيات سابق في فيسبوك، بإبتكار مكتبة رياكت React، وقد أطلق عليها اسم "FaxJS" حينما كانت لا تزال تحت مرحلة التطوير الأولية، أُستلهمت الفكرة من مكتبة XHP، المبنية بلغة PHP التي تهدف إلى تبسيط طريقة صنع مُكونات HTML ، أُستخدمت رياكت في فيسبوك على صفحة **[[موجز (فيسبوك)|آخر الأخبار]]** عام 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.


```javascript
// مكون رياكت باستخدام
// JSX
import React from 'react';

const Greeting = () =>{
 return(
    <div className="hello_world">
      <h1> Hello, World! </h1>
    </div>
    )
}

export default Greeting;
```


الكود أعلاه يُعرف دالة تحمل اسم Greeter تُعبر عن مُكون رياكت مكتوب بالطريقة الوظيفية  وتقوم بإرجاع JSX.

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

يمكن كتابة نفس الكود أيضًا بدون استخدام JSX بالإعتماد على الوظيفة createElement() بالشكل الآتي:


```javascript
/*مُكون رياكت بدون استخدام
JSX */
import React from 'react';

const Greeting = () =>{
  return React.createElement("div", 
    {className: "hello_world"},
    React.createElement("h1", null, " Hello, World! ")
    );
}

export default Greeting;
```


الكود أعلاه يقوم بإرجع وظيفة React.createElement() التي تقوم بصنع عنصر رياكت.

وعند عرضها على متصفح الويب ستكون النتيجة:
```html
<div class="hello_world">
  <h1>Hello, World!</h1>
</div>
```


## أبرز المميزات

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

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

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

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

مثال:

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

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

```js
class ParentComponent extends React.Component {
  state = { color: 'red' };
  render() {
    return (
      <ChildComponent color={this.state.color}></div>
    );
  }
}
```


### DOM الظاهري

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

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

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

### JSX

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

مثال على كود JSX:

```js
class App extends React.Component {
  render() {
    return (
      <div>
        <p>Header</p>
        <p>Content</p>
        <p>Footer</p>
      </div>
    );
  }
}
```


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

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

; السمات

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

; تعبيرات JavaScript

يمكن استخدام تعبيرات JavaScript (وليس عبارات) داخل JSX مع الأقواس {}:

```js
{10+1}
```
المثال أعلاه سوف يُنفذ وستكون النتيجة هي:
; 
```html
11
```
عبارات شرطية

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

```js
class App extends React.Component {
  render() {
    const i = 1;
    return (
      <div>
= { i === 1 ? 'true' : 'false' } =
      </div>
    );
  }
}
```
يمكن استخدام الدالات و JSX في الشروط الشرطية:
```js
class App extends React.Component {
  render() {
    const sections = [1, 2, 3];
    return (
      <div>
        { 
          sections.length> 0
            ? sections.map(n => <div>Section {n}</div>)
            : null
        }
      </div>
    );
  }
}
```
المثال السابق سوف ينفذ:
```html
<div> 
    <div>Section 1</div>
    <div>Section 2</div>
    <div>Section 3</div
</div>
```

تتطلب الشفرة المكتوبة في JSX أن يتم تحويلها إلى دوال عادية في جافاسكربت حتى تتمكن متصفحات الويب من تنفيذها، عادةً ما تُستخدم أداة مثل Babel أو بمساعدة من مُحزمات وحدات جافاسكربت مثل فيت وويب باك بحيث تنفذ هذه المعالجة بشكل عام أثناء عملية إنشاء برنامج قبل نشر تطبيق الويب.

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

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

## راجع أيضًا

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

## مراجع

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

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

تصنيف:أجاكس
تصنيف:إطارات عمل جافا سكريبت
تصنيف:برمجيات 2015
تصنيف:برمجيات تستخدم رخصة إم آي تي
تصنيف:برمجيات تسخدم رخصة بي إس دي
تصنيف:برمجيات فيسبوك
تصنيف:تطبيقات ويب
تصنيف:مكتبات جافا سكريبت