在反应原生中有条件地加载模块

时间:2017-03-27 20:20:09

标签: react-native

我正在努力使一个库在NodeJS和ReactNative上工作。 ReactNative不支持某些本机NodeJS模块,因此我尝试有条件地加载它们。然而,这并不起作用:

if (true) {
    require('a'); // module 'a' works in ReactNative
} else {
    require('b'); // module 'b' doesn't work in ReactNative
}

不幸的是,BOTH要求广告执行广告并加载' b'抛出异常:(

现在我有以下选择:

  1. 创建新版本的库,特定于ReactNative,仅使用在那里工作的模块。
  2. 我听说你可以指定" react-native"在package.json中,这将有助于解决此问题。但是,我无法在任何地方找到文档,是否记录在某处?
  3. 一般来说,您会建议让我的库在Node和ReactNative中工作吗?

    谢谢,

3 个答案:

答案 0 :(得分:4)

我想通了 - 这是使用" react-native" package.json中的财产。在那里,您可以将模块替换为另一个模块,或者为ReactNative禁用它(通过将其值设置为false)。如果将模块替换为另一个模块,则该模块也应添加到依赖项列表中。

在上面的示例中,对于b属性中的模块react-native,您必须将false设置为值。

在package.json中,这可能如下所示:

"dependencies": {
  "c": "^1.0.0"
},
"react-native": {
  "a": "c",
  "b": false
}

如果是ReactNative,上面的代码会将模块a替换为模块c,它将禁止加载模块b(它看起来像一个空对象)。

答案 1 :(得分:1)

您可以尝试以下代码:

if (true)
{
    /* this module will get bundled in react-native app */
    require('a'); // module 'a' works in ReactNative
} else {
    let b = 'b'
    /* this module will not get bundled in react-native app */
    require(b); // module 'b' doesn't work in ReactNative
}
  •   

    需要('一个&#39)

    在执行js包之前,

    包装在包中。在运行时它不需要。 react-native维护所有必需模块的映射 通常用id。

  • 替换模块名称
  •   

    让b =' b'

         

    要求(b)中

    就像一个动态需求,它不是由packager捆绑而来的 在运行时请求。然后它会在其映射中搜索此模块,因为此映射将不具有此模块,因此react-native将引发错误。

注意: 在你的情况下

  

如果(真)

是一个永远不会执行if if-else的else部分的条件,所以react-native永远不会像找不到模块那样抛出错误。

答案 2 :(得分:0)

您可以使用此示例中的代码。

appdirs==1.4.3
backports-abc==0.5
bokeh==0.12.4
certifi==2017.1.23
futures==3.0.5
Jinja2==2.9.5
MarkupSafe==1.0
numpy==1.12.1
packaging==16.8
pyparsing==2.2.0
python-dateutil==2.6.0
PyYAML==3.12
requests==2.13.0
singledispatch==3.4.0.3
six==1.10.0
tornado==4.4.2