الرد الأصلي: لماذا وكيفية بناء رمز الأصلي الخاص بك في الذهاب

يتيح React Native إنشاء تطبيقات محمولة باستخدام جافا سكريبت. بالنسبة لي ، إنه أول منصة تفي بهذا الوعد ؛ يقوم بذلك من خلال بنية مدروسة ، والأدوات الأفضل في فئتها وسير العمل ، ومنهج عملي لتطوير المنصات الشاملة. لم يذكر أن الغرض منه هو توفير القدرة على كتابة كود Javascript 100٪ لأي مشروع معين ، كما لم يعد قاعدة بيانات مثالية ومفردة عبر منصة لتطبيقات هاتفك المحمول. بالنسبة لي ، هذا هو الفرق بأكمله.

وهكذا ، فإن فكرة المشاركة الكاملة لرمز النظام الأساسي والتطبيق الذي تم تصميمه بالكامل في Javascript هي فكرة صعبة بطبيعتها ، لأنها:

  1. بعض الأجزاء لديك لبناء أصلا.
  2. منصات مختلفة مختلفة في التجربة.
  3. أجهزة مختلفة تؤدي بشكل مختلف.
  4. لا توجد رصاصة فضية.

هذا يعني أننا في النهاية ملتزمون بكتابة بعض الكود الأصلي. إن كتابة الكود الأصلي هو تحول جذري عن تجربتنا في React Native: علينا أن نعرف الأدوات بشكل أكثر ارتباطًا ؛ Xcode و Android Studio و Gradle و Android SDK و Obj-C أو Swift و Java أو أي لغة JVM صديقة للأندرويد مثل Kotlin. نحتاج أيضًا إلى التعرف على النموذج العقلي الإطاري لكل منصة ، مثل نوايا ووجهات نظر أندرويد ، ووحدات التحكم في الكاكاو ، وجهات النظر والمندوبين.

لماذا الذهاب الأم؟

ولكن قبل ذلك ، حتى عندما يكون على React Native ، يمكننا سرد الأسباب الحقيقية التي تجبرنا على التخلي عن Javascript ، والذهاب إلى بلدك الأصلي.

  • أداء. يمكن القول إن هذا هو العنصر الأول الذي يعبر عن عقل الجميع عندما يقولون "الكود الأصلي" ، وهو أيضًا العنصر الأول الذي يجب أن تعمل بجد لاستبعاده. عليك أولاً أن تثبت ، من خلال الأرقام ، أن لديك مشكلة في الأداء. وبعد ذلك سأظل مشبوهًا إذا كنت أنت. ومع ذلك ، يتفوق الكود الأصلي على أداء جافا سكريبت بدرجة جيدة لبعض أعباء العمل.
  • انخفاض مستوى الوصول إلى نظام التشغيل. هذا بالفعل في كل مكان حولنا. نحن نستخدم حزم React Native التي تتعامل مع الأجزاء الأصلية لكل نظام تشغيل ، لأن Core React Native لم يصل إليها بعد ، أو أنها خارج النطاق.
  • البنية التحتية والمتانة. هناك مهام تكون مضيعة للاضطلاع بها على مشغل Javascript مثل معالجة الصور ونقل كميات كبيرة من البايتات عبر جسر React Native ومعالجة الملفات والمزيد.
  • منطق المزامنة صعبة. قد نفضل استخدام مرافق نظام التشغيل الأصلية للتعامل مع مهام سير العمل غير المتزامنة ، أو تفضيل بنيات اللغة "المحلية" للقيام بذلك. تتبادر إلى الذهن نماذج عقلية مختلفة للتزامن مثل CSP ونموذج الممثل.
  • المكتبات والنظام البيئي. قد لا تتوفر بعض المكتبات على npm أو لا تتمتع بالجودة التي نتوقعها أو الميزات أو الدعم المجتمعي. البديل الأصلي قد يكون بالفعل معيار الذهب.
  • التعتيم ومقاومة الهندسة العكسية. يأتي رمز React Native Javascript مع ملفك الثنائي ، ويمكن لأي شخص الحصول عليه من الحزمة الخاصة بك. على الرغم من أن بعض المنصات مثل Xamarin تقوم بتشفيرها وإدراجها في الكود الأصلي ، إلا أنه لا يزال هناك (PDF) للمهاجم لفتحها. في معظم الحالات ، لا يمثل هذا مصدر قلق ، ولكن هناك الكثير من الحالات التي يكون فيها عنوان IP الخاص بك هو رمزك في الواقع.
  • تقاسم الرمز مع الخلفية. في حين أن أحد الفوائد الرئيسية لاستخدام Node.js هو مشاركة كود Javascript للواجهة الخلفية والواجهة الأمامية ، فقد يكون السبب في ذلك هو عدم إنشاء الواجهة الخلفية على Node.js أو Javascript ، وما زلت ترغب في مشاركة المصنوعات اليدوية مثل نموذج البيانات ، والتحقق من صحة وقواعد العمل.
  • وأخيرا ، المفضل لدي: الاتصالات الثنائية. بينما يمكنك التواصل عبر بروتوكول ثنائي مثل Protobuf من عملية React Native الخاصة بك ، فقد يكون من المؤلم والتحدي فك حزم البيانات الثنائية ، أو من أجل القيام بذلك بشكل جيد ، ولكي يتم صيانتها أو دعمها بواسطة النظام الأساسي الحالي والمكتبات الموجودة.

