رياكت

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

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

 نظرة عامة 

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

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

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

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

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

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

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

 تاريخ رياكت 
قام 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.

// مكون رياكت باستخدام
// 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() بالشكل الآتي:

/*مُكون رياكت بدون استخدام
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() التي تقوم بصنع عنصر رياكت.

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

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

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

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

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

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

مثال:

 مكونات ثابتة 

تحتفظ الدول بقيم في جميع أنحاء المكون ويمكن تمريرها إلى المكونات الفرعية من خلال الدعائم:
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:
class App extends React.Component {
  render() {
    return (
      <div>
        <p>Header</p>
        <p>Content</p>
        <p>Footer</p>
      </div>
    );
  }
}

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

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

 السمات

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

 تعبيرات JavaScript

يمكن استخدام تعبيرات JavaScript (وليس عبارات) داخل JSX مع الأقواس {}:
{10+1}المثال أعلاه سوف يُنفذ وستكون النتيجة هي:
 11عبارات شرطية

إذا تعذر استخدام عبارات-else داخل JSX ، فيمكن استخدام التعبيرات الشرطية بدلاً من ذلك. سيوضح المثال أدناه {i === 1 ? 'true': 'false'} كسلسلة 'true' لأن i يساوي 1.
class App extends React.Component {
  render() {
    const i = 1;
    return (
      <div>
= { i === 1 ? 'true' : 'false' } =
      </div>
    );
  }
}يمكن استخدام الدالات و JSX في الشروط الشرطية: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>
    );
  }
}المثال السابق سوف ينفذ:<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
تصنيف:برمجيات تستخدم رخصة إم آي تي
تصنيف:برمجيات تسخدم رخصة بي إس دي
تصنيف:برمجيات فيسبوك
تصنيف:تطبيقات ويب
تصنيف:مكتبات جافا سكريبت