Bei der Verwendung von Reactive-native 0.59.10 und der Einstellung des Gebietsschemas für momentJS haben wir nur bei unseren Release-Builds einen superbrutalen Absturz erlebt. Dieser Absturz war für uns mit angeschlossenem Debugger nicht reproduzierbar. Dieser Absturz trat bei uns sowohl auf iOS als auch auf Android auf. try-catch-Anweisungen, die den gesamten Moment umschließen, haben den Absturz nicht abgefangen!
Reproduzieren
["fr-CA", "en-US", "fr", "en"]
moment.locale(localeCandidate)
innerhalb eines Try-Catch-Blocks aufgerufen wird, stürzt die Anwendung in dieser Zeile immer noch ab⁇Dies war ein Crash-on-Launch, aber nur für Release-Builds!! Dies machte es sehr schwierig, nützliche Fehlermeldungen / Protokolle zu extrahieren.
Wir haben die folgenden Fehlermeldungen über unsere Bugsnag-Integration und die Systemkonsolenprotokollierung gesehen
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".
- aber seltsamerweise wurde dieser Fehler nicht rechtzeitig bearbeitet. Möglicherweise ein reaktives natives / bugsnag-Problem.Problemumgehung: Das
Erwartetes Verhalten
require()
herumspielt)Smartphone (bitte füllen Sie die folgenden Informationen aus):
Momentspezifische Umgebung
Führen Sie den folgenden Code in Ihrer Umgebung aus und fügen Sie die Ausgabe ein:
console.log([
new Date().toString(),
new Date().toLocaleString(),
new Date().getTimezoneOffset(),
navigator && navigator.userAgent, // react-native might not have a navigator
moment.version,
]);
Ausgabe:
[
"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"
]
Zusätzlicher Kontext
Die Zeilen, auf die verwiesen wird, versuchen "automatisch", Module zur Laufzeit anzufordern, aber die Dokumentation zum import "moment/locale/fr
laden können. Da wir den reaktiven Paketmanager brauchen, um zu "wissen", dass die Datei importiert werden muss, haben wir diesen Importstil ausprobiert, damit der Packager alle Dateien "sehen" kann, die eingebunden werden müssen.
Letztendlich sahen unsere Importlinien so aus:
import moment from "moment";
import "moment/min/locales"; // Import all moment-locales -- it's just 400kb
import "moment-timezone";
Die genaue Implementierung von require()
wird von der Laufzeit eingefügt, mit der Sie arbeiten, und das ist definitiv etwas, das sich zwischen Debug- und Release-Builds erheblich unterscheidet.
In React-Native gibt es auch verschiedene Varianten des JavaScript-Bündels im Release-Modus, einschließlich All-in-One-Datei, All-in-Separate-Dateien und RAM-Bundles. Jeder von ihnen ändert auch die Funktionsweise von Require. Debug require()
stellt eine Verbindung zum Metro Bundler her , der auf einem lokalen http-Server ausgeführt wird. Dies ist wahrscheinlich den webpack/jspm/other Debug-Servern sehr ähnlich, weshalb das Aliasing require in dieser Umgebung wahrscheinlich keine Probleme verursacht.
A. Löschen Sie aliasedRequire
vollständig, wenn Sie dies nicht mehr tun sollen + Installationsanweisungen dafür anpassen?
B. Reaktiv-native vs. Browser erkennen ( navigator
ist in Reaktiv-Native nicht verfügbar, aber es gibt hier andere Techniken) und verhalten sich je nachdem, in welcher Situation wir uns befinden, unterschiedlich? z.B. if reaktiv-native && DEV, dann drucke eine console.error, wenn das Gebietsschema theoretisch unterstützt wird, aber noch nicht required
(+ Update-Dokumente) war.
C. Verschieben Sie aliasedRequire
von einer lokalen Variablen in dieser Funktion in eine "semi-globale". moment.aliasedRequire
, auf diese Weise könnten wir eine No-Op/Do-Nothing-Funktion einfügen, damit aliasedRequire
nicht mehr dazu führen kann, dass Reactive-native stark abstürzt.
Ich würde mich freuen, jede dieser Optionen zu implementieren, wenn mir ein Betreuer zeigen kann, welche ich implementieren möchte, und für Vorschläge B/C helfen Sie mir, zu verfeinern, welche genaue Implementierung er akzeptieren würde!
@marwahaha – nicht sicher, wie der Prozess für Moment ist. Hätten Sie eine Meinung zu meinen Fixvorschlägen? Ich würde mich freuen, eine PR zu implementieren, sobald ich einen Rat erhalten habe, welcher Weg für Mitwirkende/Betreuer akzeptabel sein könnte?
Hilfreichster Kommentar
Die Zeilen, auf die verwiesen wird, versuchen "automatisch", Module zur Laufzeit anzufordern, aber die Dokumentation zum
import "moment/locale/fr
laden können. Da wir den reaktiven Paketmanager brauchen, um zu "wissen", dass die Datei importiert werden muss, haben wir diesen Importstil ausprobiert, damit der Packager alle Dateien "sehen" kann, die eingebunden werden müssen.Letztendlich sahen unsere Importlinien so aus:
Die genaue Implementierung von
require()
wird von der Laufzeit eingefügt, mit der Sie arbeiten, und das ist definitiv etwas, das sich zwischen Debug- und Release-Builds erheblich unterscheidet.In React-Native gibt es auch verschiedene Varianten des JavaScript-Bündels im Release-Modus, einschließlich All-in-One-Datei, All-in-Separate-Dateien und RAM-Bundles. Jeder von ihnen ändert auch die Funktionsweise von Require. Debug
require()
stellt eine Verbindung zum Metro Bundler her , der auf einem lokalen http-Server ausgeführt wird. Dies ist wahrscheinlich den webpack/jspm/other Debug-Servern sehr ähnlich, weshalb das Aliasing require in dieser Umgebung wahrscheinlich keine Probleme verursacht.