مع تطور React Native ، ستختفي بعض العناصر الموجودة في هذه القائمة ، وسيظل بعضها ، مثل التشويش وغيرها ، دائمًا.

استخدام تطبيق Go for Development عبر الأجهزة المحمولة

حكم VMs الضيف التي ، مثل Javascript ، تستضيف لغة على منصة معينة ، أو محركات تجارية مثل Apportable ، لقد تركنا مع C و C ++ (صندوق الإسقاط يستخدم C ++ لمشاركة كود غير واجهة المستخدم) كلغات مستهدفة لمشاركة الكود الأصلي.

ولكن هذه ليست آمنة (كما هو الحال في سلامة الذاكرة) ، وبالمقارنة مع جافا سكريبت ، هي جوهر صلب. باستخدام Java أو Obj-C أو C / C ++ ، قد يخلق قدرًا كبيرًا من الاحتكاك. هناك أيضًا صدأ ، لكنني لست متأكدًا من مدى جودة تشغيله مع ARM ، وأي نوع من التجريدات المحمولة لديه (لا شيء؟).

حتى قبل عامين ، كان يمكن أن يكون هذا هو المكان الذي انتهت فيه تجربتنا. ثم ، أضافت Go (اللغة) دعمًا لتصدير الثنائيات كمكتبات C ، والتي فتحت عالماً من الفرص. على سبيل المثال ، قبل سنوات ، كنت أستخدم Go لإصلاح اختناقات الأداء في روبي ، وكتبت لاحقًا مقالًا وتطبيق Gem مرجعيًا لإظهار كيف يمكنك القيام بذلك أيضًا.

آخر منها كان وضع الذهاب على الأجهزة المحمولة. سأظهر لك أن Go هي لغة جيدة لاستخدامها في البنية التحتية السحابية ، فضلاً عن تطوير الهاتف المحمول ، وإلى حد كبير - تطوير الهاتف المحمول لـ React Native.

لدينا بريزما استنساخ: التمهيدي

سنقوم بإنشاء تطبيق يعرض صورًا مثل هذا:

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

سنتخذ هذه الخوارزمية وننشئ تطبيقًا للجوال حوله ، حيث تتم كتابة الخوارزمية في الأصل في Go.

وبهذه الطريقة سيبدو مباشرًا (الفيديو سريع السرعة):

