TL;DR:我希望能够在react-native
中require
一个模块,并在模块不存在的情况下自行处理异常(而不是显示RedBox
)。
当给定请求的语言环境时,我使用moment.js
的逻辑从其预设库(https://github.com/moment/moment/tree/develop/locale)中选择最合适的语言环境。
例如,如果要求en-us
,但没有找到,它将返回到en
,以此类推。此逻辑(chooseLocale
, loadLocale
)的代码可以在这里找到:https://github.com/moment/moment/blob/develop/src/lib/locale/locales.js
基本上,它尝试require
给定的预设。如果不存在,则从require
语句获得一个异常,捕获它并继续执行下一个选项。
现在,我的问题是试图使用这个逻辑与react-native
。require
语句实际上是由react-native
的guardedLoadModule
实现的,CC_14处理异常(显示红色屏幕)。在我看来,moment
的逻辑没有受到这个逻辑的伤害,因此我希望RedBox
不显示。
任何想法吗?
现在这是可能的(链接到讨论):
可选依赖项在metro 0.59中发布
用try
:
let module;
try {
module = require('module');
} catch {
...
}
React-native的require
与node.js的require
的不同之处在于,在应用程序运行之前,应用程序被捆绑和打包。因此,不可能执行动态require
语句。参见此github issue。
检查react-native上的以下github问题,因为它包含对您的问题的"解决方案"。https://github.com/facebook/react-native/issues/1629
换句话说:您必须自己实现回退机制,并显式地告诉moment使用哪个区域设置。
switch deviceLocale:
case 'es':
require('moment/locale/es');
break;
case 'he':
require('moment/locale/he');
break;