الأخطاء التسعة الأكثر شيوعًا التي يرتكبها المطورون الأيونيون
نشرت: 2022-03-11مقدمة
كانت أيونيك موجودة منذ عامين حتى الآن. إنها مجموعة رائعة من الأدوات لتطوير التطبيقات الهجينة القائمة على AngularJS. تحظى Ionic بشعبية كبيرة في الوقت الحالي ، حيث تم إنشاء أكثر من مليون تطبيق ومجتمع متزايد يضم آلاف المطورين.
منذ الإصدار الأول لـ Ionic ، مر الوقت ، وتطورت تقنيات الويب وأفضل الممارسات بعدة طرق. لذلك ، من الصعب تحديد المسار الذي يجب اتباعه عند بدء مشروع جديد. في هذه الظروف ، يمكن للمطورين ارتكاب أخطاء من المحتمل أن تؤثر على جودة تطبيقاتهم أو إنتاجية فريقهم.
من خلال قراءة الأخطاء الشائعة التالية ، سيكون لديك مفاتيح لتجنب المشاكل الأساسية وإنشاء تطبيقات عالية الأداء وقابلة للتطوير باستخدام Ionic.
الخطأ الشائع الأول: نسيان تمكين التمرير الأصلي
يسمح التمرير الأصلي لـ Ionic بالاستماع إلى أحداث التمرير في عروض الويب المدعومة. إنه يجعل Pull to Refresh و List Reordering و Infinite Scroll ممكنًا بدون تمرير JavaScript ، والذي تم إنشاؤه في وقت كانت فيه المستعرضات تفتقر إلى أحداث التمرير المناسبة.
يتم تمكين التمرير الأصلي افتراضيًا على Android منذ Ionic 1.2 (ديسمبر 2015). إنه أداء هائل وتحسين تجربة المستخدم ، لأنه يضمن التمرير السلس بسبب الأحداث غير المتزامنة.
لسوء الحظ ، نظرًا لعدم وجود أحداث مناسبة على نظام iOS ، لم يتم تمكين التمرير الأصلي لهذا النظام الأساسي حتى الآن.
إذا كنت تستخدم إصدارًا سابقًا للإصدار 1.2 ، فيمكنك تمكين Native Scrolling لنظام Android باستخدام $ionicConfigProvider
:
// Enable Native Scrolling on Android $ionicConfigProvider.platform.android.scrolling.jsScrolling(false);
يمكنك أيضًا تمكين أو تعطيل التمرير الأصلي على أي صفحة باستخدام توجيه overflow-scroll
في أي ion-content
:
<!-- Disable Native Scrolling on this page only --> <ion-content overflow-scroll=”false”>
يرجى ملاحظة أنه لسوء الحظ ، لا يمكن تغطية تكرار التجميع ، والذي يسمح لتطبيقك بعرض قوائم ضخمة من العناصر ، عن طريق التمرير الأصلي.
الخطأ الشائع الثاني: عدم استخدام Ionic CLI لتثبيت المنصات والمكونات الإضافية
تضيف Ionic CLI ميزات إلى كوردوفا CLI. تعد المنصات والمكونات الإضافية ميزة رائعة يضيفها Ionic CLI.
تكمن مشكلة Cordova CLI في أن الأنظمة الأساسية والمكونات الإضافية التي تقوم بتثبيتها مثبتة على جهازك فقط. عند العمل ضمن فريق ، لتجنب الأخطاء التي ترغب في مشاركة نفس البيئة والأنظمة الأساسية والمكونات الإضافية. مع كوردوفا CLI ، يصعب الحفاظ على تزامن المشروع بين أجهزة المطورين. نعم ، يمكنك تثبيت مجلدات الأنظمة الأساسية والإضافات ، لكن لا يوصى بذلك.
عند استخدام Ionic CLI لتثبيت المنصات ionic platform add ios
والمكونات الإضافية ionic plugin add camera
، يتم تحرير ملف package.json
بشكل مناسب.
المنصات والمكونات الإضافية مخزنة في cordovaPlatforms
و cordovaPlugins
خصائص:
"cordovaPlugins": [ "[email protected]", "[email protected]", "[email protected]" ], "cordovaPlatforms": [ "android", "ios" ]
أصبح من السهل الآن على المطورين الآخرين إجراء المزامنة عند سحب رمز جديد ، وذلك ببساطة عن طريق تشغيل ionic state restore
عند الضرورة (الإضافة أو الحذف أو تحديث الإصدار).
الخطأ الشائع الثالث: أداء التفكير يأتي من خارج الصندوق
يعتمد نظام Ionic على AngularJS ، وغالبًا ما يكون الأداء على الجهاز موضع تساؤل. أود أن أطمئنكم في هذه النقطة: مع القليل من خلفية AngularJS ، يمكنك إنشاء تطبيقات ذات مستوى عالمي باستخدام Ionic.
وخير مثال على ذلك هو تطبيق Sworkit الذي تم تصميمه باستخدام Ionic ، ويحتوي على قاعدة مستخدمين 9 مليون + ، وتنزيلات أكثر من 7 ملايين ، ومتوسط 4.5 نجمة على Google Play.
إذا كنت ترغب في الحصول على أفضل النتائج من AngularJS ، فإليك بعض الأشياء التي يجب أن تتعلمها قبل البدء في مشروعك.
مشاهدة $
المراقبون معتادون على الاستماع إلى تغييرات النطاق في AngularJS. هناك أربعة أنواع أساسية من $watch
: $watch (normal)
و $watch (deep)
و $watchCollection
و $watchGroup
.
كل واحد منهم مختلف ، واختيار الشخص المناسب يمكن أن يحدث فرقًا كبيرًا من حيث الأداء.
$ watch (عادي)
سيؤدي استخدام $watch
العادي إلى فحص خصائص الكائن أو عناصر الصفيف الموجودة فقط. لن يتم الاهتمام بالتغييرات الضحلة ، مثل إضافة خاصية كائن أو دفع عنصر جديد إلى مصفوفة.
$scope.$watch('watchExpression', function(newVal, oldVal){ if(newVal){ // watchExpression has changed. } });
مشاهدة $ (عميق)
تعتني $watch
بالتغييرات الضحلة والتغييرات العميقة ، مثل خصائص الكائن المتداخل. مع $watch
هذه ، من المؤكد أنك لن تفوت أي تعديل. ومع ذلك ، فإن استخدام $watch
العميقة له آثار على الأداء. أنصح باستخدامه بحذر.
$scope.$watch('watchExpression', function(newVal, oldVal){ if(newVal){ // watchExpression has changed. } }, true);
مشاهدة المجموعة
يمكن اعتبار $watchCollection
بين $watch
العادية و $watch
العميقة. تعمل أيضًا على مقارنة مراجع الكائنات ، ولكن مع ميزة المراقبة السطحية لخصائص الكائن عن طريق إضافة خاصية كائن أو دفع عنصر جديد إلى مصفوفة.
$scope.$watchCollection('watchExpression', function(newVal, oldVal){ if(newVal){ // watchExpression has changed. } });
مشاهدة المجموعة
تم تقديمه في AngularJS 1.3 ، يتيح $watchGroup
مشاهدة العديد من التعبيرات في وقت واحد.
على الرغم من أن $watchGroup
قد لا يحسن أداء تطبيقك مقارنة بساعة $watch
العادية ، إلا أنه يتميز بكونه أكثر اصطناعية عند مشاهدة العديد من تعبيرات النطاق.
$scope.$watchGroup([ 'watchExpression', 'watchExpression2', 'watchExpression3' ], function(newVals, oldVals) { if (newVals[0]) { // watchExpression has changed. } if (newVals[1]) { // watchExpression2 has changed. } if (newVals[2]) { // watchExpression3 has changed. } });
تتبع حسب
يتم استخدام track by
لتجنب معالجة DOM عديمة الفائدة عند استخدام ng-repeat
. في الواقع ، إذا وجدت دورة الملخص أن عنصرًا واحدًا على الأقل من مجموعتك قد تغير ، فسوف ng-repeat
عرض جميع العناصر. دائمًا ما يؤثر التلاعب في DOM على أداء التطبيق ، لذا فكلما قلت ذلك ، كان ذلك أفضل.
لتجنب إعادة تقديم المجموعة الكاملة وتحديث العناصر التي تحتاج إلى تحديث فقط ، استخدم track by
بمعرف فريد.
<!-- if items have a unique id --> <div ng-repeat="item in items track by item.id"></div> <!-- if not, you can use the $index that ng-repeat adds to every of its items --> <div ng-repeat="user in users track by $index"></div>
فقط تجنب استخدام track by
collection-repeat
.
ملزم لمرة واحدة
تم تقديم الربط لمرة واحدة ، أو ::
في Angular 1.3 ، وله تأثير حقيقي على أداء تطبيقك.
في الأساس ، سيؤدي استخدام الربط لمرة واحدة ::
على تعبير إلى إزالته من قائمة $watchers
عند ملؤه. هذا يعني أن التعبير لن يكون قادرًا على التحديث حتى إذا تغيرت البيانات.
<p>{{::user.firstName}}</p>
نصيحتنا هي مراجعة جميع وجهات نظر التطبيق الخاص بك والتفكير فيما يمكن أو لا يمكن تحديثه ، واستخدام الربط لمرة واحدة ::
وفقًا لذلك. سيكون ارتياحًا كبيرًا لدورة الهضم.
يرجى ملاحظة أنه للأسف لا يمكن استخدام الربط لمرة واحدة في collection-repeat
، لأن قائمة العناصر المعروضة على الشاشة تتغير في التمرير.
إذا كنت ترغب في معرفة المزيد عن نصائح وحيل أداء AngularJS و Ionic ، فإنني أوصي بقراءة ورقة الغش في Ultimate AngularJS و Ionic Performance.
الخطأ الشائع الرابع: وجود ارتباك مع منطق View Cache
لا تقوم تطبيقات الصفحة الواحدة بتخزين الصفحات مؤقتًا بشكل افتراضي. ربما تكون قد جربته باستخدام تطبيقات AngularJS ، حيث لا يتم حفظ التمرير أو مدخلات المستخدم عند التنقل ذهابًا وإيابًا بين الصفحات.
باستخدام Ionic ، يتم تخزين عشر صفحات مؤقتًا افتراضيًا ، ويمكن تغيير ذلك عالميًا أو لكل نظام أساسي.
// Globally $ionicConfigProvider.views.maxCache(5); // Per platforms $ionicConfigProvider.platform.android.views.maxCache(5); $ionicConfigProvider.platform.ios.views.maxCache(5);
هذه ميزة رائعة ، ولكن في بعض الأحيان يصعب على المبتدئين فهم كيفية التعامل مع الصفحات المخبأة.
تكمن المشكلة في أنه عندما يعود المستخدم إلى صفحة مخبأة ، لا يتم إعادة إنشاء وحدة التحكم مرة أخرى ، وهو ما يختلف عن تطبيقات AngularJS ، وكل شيء يبدو وكأنك لم تغادر تلك الصفحة أبدًا.
في ظل هذه الظروف ، كيف يجب تحديث البيانات الموجودة على الصفحة؟
تقديم أحداث دورة حياة جهاز التحكم
مقارنةً بـ AngularJS ، تقدم Ionic العديد من أحداث دورة الحياة:
$scope.$on('$ionicView.loaded', function(){}); $scope.$on('$ionicView.unloaded', function(){}); $scope.$on('$ionicView.enter', function(){}); $scope.$on('$ionicView.leave', function(){}); $scope.$on('$ionicView.beforeEnter', function(){}); $scope.$on('$ionicView.beforeLeave', function(){}); $scope.$on('$ionicView.afterEnter', function(){}); $scope.$on('$ionicView.afterLeave', function(){});
هذه الأحداث ضرورية إذا كنت تريد التحكم في ذاكرة التخزين المؤقت للعرض.
حدث $ionicView.loaded
، على سبيل المثال ، يتم تشغيله في المرة الأولى التي يتم فيها تحميل أحد العروض. لن يتم تشغيل هذا الحدث بعد الآن أثناء تخزين هذا العرض مؤقتًا ، حتى إذا عاد المستخدم إليه. هذا هو الحدث الذي ستستخدمه بشكل عام لبدء المتغيرات بنفس الطريقة التي تستخدمها مع حدث $viewContentLoaded
في AngularJS.
إذا كنت ترغب في إحضار البيانات في كل مرة تدخل فيها عرضًا ، أو تم تخزينه مؤقتًا أم لا ، يمكنك استخدام الحدث $ionicView.enter
.
باستخدام الحدث المناسب في الوقت المناسب ، يمكنك تحسين قابلية استخدام التطبيق.
فيما يتعلق بالأداء ، فإن استخدام عرض ذاكرة التخزين المؤقت يؤثر فقط على حجم DOM. عندما يتم تخزين الصفحة في ذاكرة التخزين المؤقت ، يتم فصل جميع مراقبيها ، وبالتالي فإن الصفحة ليست سوى بعض عناصر DOM الأخرى الموجودة على صفحتك في انتظار استخدامها مرة أخرى.

يعد حجم DOM مهمًا للحصول على تجربة مستخدم رائعة ، ولكن يبدو أن التخزين المؤقت لما يصل إلى عشر صفحات يعمل بشكل جيد (بالطبع ، اعتمادًا على ما تقوم بتحميله في صفحاتك).
الخطأ الشائع # 5: عدم معرفة Crosswalk لنظام Android
يعمل كل إصدار من إصدارات Android على WebView مختلفًا (متصفح يقوم بتشغيل تطبيقك). يختلف الأداء عبر الأجهزة ، ويمكن أن يكون سيئًا حقًا على أجهزة Android القديمة. للحصول على نفس التجربة بالسلاسة والاستجابة على كل جهاز يعمل بنظام Android ، يمكنك تثبيت Crosswalk. يقوم بشكل أساسي بتضمين أحدث مستعرضات Chromium في تطبيقك ، ويضيف حوالي 20 ميجابايت لكل ملف APK ، كل من ARM و X86.
يمكن تثبيت Crosswalk ببساطة باستخدام Ionic CLI أو Cordova CLI:
ionic plugin add cordova-plugin-crosswalk-webview
الخطأ الشائع # 6: محاولة تشغيل ملحقات كوردوفا داخل المتصفح
يريد غالبية المطورين الذين يستخدمون Ionic أن يعمل تطبيقهم على iOS و Android. بعد إضافة المنصات ionic platform add ios android
وبعض المكونات الإضافية ionic plugin add cordova-plugin-device-orientation cordova-plugin-contacts
، فمن الخطأ الاعتقاد أنه يمكنك اختبارها في المتصفح. حسنًا ، يمكنك ذلك ، ولكن فقط بعد تثبيت منصة المتصفح المناسبة. ضع في اعتبارك أنه لا يعمل مع جميع المكونات الإضافية.
تهدف المكونات الإضافية لـ Cordova إلى التفاعل مع واجهة برمجة تطبيقات الجهاز الأصلي من خلال JavaScript. وبالتالي ، سيعمل المكون الإضافي لجهة الاتصال أو المكون الإضافي لاتجاه الجهاز فقط على الجهاز.
ومع ذلك ، يمكنك بسهولة اختبار الكود الخاص بك على جهاز وتصحيحه عن بعد من خلال جهاز الكمبيوتر الخاص بك.
التصحيح عن بعد على Android
قم بتوصيل جهازك وتأكد من اكتشافه بشكل صحيح بواسطة جهاز الكمبيوتر الخاص بك عن طريق تشغيل adb devices
(يلزم توفر Android SDK).
قم ببناء تطبيقك وتثبيته على جهازك عن طريق ionic run android
. بمجرد تشغيل تطبيقك على الجهاز ، افتح وحدة التحكم عبر Chrome dev tools (على جهاز الكمبيوتر الخاص بك) chrome://inspect/#devices
، وافحص جهازك.
التصحيح عن بعد على iOS
قم بتوصيل جهازك وتأكد من اكتشافه بشكل صحيح بواسطة جهاز الكمبيوتر الخاص بك. قم ببناء تطبيقك وتثبيته على جهازك عن طريق تشغيل جهاز التشغيل ionic run ios --device
.
بمجرد تشغيل التطبيق الخاص بك على الجهاز ، افتح أدوات تطوير Safari (على جهاز الكمبيوتر الخاص بك) بالنقر فوق Develop > Your iPhone > Your app
:
قم بتشغيل ملحقات كوردوفا داخل المتصفح
يعد تشغيل مكونات كوردوفا الإضافية داخل المتصفح ميزة متقدمة يجب أن تعرفها. منذ Ionic 1.2 ، أصبح المتصفح مدعومًا رسميًا ، لذا فهو يفتح عصر التطبيقات عبر الأنظمة الأساسية بعيدًا عن منصات iOS و Android.
من خلال النظام الأساسي لمتصفح كوردوفا والإلكترون وتقنيات الويب فقط (جافا سكريبت و HTML و CSS) يمكننا الآن إنشاء تطبيقات أيونية للمتصفح وسطح المكتب (Windows و Linux و OSX).
مجموعة المبتدئين متاحة على جيثب.
منصة متصفح كوردوفا
باستخدام النظام الأساسي للمتصفح ، يمكنك إنشاء تطبيقات كوردوفا للمتصفح. هذا يعني أنه يمكنك استخدام المكونات الإضافية لـ Cordova على المتصفح أيضًا.
يمكن تثبيته بنفس طريقة تثبيت أنظمة iOS أو Android:
cordova platform add browser
يحتاج تطبيقك إلى التجميع قبل الاستخدام تمامًا كما هو الحال مع iOS أو Android:
cordova run browser
سيقوم هذا الأمر بتجميع تطبيقك وفتح متصفحك الافتراضي.
عبر منصة الإضافات
تدعم الكثير من المكونات الإضافية مثل الشبكة والكاميرا و Facebook أنظمة التشغيل iOS و Android ومنصة المتصفح في نفس الوقت - وكل ذلك باستخدام نفس واجهة برمجة التطبيقات.
لتوضيح أن هناك طريقة لمعرفة ما إذا كان جهازك متصل أو غير متصل بالإنترنت على كل نظام أساسي (iOS و Android والمتصفح وسطح المكتب) باستخدام واجهة برمجة تطبيقات ngCordova:
// listen for Online event $rootScope.$on('$cordovaNetwork:online', (event, connectionType) => { this.isOnline = true; }); // listen for Offline event $rootScope.$on('$cordovaNetwork:offline', (event, connectionType) => { this.isOnline = false; });
مع وضع ذلك في الاعتبار ، يمكنك الآن تخيل إنشاء منتجات يمكن تشغيلها في أي مكان بقاعدة رمز واحدة.
الخطأ الشائع رقم 7: اتباع بنية مجموعة المبتدئين للتطبيقات واسعة النطاق
عند استخدام أمر ionic start myapp
، يتم إنشاء مشروع بادئ بهيكل المجلد التالي:
www/ js/ app.js controllers/ aaa.js bbb.js ccc.js services/ xxx.js yyy.js zzz.js templates/ aaa.html bbb.html ccc.html
وهذا ما يسمى بنية المجلد حسب النوع ، حيث يتم تجميع ملفات JavaScript و CSS و HTML حسب الأنواع. نظرًا لأنه قد يبدو سهلاً للمبتدئين ، فإن هذا النوع من الهندسة يخرج عن نطاق السيطرة بسرعة كبيرة. إنه ببساطة لا مقياس.
فيما يلي بعض الأسباب لعدم استخدام بنية المجلد حسب النوع:
- يمكن أن يصبح عدد الملفات في مجلداتك هائلاً
- قد يكون العثور على جميع الملفات التي تحتاج إلى تعديلها لميزة معينة أمرًا صعبًا
- سيؤدي العمل على ميزة إلى العديد من المجلدات المفتوحة
- لا يتسع نطاقه بشكل جيد ، فكلما زاد حجم التطبيق ، زادت صعوبة العمل عليه
أوصي باستخدام بنية المجلدات حسب الميزة ، حيث يتم تجميع ملفات JavaScript و CSS و HTML حسب الميزة أو وحدة AngularJS:
myNewFeature/ index.js (AngularJS module) config.js service.js controller.js index.html style.scss
أسباب استخدام بنية المجلدات حسب الميزة:
- عدد الملفات في مجلداتك محدود بعدد قليل
- من السهل العثور على جميع الملفات التي تحتاج إلى تعديلها لميزة معينة - فهي موجودة في نفس المجلد
- يمكنك العمل بشكل مستقل على الميزة
- من السهل معرفة ما تمثله الوحدة - اسم المجلد كافٍ
- من السهل إنشاء ميزة جديدة ، ما عليك سوى نسخ / لصق ميزة موجودة
- مع التوسع بشكل جيد ، يمكنك إضافة العديد من الميزات الجديدة كما تريد دون أن يصعب على فريقك العمل عليها
يرجى ملاحظة أن هذه البنية قريبة من بنية Folders-by-Component التي هي الآن الافتراضية في تطبيقات Angular2 / Ionic2.
الخطأ الشائع الثامن: إلزام الأحداث بالتمرير ، والنسيان requestAnimationFrame
onscroll
عادة ما يكون هذا الخطأ الفردي خطأ المبتدئين ، ولكن ربما يكون له أسوأ تأثير على الأداء. ضع في اعتبارك هذا:
<ion-content on-scroll="getScrollPosition()"> // … </ion-content>
$scope.getScrollPosition = function () { // heavy processing, like manipulating DOM // or anything that triggers a $digest() // will be called every ~80ms, // and will impact UX }
على الرغم من أن Ionic توفر الاختناق لهذه الإجراءات ، إلا أنها لا تزال بطيئة للغاية. بشكل أساسي ، يجب تأجيل أي شيء يؤدي إلى حدوث حلقة هضم وعدم تشغيله مع الرسم الثقيل ، وهو أيضًا تأثير التمرير.
يمكن أيضًا تحقيق العديد من الأهداف التي كان المطورون يحاولون تحقيقها من خلال الربط بأحداث التمرير ، وخاصة الرسوم المتحركة ، باستخدام طريقة مختلفة. انظر requestAnimationFrame
.
var myElement = document.getElementById('content'); var elemOffsetFromParent = myElement.offsetTop; function onCapturedFrame() { if (window.scrollY >= elemOffsetFromParent) { customTweenFunction(myElement, options); } window.requestAnimationFrame(onCapturedFrame); } onCapturedFrame();
الكود أعلاه هو مثال بسيط للغاية ، للتحقق مما إذا كان المستخدم قد مرر فوق الجزء العلوي من العنصر. تذكر إضافة بدائل خاصة بالبائع للتوافق عبر المستعرضات إذا كنت تنوي استخدام المثال. سيتم تشغيله بشكل أساسي بسرعة مثالية ، اعتمادًا على المتصفح ، بمعدل 60 إطارًا في الثانية أو بمعدل تحديث الشاشة. ولكن تم تحسينها ، وتستخدم أطر الرسوم المتحركة عالية الأداء تلك الطريقة البسيطة.
قد ترغب أيضًا في النظر إلى element.getBoundingClientRect()
، والذي يوفر معلومات حول حجم عقدة HTML وموضعها.
الخطأ الشائع التاسع: النماذج الأولية للتطبيقات الأيونية يدويًا
الأيونية لها تصميم خاص ، وتقريباً لغة بصرية. خاصة مع النماذج الأولية ومنتجات المرحلة المبكرة ، يمكن توفير الكثير من الوقت والنفقات من خلال استخدام المكونات والأنماط المتاحة. هم في الواقع ضئيل للغاية ولديهم جمالية جيدة.
أصبح تقديم الإطارات السلكية والنماذج بالأحجام الطبيعية مع الوظائف الأساسية معيارًا صناعيًا. لرؤية صورة ولرؤية تطبيق فعلي بمكونات ديناميكية على جهاز محمول ، هناك كوبان مختلفان جدًا من الشاي. يستخدم العديد من المصممين ومطوري UX أيضًا أدوات مثل Axure أو Balsamiq ، والتي تتيح إنشاء إطارات سلكية بأدنى حد من الوظائف بسرعة.
الآن ، أصدر مبتكرو Ionic أداة مماثلة مصممة حصريًا لمطوري Ionic. يطلق عليه Ionic Creator. يحتوي على واجهة ويب للسحب والإفلات ، ويدعم قريبًا من كل شيء يوفره Ionic الأساسي. ما يميزه أنه يسمح بتصدير النموذج الأولي إلى عدة تنسيقات ، مع كود Ionic قياسي يعمل ، وحتى إنشاء التطبيق ومشاركته. الأداة مملوكة ، ولكن العديد من الخيارات مجانية للاستخدام.
خاتمة
أحدثت Ionic ثورة في صناعة التطبيقات الهجينة بطريقة لا يمكن لأحد أن يتخيلها. ومع ذلك ، مع مرور الوقت ، تفتقر أفضل الممارسات والأدوات إلى التطور. نتيجة لذلك ، زاد عدد الأخطاء المحتملة التي يمكن للمطورين ارتكابها.
يمتلك المطورون الأيونيون الخبراء طريقة واضحة لتقديم تطبيقات من الطراز العالمي إلى منصات متعددة في وقت واحد. الطريقة هي الاستفادة من الأدوات المتاحة ، والحفاظ على الأداء كأولوية قصوى ، واتباع أفضل الممارسات.
لم يكن هذا المنشور ممكناً لولا إبداع المجتمع الأيوني المذهل ، ميكال ميكولاجيتشيك ، مايك هارتينجتون (فريق Ionic Core) وكاتي جيندر فوجل (مدير التسويق والاتصالات ، Ionic). شكرا جزيلا لكم جميعا.