كيف يعمل ReactJS حزمة الرد

معظم الناس الذين يعملون في الواجهة الأمامية ، بطريقة أو بأخرى ، واجهوا رد فعل. هذه مكتبة JavaScript تساعد في إنشاء واجهات رائعة ؛ وقد اكتسبت في السنوات الأخيرة شعبية هائلة. ومع ذلك ، لا يعرف الكثير من الناس كيف يعمل في الداخل.


في هذه السلسلة من المقالات ، نقرأ الكود ونحاول معرفة ما الحزم التي تقع تحت غطاء محرك السيارة من أجل رد الفعل هي المسؤولة عن ، وما هي استخدامها وكيف تعمل. أهم العناصر الأساسية التي نستخدمها في المتصفح هي react ، react-dom ، events react-reconciler .


سننتقل بالترتيب واليوم لدينا مقال حول حزمة react . من يهتم بما هو موجود في هذه الحزمة - اذهب تحت القط.


بادئ ذي بدء ، سنقدم مثالًا صغيرًا ، على أساسه سننظر في هذه الحزمة. ستبدو الأداة لدينا كما يلي:


 function App() { const [text, changeText] = React.useState('Initial'); return ( <div className="app"> <span>{text}</span> <input type="text" value={text} onInput={(e) => changeText(e.target.value)} /> </div> ); } ReactDOM.render( <App />, document.getElementById('root') ) ; 

دعنا نلقي نظرة سريعة على هذا الرمز. نرى هنا نداء الخطاف من خلال React.useState('Initial') ، وقليلًا من JSX ونداء طريقة التجسيد للحصول على كل هذا على الصفحة.
في الواقع ، كما يعلم الكثير من الناس ، هذا ليس الرمز النهائي الذي يعالجه المتصفح. قبل تنفيذه ، يتم نقله ، على سبيل المثال ، مع بابل. في هذه الحالة ، ستتحول ما تُرجع الوظيفة إلى ما يلي:


 return React.createElement( "div", { className: "app" }, React.createElement("span", null, text), React.createElement("input", { type: "text", value: text, onInput: function onInput(e) { return changeText(e.target.value); } }) ); 

من يهتم بالتجربة ويرى رمز بابل الخاص بك - رد بابل .


React.createElement


لذلك ، تلقينا الكثير من المكالمات إلى React.createElement() والوقت لمعرفة ما تقوم به هذه الوظيفة. سنصفها بالكلمات (أو يمكنك أيضًا إلقاء نظرة على الملف - ReactElement.js ).


أولاً وقبل كل شيء ، فإنه يتحقق ما إذا كان لدينا الدعائم (في الرمز ، الكائن مع الدعائم التي config يسمى config ).


بعد ذلك ، نتحقق مما إذا كان لدينا دعائم key ومرجعية غير undefined ، وحفظها ، إن وجدت.


 if (hasValidKey(config)) { key = '' + config.key; } 

النقطة المهمة هي أن config.key يتم config.key إلى سلسلة ، مما يعني أنه يمكنك تمرير أي نوع بيانات كمفتاح ، والأمر الرئيسي هو أنه ينفذ أسلوب .toString() أو .valueOf() وإرجاع قيمة فريدة لمجموعة معينة.


فيما يلي الخطوات التالية:


  • نسخ الدعائم التي تم تمريرها إلى العنصر ؛
  • أضف حقل children هناك إذا مررناهم ليس بالدعائم ، ولكن كعنصر متداخل ؛
  • نقوم بتعيين القيم الافتراضية من defaultProps لتلك الخصائص التي لم defaultProps سابقًا.