نظرًا لأن الخوارزمية الأساسية أصلية وتم إنشاؤها في Go ، فسنستخدمها كما هي. ولكن لتوضيح ذلك ، إذا كان يتعين علينا إنشاء هذه الخوارزمية أو أي خوارزمية أخرى أو جزء من البنية التحتية التي يجب أن تكون أصلية ، ولم يكن لدينا قاعدة بيانات موجودة بالفعل ، كان لدينا قرار صعب باتخاذ:

  • قم ببنائه مرتين في Java و Obj-C.
  • مرة واحدة في C / C ++.
  • مرة واحدة في الذهاب.

في الواقع ، بالنسبة لحالة الاستخدام والخوارزمية المعينة هذه ، فإننا نضع علامة في عناصر أكثر من قائمة "لماذا تتحول إلى اللغة الأصلية" أعلاه:

  1. أداء. ستظهر Go أداء أفضل من Javascript (سنرى بعد ذلك المدة). نحن في حاجة إليها هنا ، لأن البدائية هي خوارزمية قائمة على وحدة المعالجة المركزية. في الواقع ، من الصعب جدًا أن يجعل معالجة هذه الصور على جهاز iPhone قويًا بطيئًا. يعد Go أقرب من المعدن هنا ويجعل من الجيد استخدامه بدلاً من Javascript.
  2. باستخدام مكتبة غير موجودة على npm. وهذه المرة ، نظرًا لأنها خوارزمية جديدة يتم تنفيذها في Go ، وليس هناك منفذ لذلك في أي مكان آخر ، كنت سعيدًا لأن تطبيق Go on mobile (ولاحقًا ، قمت بعمله على React Native) يعمل بشكل جيد.
  3. التشويش. في هذه الحالة ، تكون مكتبة Go المستهدفة التي نستخدمها مفتوحة المصدر. إذا لم يكن الأمر كذلك ، وكنت تهتم IP الخاص بك ، لا يمكن لأحد عكس هندسة هذه الخوارزمية دون استثمار مقدار غير معقول من الوقت.
  4. وصول API الأصلي. يمكن لهذه الخوارزمية حفظ لقطات التقدم إلى القرص على كل التكرار. إذا كان هذا ليكون Javascript ، فسيتعين علينا تشفير كل لقطة وإرسالها كسلسلة أساسية 64 كبيرة عبر جسر React Native.

وبالطبع ، يمكننا استخدام نفس الرمز الأصلي لكل من Android و iOS.

الذهاب موبايل Toolchain

إذا كنت معتادًا على Go كلغة ، فسيكون ذلك نسيمًا لطيفًا. إذا لم يكن الأمر كذلك ، للتعرف على Go ، تحقق من جولة Go.

بعد الانتهاء من ذلك ، دعونا نقوم بتثبيت وتثبيت سلسلة أدوات gomobile (أفترض أنك قمت بتثبيت Go وتمكنت من القيام بـ "عالم الترحيب" البسيط معه في الوقت نفسه):

$ npm install -g ios-publish
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init # قد يستغرق الأمر بضع دقائق
$ gomobile build -target = ios golang.org/x/mobile/example/basic
$ ios-publish -b basic.app

إذا كان كل شيء يعمل بشكل جيد ، يجب أن تشاهد تطبيقًا للجوال في جهاز المحاكاة الخاص بك. ما فعلته سلسلة الأدوات المحمولة هذه هو إنشاء مكتبة iOS أصلية ، وإنشاء تطبيق هيكلي ، وربطها ، وحزم تطبيق. كل هذا حدث بهدوء (أو بتواضع؟) ، هذا جزء من فلسفة Go: يجب أن يكون النجاح صامتًا ؛ بمعنى آخر - لا يوجد أخبار جيدة.

أنا أشجعك على قراءة مقالة ويكي القصيرة. للحصول على السياق المناسب حول هذه الأدوات.

ربط رد فعل الأصلية والذهاب موبايل

نبدأ من خلال إنشاء تطبيق React Native جديد ، والاستيلاء على مثال للكاميرا التفاعلية هنا. هذه طريقة مناسبة للوصول إلى الهدف من هذه المقالة ولكن قد ترغب في إنشاء الخاصة بك من نقطة الصفر.

