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

时间:2016-08-31 09:12:01

标签: javascript android ios react-native momentjs

TL; DR:我希望能require react-native RedBox中的模块,并在模块不存在的情况下自行处理异常(而不是显示moment.js)。

我在使用en-us的逻辑时,在给定请求的区域设置时,从其预设库(https://github.com/moment/moment/tree/develop/locale)中选择最合适的区域设置。

例如,如果询问en,但未找到,则会回退到chooseLocale,依此类推。此逻辑的代码(loadLocalerequire)可在此处找到:https://github.com/moment/moment/blob/develop/src/lib/locale/locales.js

基本上,它尝试require给定的预设。如果它不存在,它将从react-native语句中获取异常,捕获它并继续下一个选项。

现在,我的问题是尝试将此逻辑用于requirereact-native语句实际上是由guardedLoadModule的{​​{1}}实现的,它处理异常(显示红色屏幕)。在我看来,moment的逻辑并没有受到这种逻辑的影响,因此我希望RedBox不显示。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

React-native' s require与node.js的require不同,因为应用程序在应用程序运行之前已捆绑并打包。因此,无法执行动态require语句。另请参阅this github issue

检查react-native上的以下github问题,因为它包含一个"解决方案"你的问题。 https://github.com/facebook/react-native/issues/1629

换句话说:你必须自己实现回退机制,并明确告诉我们使用哪个语言环境。

switch deviceLocale:
case 'es':
  require('moment/locale/es');
  break;
case 'he':
  require('moment/locale/he');
  break;

答案 1 :(得分:0)

现在可以了 (link to discussion):

<块引用>

可选依赖在 Metro 0.59 中发布

只需用 try catch 包围您的代码:

let module;
try {
  module = require('module');
} catch {
  ...
}