Wails: رهان Golang على تطبيقات سطح المكتب للتفوق على Electron

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00ويلمز (Wails) هي تقنية متعددة المنصات تتيح لك بناء تطبيقات سطح مكتب قوية بلغة Go.
00:00:04تم طلب هذا الموضوع كثيراً على القناة بعد تقديم عدة مقاطع مقارنة
00:00:08لتقنيات سطح المكتب. لذا سأصحبكم اليوم في جولة لاستخدام Wails لبناء تطبيقات احترافية
00:00:13ومقارنتها بأطر عمل مثل Electron وTauri. سنقوم بتطوير
00:00:17مسجل شاشة لسطح المكتب كما فعلنا في فيديوهات سابقة، ونقارن أموراً مثل حجم الملف،
00:00:22الأداء، وتجربة المطور. وفي الواقع، تقنية Wails جديدة تماماً بالنسبة لي، لذا
00:00:27سنتعلمها سوياً في هذا الفيديو. تعمل Wails بأسلوب مشابه جداً لـ Tauri، لكن
00:00:36الخلفية البرمجية تعتمد على Go بدلاً من Rust. تبني الواجهة الأمامية في عرض ويب (Webview) بتقنيات الويب
00:00:41ثم تستدعي واجهات برمجة التطبيقات النظامية التي تديرها Golang. هذا يعني أنه يمكنك تجميع تطبيق
00:00:47متوافق مع كل من ماك ووندوز. ولكن على عكس Electron، لا تدمج Wails متصفحاً داخلها.
00:00:52بل تعيد استخدام محرك العرض الأصلي لكل نظام تشغيل تماماً كما تفعل Tauri. لذلك فإن حجم الحزمة
00:00:58من المفترض فنياً أن يكون أصغر بكثير، وسنرى ذلك لاحقاً عندما نكتشف المقارنة.
00:01:03وإذا يعجبكم هذا المحتوى يا أصدقاء، اشتركوا للمزيد. هذه هي أداة تسجيل الشاشة
00:01:07التي قمت بتطويرها باستخدام Wails، وقد قمت أيضاً بنفس الشيء باستخدام Electron وTauri.
00:01:12سنحدد الشاشة التي نريد تسجيلها، ثم نضغط تسجيل. يمكنك تحريك الماوس، ولن يظهر تطبيق
00:01:16سطح المكتب نفسه في التسجيل. سأضغط إيقاف، وعندها يمكنك رؤية الشاشة التي سجلتها للتو.
00:01:21يمكنني قص هذا المقطع إذا أردت، ثم الضغط على تصدير إلى MP4 لحفظ الفيديو
00:01:27مباشرة على جهازي. إذا نظرنا إلى البنية البرمجية لهذا التطبيق، ستلاحظ أنها شبيبة جداً
00:01:32بما تتوقعه في Electron. لدينا جميع ملفات الواجهة الأمامية في مجلد frontend
00:01:36ثم لدينا ملف المدخل الرئيسي، وفي هذه الحالة هو ملف Go باسم main.go، وداخله
00:01:41توجد الدالة الرئيسية main. مجدداً، تتوقع رؤية شيء مماثل في Electron، ويمكننا
00:01:47تحديد العنوان، العرض، والارتفاع، وضبط لون الخلفية، بالإضافة إلى خصائص
00:01:52خاصة بنظام ماك تحديداً. لذا إن أردت اختلافات بين ماك ووندوز، فهذا ممكن تماماً.
00:01:57الان إذا نظرنا داخل الواجهة الأمامية هنا في مجلد source، ستشاهد كل كود
00:02:02React. إذا فتحنا app.tsx، ستجد كود React قياسي تماماً، باستثناء أننا نستدعي
00:02:09واجهات برمجة مُعرفة في جانب Go. إذا نظرنا إلى هذا الاستيراد API واستخداماته عبر
00:02:16الملف، ستلاحظ أننا نستدعي API.onrecording finished وonrecording failed وstart recording، وتلك الـ API
00:02:22تم إنشاؤها تلقائياً بواسطة Wails. إذا نظرنا داخل الـ API نفسها، ستجد أن كل الدوال
00:02:27الأساسية تأتي من هذا الملف wails.js/go/main/app. الآن، إذا فتحنا هذا
00:02:33الملف، ستلاحظ أنه تم إنشاؤه تلقائياً ويحتوي على تعليقات باللغة الويلزية والإنجليزية،
00:02:39والسبب هو أن مطور Wails من ويلز! لدينا كل هذه الدوال
00:02:43هنا مثل export video وlist sources وrequest screen access، وكل ما تحتاجه لأداة
00:02:49تسجيل الشاشة. فإذا انتقلنا إلى جانب Go هنا في app.go وقيل بوضع تعليق لإخفاء
00:02:54list sources ثم حفظنا الملف، ستلاحظ ظهور خطأ فجأة داخل API.ts لأن
00:02:59list sources لم تعد موجودة، وذلك لأننا نشغل أمر wails dev. فأي تغيير يحدث
00:03:05داخل ملف Go، يُعيد إنشاء تعريفات TypeScript تلقائياً. وإذا عدنا الآن وألغينا
00:03:11التعليق، ستلاحظ اختفاء الخطأ وإعادة تحميل تطبيق سطح المكتب تلقائياً،
00:03:16لأن جميع التغييرات من جانب Go (الخلفية البرمجية) تُعيد تجميع التطبيق وتحديثه تلقائياً.
00:03:23الان دعونا نُجري بعض المقارنات لنرى الفروقات بين أطر العمل الثلاثة هذه.
00:03:27أولاً سنلقي نظرة على حجم الحزمة (Bundle Size). يأتي Wails بحجم 52 ميجابايت، وTauri بـ 57 ميجابايت، بينما Electron
00:03:34وكما هو متوقع يأتي بحجم 324 ميجابايت. Wails وTauri أصغر بشكل ملحوظ هنا، وذلك لعدم
00:03:41تضمينهما لمتصفح Chromium داخل الحزمة، وهو أمر متوقع تماماً. ومع ذلك، أود الإشارة إلى أن استخدام
00:03:47عرض الويب الأصلي المتوفر في كل نظام تشغيل (كما يفعل Wails وTauri) قد يجعل احتمالية ظهور اختلافات بين المنصات أكبر.
00:03:51هذه المشكلة أصبحت أقل بكثير في هذه الأيام، ولكنها نقطة يجدر وضعها بالاعتبار. إذن، سينتج كل من Tauri
00:03:57وWails مخرجات متشابهة من حيث حجم الحزمة، لأن كلا الإطارين مصممان
00:04:02بنفس الطريقة تقريباً، على الرغم من استخدامهما لتقنيات مختلفة كلياً تحت الغطاء.
00:04:07الان لنلقِ نظرة على وقت التشغيل، وكما فعلنا في الفيديوهات السابقة حول تطبيقات سطح المكتب،
00:04:12سنقوم بتشغيل كل تطبيق 10 مرات ثم نأخذ المتوسط. حقق Wails زمن
00:04:18395 ميلي ثانية، وTauri 410 ميلي ثانية، وElectron 350 ميلي ثانية. أما بالنسبة للبدء البارد (Cold Start) حيث
00:04:26نمسح الذاكرة المؤقتة في كل مرة، سجل Wails زمن 2,337 ميلي ثانية، وTauri 2,049، بينما كان Electron أسرع قليلاً
00:04:34في الواقع بزمن 1,890 ميلي ثانية. وبالنظر إلى الأداء، وكما هو الحال مع Tauri، فإن أداء وقت التشغيل عند تسجيل
00:04:40الشاشة أفضل بكثير من Electron، ويعود ذلك إلى إعداداتنا حيث نستخدم
00:04:45حزمة التقاط الشاشة الأصلية (CaptureKit) لنظام ماك، فلا تنتقل البيانات عبر الجسر الوسيط، بينما مع Electron نسجل من
00:04:51عرض الويب نفسه ثم ننقل البيانات إلى الخلفية البرمجية، مما يتسبب ببعض الحمل الإضافي.
00:04:56من الناحية الفنية، يمكنك استخدام CaptureKit الأصلي إذا كتبت كود C مخصصاً مع Electron،
00:05:02ولكن هذه هي الطريقة الافتراضية للعمل مع Electron، ولهذا نعتمدها في مقارنتنا
00:05:06اليوم. الان لنلقِ نظرة على تجربة المطور، وهناك سنرى الاختلاف
00:05:11الأكبر حقاً. استمتعت حقاً بالبناء باستخدام Wails، لكن الجزء المتعلق بـ
00:05:15التقاط الشاشة لم يكن بسهولة Tauri. اضطررت لكتابة كود Objective-C للوصول إلى CaptureKit،
00:05:21في حين يمكنك مع Tauri البقاء كاملاً داخل لغة Rust، وذلك لأن Rust تمتلك نظاماً بيئياً كبيراً من
00:05:28المكتبات (Crates) التي تغلف أطر عمل آبل الأصلية. لذا في Tauri، جليبت فقط مكتبة باسم screen
00:05:33capture kit وكانت واجهة البرمجة بالكامل مكتوبة بلغة Rust العادية. لغة Go لا تملك مكتبة جيدة لالتقاط الشاشة
00:05:39حسب ما وجدته، ولكنها تمتلك ميزة Cgo، وهي طريقة مدمجة في Go لتجميع كود C.
00:05:44هذا يعني أنه مع Go يمكنك كتابة كود C أصلي في ملف .m، وتصديره كدوال C عادية، ثم
00:05:50تحديد أطر عمل آبل التي تريد ربطها مع Go. وهذا يتسبب في النهاية بكتابة كود Objective-C حقيقي
00:05:56واستدعاء نفس واجهات آبل التي تستدعيها مكتبة Rust، ولكنك في هذه الحالة تمتلك الكود بالكامل.
00:06:02ينتهي بك المطاف بكتابة حوالي 450 سطراً من كود Objective-C، وهو ما لم يحتاجه تطبيق Rust. لذا إجمالاً، أجدني
00:06:08أميل أكثر نحو Tauri. النظام البيئي لمكتبات Rust أفضل بناءً على ما وجدته،
00:06:14ولكن الأمر يعود في النهاية للتفضيل الشخصي. إذا كنت تفضل التطوير بلغة Go، فإن Wails هو خيار
00:06:18ممتاز حقاً، وإذا كنت تفضل Rust اختر Tauri. ومع ذلك، إن اخترت Wails فقد تضطر
00:06:24لكتابة بعض الأكواد الأصلية لأن النظام البيئي ليس راسخاً بعد. آمل أن يكون قد أعجبكم هذا الفيديو
00:06:29يا رفاق، ويمكنكم الاشتراك للمزيد من هذا المحتوى. وإذا أردتم مشاهدة المزيد من فيديوهات المقارنة
00:06:33لأطر عمل سطح المكتب مثل مقارنة Deno Desktop بـ Electrobun، فقد وضعت رابط فيديو هنا
00:06:39يمكنكم مشاهدته. وإلا، فشكراً جزيلاً للمشاهدة. كنت معكم وورن من Betterstack،
00:06:43وأراكم في الفيديو القادم. ولسوء الحظ يا أصدقاء، قال مايلو: لا مزيد من الفيديوهات لهذا الأسبوع، لذا
00:06:49سأراكم يوم الاثنين.
00:06:50*تُعزف الموسيقى*

