OpenTUI: بناء تطبيقات الطرفية باستخدام React و Bun و Zig

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00هذا هو OpenTui، مكتبة مدعومة بلغة Zig لبناء واجهات طرفية مع روابط
00:00:04لـ React و Solid و FreeJS حتى تتمكن من بناء واجهات طرفية (Tuis) ذات أداء عالٍ بنفس طريقة بناء تطبيقات الويب
00:00:09تم إنشاؤها بواسطة Anomaly، الفريق الذي يقف خلف OpenCode، وهو مشروع مفتوح المصدر شهير
00:00:14وكيل برمجي، لتشغيل واجهة المستخدم الفعلية خلف OpenCode، المستخدم من قبل الملايين من
00:00:19الأشخاص بشكل منتظم. لكن كيف تقارن هذه المكتبة الجديدة بأدوات واجهة React الطرفية
00:00:24الأخرى الشهيرة التي كانت موجودة لفترة أطول وتُستخدم لتشغيل العديد من
00:00:29وكلاء البرمجة المشهورين؟ اضغط على اشتراك ولنكتشف ذلك!
00:00:35تُعد Ink المكتبة المفضلة لبناء واجهات طرفية باستخدام React. لقد قمت بالفعل بعمل
00:00:40فيديو عنها يمكنك مشاهدته من هنا. لكنها تعاني من بعض المشاكل. أولاً
00:00:44وقبل كل شيء، التطبيقات البسيطة تستهلك أكثر من 50 ميجابايت من الذاكرة ولديها حد أقصى ثابت للإطارات قدره 30 إطاراً في الثانية، وهو
00:00:51أمر مقبول لمعظم التطبيقات. ولكن إذا كنت تبني تطبيقاً يقوم ببث الكثير من النصوص،
00:00:56مثل وكيل برمجة، فإن تحديد الإطارات يجعل النظام يبدو بطيئاً. لذا، فإن الفريق
00:01:00في Anomaly، الذين استخدموا في الأصل لغة Golang مع Bubble Tea لبناء OpenCode، أرادوا إعادة كتابته
00:01:06بلغة TypeScript دون استخدام Ink. لذا فقد أنشأوا OpenTui. أعني، لقد اشتروا OpenTui. لم يقوموا
00:01:13بالضبط ببنائه من الصفر لأن Commander FX كان يبني بالفعل مكتبة طرفية تعتمد على Zig.
00:01:18لذا قامت Anomaly برعايته وبناء OpenTui فوق عمله. لذا فإن نواة Zig تقوم بكل
00:01:24عمليات العرض الثقيلة، وتسمح لك روابط TypeScript بكتابة مكونات واجهة المستخدم في React أو Solid. لكن الجزء
00:01:30الذكي حقاً هو واجهة برمجة تطبيقات BUN (FFI)، التي تسمح لك بالتحدث مباشرة
00:01:36من TypeScript إلى كود Zig الأصلي دون تأخير كبير، وهذا ما يجعل OpenTui فائقة
00:01:42الأداء. فهي تستخدم Yoga لتخطيطات Flexbox، وتأتي مع مكونات مدمجة مثل المدخلات والقوائم المختارة،
00:01:47وهناك حتى حزمة 3.js التي تتيح لك عرض رسومات ثلاثية الأبعاد عبر Web GPU داخل الطرفية،
00:01:54وهو أمر جنوني نوعاً ما. في الواقع، دعونا نرى OpenTui أثناء العمل من خلال تجربتها في عرض توضيحي بسيط جداً. هناك
00:01:59طرق عديدة يمكنك من خلالها إعداد مشروع OpenTui أساسي. شخصياً، أحب استخدام BUN CreateTui
00:02:04لأنه يمنحك هذا المعالج المفيد جداً الذي يمكنك استخدامه لإعطاء اسم لمشروعك واختيار
00:02:09القالب الذي تريد استخدامه. الآن سأستخدم React، لكنني سأشرح لاحقاً في الفيديو
00:02:13الاختلافات بين هذه القوالب الثلاثة. بمجرد الانتهاء، ستحصل على بعض الملفات القياسية
00:02:17مع ملف index الذي يشغل مشروعاً أساسياً بملء الشاشة. وإذا نظرنا إلى الكود،
00:02:21يمكننا أن نرى هنا في السطر 15 أنه يستخدم CreateCLI renderer للاستفادة من محرك عرض OpenTui.
00:02:27وتحته يوجد CreateRoot، الذي يقوم بعرض مكون التطبيق. وإذا كنت معتاداً
00:02:32على React، فهذا هو الكود الذي يقوم بتثبيته في ملف HTML. لكن لأننا نقوم بالعرض على طرفية،
00:02:37هذا المشروع لا يحتوي على ملف index.html، بل يستخدم بدلاً من ذلك موازن React مخصص يستخدم
00:02:42مربعات طرفية ونصوص بدلاً من مكونات HTML. فوق ذلك، لدينا JSX الذي يستخدم مكون المربع
00:02:49وبعض خصائص Yoga Flexbox لمحاذاة النص الموجود بداخله والذي يعرض خط ASCII وبعض النصوص الأساسية.
00:02:55الآن، إذا كنت لا تريد أن يكون هذا تطبيقاً بملء الشاشة، فإن OpenTui يدعم أوضاع شاشة متعددة.
00:03:00ويمكننا تغيير هذا إلى وضع split footer مع ارتفاع تذييل، والذي يثبت العرض في منطقة محجوزة
00:03:05في أسفل الطرفية. لكن دعونا نحاول القيام بشيء أكثر إثارة من مجرد تغيير
00:03:10وضع الشاشة. هنا واجهة طرفية أساسية مع نص عنوان وإدخال اسم. الآن، تحقق من هذا. مع OpenTui، ستحصل
00:03:17على استجابة فورية. لذلك بغض النظر عن عرض طرفيتي، لا يزال كل شيء يبدو جيداً. وإذا
00:03:21نظرنا إلى الكود، فهو يستخدم بعض صيغ React المألوفة جداً. لذا هنا، لدينا use
00:03:26state التي تضبط الاسم. وفي المدخل، نقوم بتحديث الاسم في خاصية on input. وذلك
00:03:32يتم تغييره في النص. الآن، أحد الأشياء الرائعة حقاً في OpenTui هو نوع من إعادة التحميل المباشر دون
00:03:37الحاجة لـ HMR. لذا يمكننا أن نرى هنا، إذا قمت بتغيير النص إلى “وداعاً” ثم حفظت الملف، فإنه يتم تحديثه تلقائياً.
00:03:43ومن الجيد أن يكون لديك مدخل سريع الاستجابة، لكن أحياناً لا يظهر النص. يمكن إصلاح ذلك
00:03:48بإضافة عرض، مما يجعل الأمور أسهل بكثير. ومع مكون المربع، لدينا
00:03:52بعض الخصائص الرائعة جداً مثل الحدود ولون الخلفية، والتي تعطي مظهراً عصرياً لتطبيق الطرفية هذا.
00:03:56مرة أخرى، يمكننا استخدام خط ASCII بدلاً من هذا النص، مما يجعل العنوان يبرز أكثر قليلاً.
00:04:01وبالطبع، هناك العديد من خطوط ASCII التي يمكنك الاختيار من بينها. تذكر، لأن هذا تطبيق
00:04:05طرفية، وليس صفحة ويب، فهو لا يعرض كل الخطوط الموجودة على نظامك، فقط الأشياء التي تدعم
00:04:10الطرفية. يمكننا أيضاً القيام بأشياء مثل تغيير العرض عند الإرسال بنفس الطريقة التي تفعلها مع تطبيق React
00:04:15عادي عن طريق تغيير الحالة عند الإرسال وعرض JSX مختلف بناءً على هذا الشرط. لكن إليك
00:04:20شيء واحد لن تتوقع أن تكون الطرفية قادرة على القيام به. إذا قمت بإرسال اسمي، تتلاشى الحالة الأخرى الآن
00:04:25في مكانها. ويتم ذلك باستخدام خطاف use timeline من OpenTui، والذي يُستخدم لضبط مدة
00:04:30الرسوم المتحركة، وتحديد هدف. لذا في هذه الحالة، يكون للمكون عتامة صفر وإزاحة ثمانية،
00:04:36بمعنى أن له هامش علوي أسفل المركز. وهنا تنتهي الرسوم المتحركة بإزاحة صفر
00:04:40وعتامة واحد عن طريق تحديث حالات الإزاحة والعتامة التي تم إعدادها هنا. وهذه
00:04:45القيم يتم تحديثها في خصائص المربع. الآن تبدو متقطعة قليلاً لأن الرسوم المتحركة في الطرفية تحتاج
00:04:50إلى التحرك صفاً بصف. لذا فهي تشبه الشبكة، ولكن من الرائع جداً أن OpenTui يسمح لك بالقيام بذلك
00:04:55بسهولة. ما هو رائع حقاً هو أننا نستطيع الجمع بين كل ما تعلمناه حتى الآن باستخدام تخطيط flexbox
00:05:00لوضع الصناديق بجانب بعضها البعض. لذا لدينا مدخل على جانب ومربع آخر على الجانب الآخر.
00:05:05وإذا قمنا بالكتابة في المدخل عند الإرسال، يمكننا تحريك القيمة لتنتقل إلى المربع الآخر،
00:05:10وهي لمسة لطيفة جداً. ومن هنا، يمكننا القيام بالعديد من الأشياء باستخدام OpenTui،
00:05:14مثل تمكين التنقل بلوحة المفاتيح باستخدام خطاف use keyboard، وعرض بيانات النظام باستخدام node OS،
00:05:19وتمكين دعم الفأرة والقوائم الافتراضية. ولأن كل هذا يعمل فوق BUN،
00:05:24يمكنك استخدام أشياء مثل BUN SQLite، أو BUN Postgres، أو جلب معلومات خارجية بنفس
00:05:28الطريقة التي تفعلها على أي موقع ويب. والشيء الرائع في هذا هو بعد أن قمت بتجميع تطبيقي، نعم، حجمه 71
00:05:34ميجابايت لأنه يتضمن وقت تشغيل BUN وموازن React. ولكن عندما أقوم بتشغيله،
00:05:39يمكنك أن ترى أنه يستخدم أقل من 50 ميجابايت من الذاكرة. ولأن React تحظى بشعبية كبيرة،
00:05:43فإن النماذج اللغوية الكبيرة (LLMs) تعرفها جيداً. وبالتالي فإن بناء التطبيقات في OpenTui يمكن أن يكون بسيطاً جداً
00:05:49دون الحاجة للذهاب ذهاباً وإياباً والبحث في الوثائق. إذاً هذا شرح بسيط جداً
00:05:53لـ OpenTui. لكن دعونا نعود إلى وقت سابق في الفيديو، حيث وعدت بشرح
00:05:58الفرق بين React و Solid و Core. الأمر بسيط جداً إذا كنت تعرف عن تطوير واجهة الويب
00:06:02الأمامية. في الأساس، جميعها يتم عرضها من خلال نفس نواة Zig. لذا فإن الرسم الفعلي على
00:06:07طرفيتك متطابق تماماً. الفرق الوحيد هو كيفية كتابة مكوناتك
00:06:11وكيفية تطبيق التحديثات. لذا فإن React تعيد تشغيل مكوناتك وتقارن شجرة افتراضية في كل
00:06:17تغيير، وهو أمر مشابه جداً لكيفية عمل الـ DOM الافتراضي. بينما تستخدم Solid تحديثات دقيقة،
00:06:22لذا فهي تحدث فقط الشيء الذي تغير. وCore تتخطى كل ذلك، مما يعني أنك تقوم بتعديل
00:06:27الكائنات مباشرة. لذا من الناحية النظرية، React هي الأثقل وCore هي الأخف. ولكن في الواقع،
00:06:33بالنسبة لمعظم تطبيقات الطرفية، الفجوة صغيرة لأن كل العمل الشاق تقوم به نواة Zig،
00:06:38مما يعني في هذه الحالة، أن الأطر مجرد تفضيل شخصي. ولكن حتى لو كان تطبيق OpenTui
00:06:44يأتي مع وقت تشغيل BUN بالكامل وموازن خاص بإطار العمل، إذا كان لديه واحد،
00:06:50فإن الأداء وحجم التطبيق لا يزال أصغر بكثير من Ink، ولكن بالطبع ليس بنفس
00:06:56أداء شيء أصلي مثل Ratatouille أو Bubble Tea. لكن في رأيي، JSX هي أفضل
00:07:02وأكثر الطرق بديهية لتكوين أي واجهة مستخدم. وأفضل قبول استهلاك بسيط في الذاكرة والحجم مقابل
00:07:09تجربة تطوير أفضل بكثير في بناء واجهة طرفية بدلاً من الحصول على شيء خفيف في الحجم
00:07:15وخفيف في استخدام الذاكرة، ولكنه مؤلم في الكتابة والتحديث. لذا مع وضع ذلك في الاعتبار، سأختار OpenTui
00:07:20على Ink في كل مرة، إذا تمكنت من بناء تطبيق طرفي،
00:07:25وهو ما أعدك بأنني سأفعله قريباً.