نريد إنشاء مكتبة Go الأصلية الآن والبدء بتوصيلها بتطبيق iOS الخاص بنا. هذا هو المكان الذي قد يصبح فيه الأمر صعبًا لأننا نحتاج إلى التفكير في سير العمل قبل أي شيء آخر.

في Go ، أفضل شيء يمكنك القيام به هو تطوير رمز Go في GOPATH ، وهو مكان يتم رؤيته حيث تعيش رمز Go ومكتبات الطرف الثالث (يوجد منطق قوي حول ذلك ، ولكنه خارج نطاق هذه المقالة) . ولذا فإن قرارنا الأول هو وضع مكتبتنا المحلية هناك أيضًا - وليس بجانب تطبيقنا.

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

بالنسبة لي ، إنه يعيش هنا (سيكون لك مختلف):

<الوطن> /workspaces/golang/src/github.com/jondot/primer-bind

التصميم بسيط:

tree شجرة ربط التمهيدي.
.
└── التمهيدي
    └── prime.go

1 دليل ، 1 ملف

دعنا نلقي نظرة على كود Go:

يُظهر التمرير السريع أننا نصدر OnIterationDone وهو رد اتصال مثل الواجهة التي سنستخدمها من كل جانب أصلي و Process التي تمثل نقطة الدخول إلى الخوارزمية الخاصة بنا. لا يوجد شيء خاص يمكن القيام به حيال الأنواع التي تدخل وتخرج ؛ انتقل يعتني بإنشاء رمز لتنظيم هذه إلى منصات المحمول المعنية.

بالنسبة للعملية ، أخذت رمز CLI من بدائي واخترقته بحيث تكون وظيفة يمكنني تصديرها. نحن أيضا تصدير مقاعد البدلاء و JsonDummy لعرضنا القياس.

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

بمجرد وضع هذا في مكانه الصحيح ، يتعين علينا تبديل السياق والقرص المضغوط إلى تطبيقنا. نريد الآن الاستفادة من سلسلة أدوات gomobile ، لذلك سنقوم بتشغيل هذا:

ربط gomobile -x -v -target = ios github.com/jondot/primer-bind/primer

ستنشئ مكتبة أصلية لك وتبصق الكثير من التفاصيل أثناء القيام بذلك لأننا نستخدم -x -v؛ ولكن يمكنك إسقاط هذه إذا أردت. يمكنك أن ترى جمال معاملة كل رمز Go مثل الحزمة: نحن نوفر مسارًا يمثل repo ومسارًا محليًا في GOPATH ، إذا لم يكن لديك نسخة محلية ، فسوف يجلبه Go ويقوم بالبناء باستخدامه ، أو اترك هذا الوضع كما هو ، وسوف ينتزع الحزمة الخاصة بي ويجمعها حتى لا تضطر إلى ذلك.

بعد ذلك ، سيتعين علينا بناء جسر في الكود الأصلي لدينا لصق كل شيء معًا.

هنا ، نحن بصدد إنشاء RCTEventEmitter لأننا نريد أن يتم إخطارنا أين تنتهي خوارزمية Go الأصلية من عملها. نحن نلف أيضًا هيكل OnIterationDone من خلال واجهة أجمل من طراز Obj-C. بالنسبة إلى الأماكن التي تجلس فيها الرؤوس ، فهي مرتبطة بحزمة Go (اخترنا النسخة التمهيديّة).

ملاحظة: هذه هي الطريقة التي ستبني بها وحدة أصلية بغض النظر عن Go. نريد أن يكون لدينا وظيفة غير متزامنة على الجانب الأصلي تحصل على متغيرات مثل عدد التكرار والحجم والوضع وعدد العمال وإعادة الاتصال ، وقم بتمريرها إلى وظيفة Process لدينا ، التي تسمى هنا GoPrimerProcess والتي يتم إنشاؤها تلقائيًا لنا ، وهي ترتبط أيضًا مع اسم الحزمة واسم الوظيفة ، مسبوقًا بـ "Go".

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

