Saat menggunakan react-native 0.59.10, dan menyetel lokal untuk momentJS, kami mengalami crash yang sangat brutal hanya untuk build-rilis kami. Kerusakan ini tidak dapat direproduksi untuk kami dengan debugger terpasang. Kerusakan ini terjadi pada kami berdua di iOS & Android. pernyataan try-catch yang membungkus semua penggunaan saat tidak menangkap kerusakan!
Untuk Mereproduksi
["fr-CA", "en-US", "fr", "en"]
moment.locale(localeCandidate)
di dalam blok coba-tangkap, Aplikasi masih macet di baris ini⁇Ini adalah crash-on-launch tetapi hanya untuk rilis build!! Ini membuatnya sangat sulit untuk mengekstrak pesan kesalahan / logging yang berguna.
Kami melihat pesan kesalahan berikut melalui integrasi Bugsnag & Pencatatan Konsol Sistem kami
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".
-- tapi anehnya, kesalahan ini tidak diproses tepat waktu. Mungkin masalah reaksi-asli/bugsnag.Solusi: Mengomentari dua baris itu menghentikan crash!
Perilaku yang diharapkan
require()
dalam Rilis)Smartphone (harap lengkapi informasi berikut):
Lingkungan khusus momen
Silakan jalankan kode berikut di lingkungan Anda dan sertakan hasilnya:
console.log([
new Date().toString(),
new Date().toLocaleString(),
new Date().getTimezoneOffset(),
navigator && navigator.userAgent, // react-native might not have a navigator
moment.version,
]);
Keluaran:
[
"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"
]
konteks tambahan
Baris yang direferensikan "secara otomatis" mencoba meminta modul saat runtime, tetapi dokumen lokal pemuatan menunjukkan bahwa jika Anda menggunakan Manajer Paket seperti JSPM, Anda dapat memuat lokal dengan import "moment/locale/fr
. Karena kita memerlukan manajer paket asli-reaksi untuk "mengetahui" bahwa file harus diimpor, kami mencoba gaya impor itu sehingga Packager dapat "melihat" semua file yang harus digabungkan.
Pada akhirnya, garis impor kami terlihat seperti ini:
import moment from "moment";
import "moment/min/locales"; // Import all moment-locales -- it's just 400kb
import "moment-timezone";
Implementasi yang tepat dari require()
disuntikkan oleh runtime yang Anda kerjakan, dan itu pasti sesuatu yang berperilaku sangat berbeda antara build Debug & Rilis.
Dalam react-native, ada juga beberapa rasa berbeda dari Bundling JavaScript mode-rilis, termasuk all-in-one-file, all-in-separate-files, dan RAM Bundle. Masing-masing juga mengubah cara kerja require. Debug require()
terhubung ke Metro Bundler yang berjalan di server http lokal. Ini mungkin sangat mirip dengan webpack/jspm/server debug lainnya, yang mungkin mengapa aliasing memerlukan tidak menyebabkan masalah di lingkungan itu.
A. Hapus aliasedRequire
seluruhnya jika bukan itu yang seharusnya Anda lakukan lagi + tweak instruksi instalasi tentangnya?
B. Deteksi react-native vs browser ( navigator
tidak tersedia di react-native, tetapi ada teknik lain di sini), dan berperilaku berbeda tergantung pada situasi yang kita hadapi? misalnya. jika reaksi asli && DEV maka cetak console.error jika lokal secara teoritis didukung, tetapi belum required
(+ perbarui dokumen).
C. Pindahkan aliasedRequire
dari variabel lokal dalam fungsi tersebut ke "semi-global". moment.aliasedRequire
, dengan begitu kita bisa menyuntikkan fungsi no-op/do-nothing sehingga aliasedRequire
tidak dapat menyebabkan react-native crash lagi.
Saya akan dengan senang hati menerapkan salah satu opsi ini jika pengelola dapat mengarahkan saya ke mana yang mereka ingin saya terapkan, dan untuk Proposal B/C bantu saya memperbaiki implementasi tepat mana yang cenderung mereka terima!
@marwahaha -- tidak yakin apa proses untuk Momen. Apakah Anda memiliki pendapat tentang proposal perbaikan saya? Saya akan dengan senang hati menerapkan PR setelah saya mendapatkan saran tentang rute mana yang dapat diterima oleh kontributor/pengelola?
Komentar yang paling membantu
Baris yang direferensikan "secara otomatis" mencoba meminta modul saat runtime, tetapi dokumen lokal pemuatan menunjukkan bahwa jika Anda menggunakan Manajer Paket seperti JSPM, Anda dapat memuat lokal dengan
import "moment/locale/fr
. Karena kita memerlukan manajer paket asli-reaksi untuk "mengetahui" bahwa file harus diimpor, kami mencoba gaya impor itu sehingga Packager dapat "melihat" semua file yang harus digabungkan.Pada akhirnya, garis impor kami terlihat seperti ini:
Implementasi yang tepat dari
require()
disuntikkan oleh runtime yang Anda kerjakan, dan itu pasti sesuatu yang berperilaku sangat berbeda antara build Debug & Rilis.Dalam react-native, ada juga beberapa rasa berbeda dari Bundling JavaScript mode-rilis, termasuk all-in-one-file, all-in-separate-files, dan RAM Bundle. Masing-masing juga mengubah cara kerja require. Debug
require()
terhubung ke Metro Bundler yang berjalan di server http lokal. Ini mungkin sangat mirip dengan webpack/jspm/server debug lainnya, yang mungkin mengapa aliasing memerlukan tidak menyebabkan masalah di lingkungan itu.