Key Takeaway

توفر OpenTui بديلاً عالي الأداء لمكتبة Ink من خلال الاعتماد على نواة Zig وBun، مما يتيح بناء واجهات طرفية معقدة باستخدام معايير تطوير الويب وبأقل من 50 ميجابايت من استهلاك الذاكرة.

Highlights

  • تستخدم مكتبة OpenTui نواة مبنية بلغة Zig لعمليات العرض، مما يحقق أداءً أعلى مقارنة بمكتبة Ink التقليدية.

  • تسمح واجهة برمجة تطبيقات Bun (FFI) بالتواصل المباشر بين TypeScript وكود Zig الأصلي دون تأخير كبير.

  • تستهلك تطبيقات OpenTui أقل من 50 ميجابايت من الذاكرة أثناء التشغيل.

  • تدعم المكتبة تخطيطات Flexbox عبر محرك Yoga، مما يسهل عملية تصميم واجهات الطرفية.

  • توفر OpenTui خطافات متخصصة مثل use timeline لإنشاء رسوم متحركة داخل بيئة الطرفية.

  • تتيح حزمة 3.js المدمجة عرض رسومات ثلاثية الأبعاد باستخدام Web GPU داخل واجهة الطرفية.

  • توفر المكتبة إمكانية الاختيار بين أطر عمل React أو Solid أو Core مع استخدام نفس نواة العرض الأساسية.