Key Takeaway

يوفر إطار Wails بديلاً خفيف الوزن لإطار Electron بحجم حزمة 52 ميجابايت وأداء عالٍ بالاعتماد على Go ومحرك العرض الأصلي للنظام، لكنه يتطلب كتابة كود بلغات أصلية مثل Objective-C عند غياب مكتبات النظام البيئي جاهزة الاستخدام.

Highlights

  • تعتمد تقنية Wails على لغة Go في الخلفية البرمجية مع استخدام محرك العرض الأصلي لكل نظام تشغيل، مما يلغي الحاجة لتضمين متصفح Chromium.

  • يبلغ حجم حزمة التطبيق المجمع باستخدام Wails حوالي 52 ميجابايت، مقارنة بـ 57 ميجابايت مع Tauri و324 ميجابايت مع Electron.

  • يسجل Wails زمن تشغيل عادي قدره 395 ميلي ثانية وبدءاً بارداً بزمن 2,337 ميلي ثانية، بينما ينفذ تسجيل الشاشة بأداء أعلى من Electron عبر الاستدعاء المباشر لإطار CaptureKit.

  • ينتج أمر wails dev ملفات تعريفات TypeScript تلقائياً في الواجهة الأمامية عند إجراء أي تعديل على دالّة في ملفات Go.

  • يتطلب تطوير ميزات مثل التقاط الشاشة في Wails كتابة نحو 450 سطراً من كود Objective-C وربطها عبر Cgo لعدم توفر مكتبات جاهزة في نظام Go البيئي.

