عند استخدام 0.59.10 المتفاعل الأصلي ، وتعيين الإعدادات المحلية لـ momentJS ، فقد وقعنا في انهيار وحشي للغاية لإصداراتنا فقط. لم يكن هذا العطل قابلاً للتكرار بالنسبة لنا مع إرفاق المصحح. حدث هذا الانهيار بالنسبة لنا على كل من iOS و Android. عبارات try-catch التي تغلف كل لحظة الاستخدام لم يكتشف الانهيار!
لإعادة إنتاج
["fr-CA", "en-US", "fr", "en"]
moment.locale(localeCandidate)
داخل كتلة try-catch ، لا يزال التطبيق يتعطل على هذا الخط⁇كان هذا تعطلًا عند الإطلاق ولكن فقط لإصدارات الإصدار !! هذا جعل من الصعب للغاية استخراج رسائل خطأ مفيدة / تسجيل.
لقد رأينا رسائل الخطأ التالية عبر Bugsnag Integration & System Console Logging
Exception in HostFunction: Error loading module0from RAM Bundle: unspecified iostream_category error
Exception in HostFunction: Module not found: 0
Requiring unknown module "./locale/en-us".
- ولكن الغريب أن هذا الخطأ لم تتم معالجته في الوقت المناسب. ربما يكون رد فعل أصلي / مشكلة bugsnag.الحل البديل: التعليق على هذين السطرين أوقف التحطم!
السلوكيات المتوقعة
require()
في الإصدار)الهاتف الذكي (يرجى استكمال المعلومات التالية):
بيئة خاصة باللحظة
الرجاء تشغيل الكود التالي في بيئتك وتضمين الإخراج:
console.log([
new Date().toString(),
new Date().toLocaleString(),
new Date().getTimezoneOffset(),
navigator && navigator.userAgent, // react-native might not have a navigator
moment.version,
]);
انتاج:
[
"Wed Oct 09 2019 18:52:16 GMT-0700 (PDT)",
"09/10/2019 à 18:52:16", // This particular device is configured as fr-FR
420,
null,
"2.24.0"
]
سياق إضافي
تحاول الأسطر المشار إليها "تلقائيًا" طلب الوحدات النمطية في وقت التشغيل ، لكن مستندات لغات التحميل تشير إلى أنه إذا كنت تستخدم مدير الحزم مثل JSPM ، فيمكنك تحميل لغات بواسطة import "moment/locale/fr
. نظرًا لأننا نحتاج إلى مدير الحزم التفاعلية "لمعرفة" أنه يجب استيراد الملف ، فقد جربنا هذا النمط من الاستيراد حتى يتمكن الرابط "Packager" من "رؤية" جميع الملفات التي يجب تجميعها.
في النهاية ، بدت خطوط الاستيراد كما يلي:
import moment from "moment";
import "moment/min/locales"; // Import all moment-locales -- it's just 400kb
import "moment-timezone";
يتم إدخال التنفيذ الدقيق لـ require()
في وقت التشغيل الذي تعمل فيه ، وهذا بالتأكيد شيء يتصرف بشكل مختلف بشكل كبير بين إصدارات Debug & Release.
في رد الفعل الأصلي ، هناك أيضًا العديد من النكهات المختلفة لحزمة JavaScript في وضع الإصدار ، بما في ذلك ملف الكل في واحد ، والملفات المنفصلة الكل في واحد ، وحزم ذاكرة الوصول العشوائي. كل من هؤلاء يغيرون أيضًا كيفية طلب الأعمال. التصحيح require()
يتصل بـ Metro Bundler الذي يعمل على خادم http محلي. من المحتمل أن يكون هذا مشابهًا جدًا لخوادم webpack / jspm / تصحيح الأخطاء الأخرى ، ولهذا السبب على الأرجح لا يتسبب طلب الاسم المستعار في حدوث مشكلات في تلك البيئة.
أ. احذف aliasedRequire
بالكامل إذا لم تكن هذه هي الطريقة التي من المفترض أن تفعل بها الأشياء بعد الآن + تعليمات تثبيت القرص حولها؟
ب. اكتشاف رد الفعل الأصلي مقابل المستعرض ( navigator
غير متوفر في رد الفعل الأصلي ، ولكن هناك تقنيات أخرى هنا) ، والتصرف بشكل مختلف اعتمادًا على الموقف الذي نجد أنفسنا فيه؟ على سبيل المثال إذا كان رد الفعل الأصلي && DEV ، فقم بطباعة خطأ وحدة التحكم إذا كانت اللغة مدعومة من الناحية النظرية ، ولكنها لم تكن required
حتى الآن (+ تحديث المستندات).
ج. انقل aliasedRequire
من متغير محلي في تلك الدالة إلى "شبه عمومي". moment.aliasedRequire
، بهذه الطريقة يمكننا إدخال وظيفة no-op / do-nothing بحيث لا يمكن أن يتسبب aliasedRequire
في تعطل التفاعل الأصلي بشدة بعد الآن.
يسعدني تنفيذ أي من هذه الخيارات إذا كان بإمكان المشرف أن يوجهني إلى الخيار الذي يودون مني تنفيذه ، وبالنسبة للمقترحات B / C ، ساعدني في تحسين التنفيذ الدقيق الذي يميلون إلى قبوله!
marwahaha - لست متأكدا ما هي العملية الخاصة باللحظة. هل لديك رأي في مقترحات الإصلاح الخاصة بي؟ سأكون سعيدًا بتطبيق العلاقات العامة بمجرد أن أحصل على بعض النصائح حول المسار الذي قد يكون مقبولًا للمساهمين / المشرفين؟
التعليق الأكثر فائدة
تحاول الأسطر المشار إليها "تلقائيًا" طلب الوحدات النمطية في وقت التشغيل ، لكن مستندات لغات التحميل تشير إلى أنه إذا كنت تستخدم مدير الحزم مثل JSPM ، فيمكنك تحميل لغات بواسطة
import "moment/locale/fr
. نظرًا لأننا نحتاج إلى مدير الحزم التفاعلية "لمعرفة" أنه يجب استيراد الملف ، فقد جربنا هذا النمط من الاستيراد حتى يتمكن الرابط "Packager" من "رؤية" جميع الملفات التي يجب تجميعها.في النهاية ، بدت خطوط الاستيراد كما يلي:
يتم إدخال التنفيذ الدقيق لـ
require()
في وقت التشغيل الذي تعمل فيه ، وهذا بالتأكيد شيء يتصرف بشكل مختلف بشكل كبير بين إصدارات Debug & Release.في رد الفعل الأصلي ، هناك أيضًا العديد من النكهات المختلفة لحزمة JavaScript في وضع الإصدار ، بما في ذلك ملف الكل في واحد ، والملفات المنفصلة الكل في واحد ، وحزم ذاكرة الوصول العشوائي. كل من هؤلاء يغيرون أيضًا كيفية طلب الأعمال. التصحيح
require()
يتصل بـ Metro Bundler الذي يعمل على خادم http محلي. من المحتمل أن يكون هذا مشابهًا جدًا لخوادم webpack / jspm / تصحيح الأخطاء الأخرى ، ولهذا السبب على الأرجح لا يتسبب طلب الاسم المستعار في حدوث مشكلات في تلك البيئة.