Timeline

مقدمة ومشاكل الأدوات الحالية

  • تعد Ink المكتبة الأكثر استخداماً حالياً لواجهات React الطرفية، لكنها تعاني من مشاكل في الأداء واستهلاك الذاكرة.
  • تستهلك تطبيقات Ink البسيطة أكثر من 50 ميجابايت من الذاكرة وتواجه قيوداً في معدل الإطارات عند بث النصوص.
  • تم تطوير OpenTui كحل لهذه المشكلات عبر دمج الأداء العالي للغة Zig مع مرونة TypeScript.

يركز هذا القسم على التحديات التي يواجهها مطورو واجهات الطرفية (TUI) عند استخدام الأدوات التقليدية مثل Ink، خاصة في المشاريع التي تتطلب بث نصوص كثيف مثل وكلاء البرمجة. يوضح أن الفريق المطور قرر بناء OpenTui لتجاوز قيود الأداء والثبات التي تظهر عند التعامل مع متطلبات العرض الثقيلة.

البنية التقنية والمميزات الأساسية

  • تعتمد المكتبة على محرك عرض مكتوب بلغة Zig يتواصل مع TypeScript عبر واجهة Bun FFI.
  • يستخدم النظام محرك Yoga لتطبيق تخطيطات Flexbox على عناصر الواجهة الطرفية.
  • تدعم المكتبة قوالب متعددة بما في ذلك React وSolid، مما يتيح للمطورين استخدام مهاراتهم الحالية في تطوير الويب.

