如何在 react-native 中动态加载模块?

Posted

技术标签:

【中文标题】如何在 react-native 中动态加载模块?【英文标题】:How to dynamically load module in react-native? 【发布时间】:2019-02-26 04:45:27 【问题描述】:

我目前正致力于在我的 react-native 应用程序中添加对 Sentry.io 的支持。我使用react-native-sentry 包,并且有一个要求:只有在某些常量设置为真时才应该导入包,例如SHOULD_USE_SENTRY。所有哨兵配置都存储在一个单独的文件中,该文件还公开了 2 个方法:setupSentrycaptureException,它们分别在应用程序的根目录中使用 componentDidMountcomponentDidCatch。如何在根组件中动态加载这些方法,以便当SHOULD_USE_SENTRY 的值为false 时,调用我的方法后不会出现错误?我希望我已经足够清楚地描述了我的问题。

【问题讨论】:

【参考方案1】:

有条件不能导入。

但是您可以通过创建 2 个入口点来做类似的事情: folderA/index.jsfolderB/index.js

folderA/index.js 在那里你导入你的模块 并通过 props 传递给你的应用。

import someModule from 'someModule';
render()
    return(<App module=someModule />);

folderB/index.js 你不导入模块,而是传递 null (或任何其他你想要的值)

render()
    return(<App module=null />);

那么在你的应用组件中你现在可以有一个条件

App.js

if(this.props.module != null)
    this.props.module.someFunction(); 

剩下要做的就是在启动打包程序时选择正确的入口点。根据您的 rn 版本使用以下命令之一:

react-native start --root 文件夹A

react-native start --projectRoot 文件夹A

通过指定 --root--projectRoot 您告诉打包程序在您想要的文件夹中查找 index.js 文件。如果你想为你的项目设置不同的配置,你可以使用这个技巧。

【讨论】:

以上是关于如何在 react-native 中动态加载模块?的主要内容,如果未能解决你的问题,请参考以下文章

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

React-native - iOS - RCTJSCExecutor 的模块名称前缀错误

如何在Elixir或Erlang中在运行时动态创建和加载模块?

如何在模块化的 java 11 应用程序中动态加载 Libreoffice jar,而不从自定义类加载器中获取 ClassCastException

如何实现加载c ++的动态模块(在头文件中)

在 C 中创建模块系统(动态加载)