ذكري المظهر

بالنسبة إلى Android ، سيكون ذلك أسهل لأن لدينا دعم Android Studio من خلال مكون إضافي Gradle. تذكر أنه لا يزال لدينا نفس حزمة باقة Go ، التي لم تمس ، في نفس المكان. نحن بحاجة إلى تحديد هذا الموقع في Gradle وسلك جسر Android الأصلي في Java.

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

مثل كل مكون أصلي يعمل بنظام Android في React Native ، لدينا وحدتنا التي تحتوي على البتات المثيرة للاهتمام والحزمة التي تقدم React Native لإدخال الوحدة النمطية الخاصة بنا.

الآن ، رمز الجسر لدينا. الجزء الوحدة:

والجزء الحزمة:

يُظهر رمز وحدة Java الخاصة بنا أن حزمة Go تظهر بطريقة سحرية في go.primer وتحت كائن زائف يسمى Primer (مدى ملاءمة!). لاحظ أن gomobile تنشئ الجانب "Go" نيابةً عنك ، وتُعرف باسم وحدة Java حقيقية.

يكمل هذا جولة كبرى حول: Go و iOS (جسر) و Javascript (غراء) و Android (جسر).

جولة كبيرة

كانت هذه جولة حول أربع لغات ، ونقوم بأعمال السباكة: في Go ، قمنا بتوصيل وحدة Go الحقيقية لعمل وظيفة يمكننا تصديرها بشكل نظيف. على نظام التشغيل iOS ، قمنا ببناء وحدة أصلية ووصلنا بها إلى المكتبة الأصلية ، والتي لا تختلف عن أي مكتبة C أخرى لهذه المسألة. في Javascript ، قمنا بتوصيل الجزء الأصلي إلى رمز جانب التطبيق وهو لا يختلف عن أي شيء نفعله لوحدة نمطية أصلية عادية. في الختام ، على Android ، أنشأنا تكوينًا رائعًا للبناء وجسر وحدة أصلية بسيطًا.

معظم هذا الاستثمار في أعمال السباكة سيكون هو نفسه إذا أردنا بناء أي وحدة أصلية. الاختلاف هنا هو أنه لدينا الآن قاعدة بيانات أصلية واحدة تعتمد على Go لتعمل معها - وعلى المدى الطويل ، سيوفر هذا الكثير من الوقت لأننا لسنا بحاجة إلى الحفاظ على نفس الأكواد البرمجية المتوازية على Android و دائرة الرقابة الداخلية.

سؤال الأداء

كيف يتم تنفيذ التعليمات البرمجية الخاصة بنا في Javascript مقارنةً بـ Go؟ سنستخدم معيارًا سخيفًا ، والذي من المحتمل أن يكون مضللاً لاتخاذ أي قرار في الحياة الواقعية ، لذا لا تأخذ الأمر كحقيقة ويمكنك تجربته مباشرةً في PrimerApp. TL ؛ DR هي أن Go أسرع بـ 2x من Javascript لهذا وهذه المعايير.

استنتاج

Go with React Native عبارة عن تطابق تم إجراؤه في السماء للسيناريوهات التالية:

  • أنت شغوف بـ Go أو لديك بالفعل رمز موجود في Go ، أو ترغب في مشاركة Back Go Go مع تطبيق هاتفك المحمول. منحت ، على وجه التحديد لذلك ، لديك GopherJS الذي يعمل بشكل جيد للغاية.
  • تحتاج إلى هامش الأداء.
  • تريد متانة البنية التحتية ونوع قيم السلامة في Go.
  • تريد رمز الملكية للبقاء في مأمن.
  • لا تريد التعبير عن الأفكار في كل من Obj-C / Swift و Java.

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

يمكنك العثور على التطبيق المرجعي هنا ووحدة Go هنا.

أيضًا ، أنا متحمس لطمس تكرار الشفرة الأصلية. إذا كنت بحاجة إلى مساعدة للقيام بهذه الخطوة ، فأخبرني بخط في dotan@paracode.com.

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