يشرح هذا الجزء كيف يضمن التواصل المباشر عبر واجهة برمجة تطبيقات Bun FFI سرعة استجابة فائقة. بفضل استخدام Yoga، يمكن للمطورين تصميم واجهات معقدة باستخدام مربعات النصوص وخصائص المحاذاة المشابهة لـ CSS، مع التخلي عن الحاجة لملفات HTML التقليدية في بيئة الطرفية.

التطبيق العملي والرسوم المتحركة

  • تدعم OpenTui أوضاع شاشة متنوعة، بما في ذلك وضع ملء الشاشة والوضع المنقسم.
  • يمكن تنفيذ رسوم متحركة معقدة داخل الطرفية باستخدام خطافات مثل use timeline.
  • تتكامل المكتبة بسهولة مع قواعد البيانات مثل SQLite وPostgres عبر بيئة تشغيل Bun.

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

مقارنة الأطر والاختيار النهائي

  • تعتمد جميع قوالب (React, Solid, Core) على نفس نواة العرض، مما يجعل الاختيار بينها مسألة تفضيل شخصي.
  • تعتبر React الأثقل تقنياً بينما تظل Core هي الخيار الأخف والأسرع.
  • تتجاوز OpenTui الأداء التقليدي لـ Ink رغم تضمينها لوقت تشغيل Bun وموازن الإطار.

يختتم القسم بمقارنة بين أطر العمل المدعومة، موضحاً أن الأداء الأساسي يظل ثابتاً بفضل نواة Zig المشتركة. يؤكد التقييم أن تجربة التطوير باستخدام JSX والمميزات المدمجة في OpenTui تبرر زيادة حجم التطبيق البسيطة مقارنة بالأدوات الأكثر خفة ولكن الأقل سهولة في الكتابة.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video