عندما نقوم بإعداد جميع البيانات ، ندعو وظيفة داخلية تنشئ كائنًا يصف مكوننا. هذا الكائن يشبه هذا:


 { // This tag allows us to uniquely identify this as a React Element $$typeof: REACT_ELEMENT_TYPE, // Symbol // Built-in properties that belong on the element type: type, key: key, ref: ref, props: props, // Record the component responsible for creating this element. _owner: owner, } 

هنا لدينا خاصية $$typeof ، والتي تعد رمزًا ، لذا قم بالانزلاق على أي حال أي كائن سيفشل.


خاصية type تخزن نوع العنصر المراد إنشاؤه. في حالة مثالنا ، ستكون هذه وظيفة App() والخطوط 'div' و 'span' و 'input' .


سوف تحتوي خاصية key على نفس المفتاح ، بسبب التحولات التي تطير إلى وحدة التحكم.
سوف تحتوي الدعائم على ما defaultProps ، children وما تم تحديده في defaultProps . خاصية _owner ضرورية للعمل الصحيح مع ref .


ترجمت إلى مثالنا ، فإن نتيجة React.createElement(App, null) ستبدو كما يلي:


 { $$typeof: REACT_ELEMENT_TYPE, type: App, key: null, ref: null, props: {}, _owner: null, } 

بالإضافة إلى ذلك ، في وضع dev ، سيكون لدينا حقل إضافي سيتم استخدامه لعرض مكدس جميل مع اسم الملف والخط:


 _source: { fileName: "/Users/appleseed/react-example/src/index.js", lineNumber: 7 } 

خطأ المكدس تتفاعل


لتلخيص القليل مما رأيناه أعلاه. تعمل حزمة react كمترجم بيننا وبين بقية الحزم التي تعمل بشكل أكبر على طلبنا ، وترجمة مكالماتنا إلى كلمات مفهومة ، على سبيل المثال ، إلى الموفق.


React.useState


في الإصدار 16.8 ، ظهرت السنانير. ما هو وكيفية استخدامها ، يمكنك قراءة الرابط ، ولكن الآن نلقي نظرة على ما يكمن في حزمة react .


في الواقع ، ليس هناك الكثير ليقوله. في جوهرها ، الحزمة هي واجهة يتم من خلالها توجيه تحدياتنا إلى كيانات داخلية.


لذلك ، لا يعد useState أكثر من سطرين من التعليمات البرمجية:


 export function useState<S>(initialState: (() => S) | S) { const dispatcher = resolveDispatcher(); return dispatcher.useState(initialState); } 

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


يتم تخزين التنفيذ الحقيقي للخطافات في حزمة react-reconciler ، والتي سوف نتحدث عنها في واحدة من المقالات التالية.


ما التالي


شيء آخر بعد قراءة هذه المقالة ، يمكنك فهم سبب استيراد حزمة التفاعل دائمًا ، حتى لو لم نستخدمها مباشرةً. هذا ضروري حتى بعد هضم jsx بواسطة الفقاعة ، لدينا متغير React .


اهتم فريق رد الفعل بهذا (وليس هذا فقط) ويعملون الآن على استبدال createElement .


محاولة شرح باختصار: هناك رغبة في استبدال الطريقة الحالية لإنشاء العناصر بـ jsx و jsxs . هذا ضروري لعدة أسباب:


  • ناقشنا أعلاه كيفية عمل createElement . يقوم دائمًا بنسخ الدعائم وإضافة حقل children إلى الكائن ، حيث يحفظ الأطفال الذين مررناهم كحجج للدالة (3 وسيطات وأكثر). الآن يُقترح القيام بذلك في مرحلة تحويل jsx إلى مكالمات javascript ، لأن إنشاء عنصر عبارة عن وظيفة تسمى بشكل متكرر وليست حرة في إجراء تعديل الدعائم في وقت التشغيل ؛
  • يمكنك التخلص من استيراد كائن import { jsx } from 'react' وظائف محددة فقط ( import { jsx } from 'react' ، على سبيل المثال) ، وبالتالي ، لن تكون قادرًا على إضافة ما لا import { jsx } from 'react' للتجميع. بالإضافة إلى ذلك ، ليس عليك حل حقل createElement الخاص بكائن React كل مرة ، لأنه غير مجاني أيضًا ؛
  • ناقشنا أعلاه أن لدينا حالة خاصة عندما نخرج key من الدعائم ونقدمه أكثر. الآن يُقترح أخذ key من jsx في مرحلة التحويل وتوجيه المعلمة الثالثة إلى وظيفة إنشاء العنصر.

اقرأ المزيد هنا . تحتوي حزمة react بالفعل على jsx و jsxs . إذا كنت ترغب في الالتفاف حول هذا الأمر ، يمكنك استنساخ مستودع التفاعل ، وتعيين علامة enableJSXTransformAPI إلى true في ملف ReactFeatureFlags.js الخاص بالحزمة shared وتجميع إصدار رد الفعل الخاص بك ( yarn build ) مع تمكين واجهة برمجة التطبيقات الجديدة.


خاتمة


حول هذا ، سوف أنهي قصتي اليوم حول حزمة react ، وفي المرة القادمة سوف نتحدث عن كيفية استخدام حزمة react لما يخلقه react ، وما هي الأساليب وكيفية تنفيذها.


شكرا لك على القراءة حتى النهاية!

Source: https://habr.com/ru/post/ar448122/


All Articles