React Native - `require()`语句异常处理

React Native - `require()` statement exception handling

本文关键字:语句 异常处理 require Native React      更新时间:2023-09-26

TL;DR:我希望能够在react-nativerequire一个模块,并在模块不存在的情况下自行处理异常(而不是显示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-nativerequire语句实际上是由react-nativeguardedLoadModule实现的,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;