Timeline

معمارية Wails وآلية عمل الواجهة الأمامية والفي الخلفية

  • تجمع تقنية Wails بين خلفية برمجية بلغة Go وواجهة أمامية تعرض عبر محرك Webview الأصلي الخاص بنظام التشغيل.
  • تنتج Wails تطبيقات متوافقة مع نظامي ماك ووندوز بحجم حزمة صغير نتيجة عدم تضمين متصفح مدمج داخل التطبيق.

تعتمد التقنية على نفس مفهوم Tauri في تجنب تضمين Chromium لتقليل استهلاك الموارد وحجم الحزمة. تُستدعى واجهات برمجة التطبيقات النظامية التي تديرها Golang مباشرة من عرض الويب للواجهة الأمامية.

هيكل المشروع والربط التلقائي للأنواع مع TypeScript

  • يحتوي المجلد الرئيسي على ملفات الواجهة الأمامية في مجلد frontend وملف المدخل الرئيسي main.go للتحكم بخصائص النافذة.
  • يؤدي تشغيل أمر wails dev إلى إنشاء ملفات تعريفات TypeScript وإعادة تجميع التطبيق تلقائياً بمجرد تعديل ملفات Go.

تُعرف إعدادات النافذة مثل العرض والارتفاع ولون الخلفية والخصائص الخاصة بنظام ماك داخل دالة main في ملف Go الرئيسي. تتوفر الدوال المعرفة في الخلفية البرمجية مباشرة للواجهة الأمامية المستندة إلى React عبر ملفات جافاسكريبت المنسوجة تلقائياً.

مقارنة الأداء وحجم الحزمة وسرعة التشغيل بين Wails وTauri وElectron

  • يبلغ حجم حزمة Wails حوالي 52 ميجابايت مقارنة بـ 57 ميجابايت لـ Tauri و324 ميجابايت لـ Electron.
  • يحقق Wails متواسط زمن تشغيل قدره 395 ميلي ثانية وزمن بدء بارد يبلغ 2,337 ميلي ثانية.
  • يعزز الاستدعاء المباشر لحزمة CaptureKit في ماك أداء تسجيل الشاشة في Wails وTauri مقارنة بنقل البيانات عبر الجسر في Electron.

تظهر المقارنات التقنية تكافؤاً كبيراً بين Wails وTauri في تقليل حجم الحزمة وأداء وقت التشغيل بسبب استخدام محرك العرض الأصلي للنظام بدلاً من Chromium. يتفوق أداء تسجيل الشاشة عند استخدام واجهات النظام الأصلية وتفادي نقل البيانات عبر الجسر الوسيط إلى الواجهة الأمامية.

تجربة المطور والنظام البيئي للمكتبات بين Go وRust

  • تتطلب Wails استخدام ميزة Cgo وكتابة كود Objective-C للوصول إلى أطر عمل آبل الأصلية لعدم توفر مكتبات تغليف جاهزة بلغة Go.
  • يوفر النظام البيئي لـ Rust مكتبات جاهزة كـ Crates تغلف واجهات CaptureKit بالكامل، مما يلغي الحاجة لكتابة كود C أصلي.

استلزم بناء أداة تسجيل الشاشة باستخدام Wails كتابة نحو 450 سطراً من كود Objective-C داخل ملفات .m وتصديرها لدوال C لربطها بـ Go. بينما توفر مكتبات Rust الجاهزة في Tauri وصولاً مباشراً لواجهات النظام دون الحاجة لبناء طبقة ربط مخصصة.

Community Posts

View all posts