将 React-Native 应用程序分解为可插入模块

Breaking a React-Native application into plugable modules

我想编写一个 React-Native 应用程序。我希望能够在 运行 时间在设备上下载新模块以扩展功能。将有一些核心逻辑知道如何根据某些表单输入(如 dbs)请求新模块。我不想将所有东西都捆绑到一个单一的整体包中,我相信现在内置的打包器会发生这种情况。

这类似于 RequireJS 在浏览器中的工作方式。我需要知道的是:

  1. 如何构建独立模块? react-native bundle 似乎不允许我 select 从哪个根模块开始并且只适用于根项目
  2. 如何在 运行 时请求将新功能注入当前 JavaScript 环境?

React native 从指向一个 JS 包开始。这意味着您至少必须重新启动应用程序才能重新加载 js 包(假设您是从服务器而不是 ios 设备本身读取它)。

如果您确实有办法更新服务器上的 js 文件(通过某种基于用户所做的更新的 Web 服务),那么重新启动应用程序理论上可以重新加载 JS 并为应用程序。

我只能在 JS 中获得与此非常接近的东西。首先,我必须在当前的 react-native 捆绑器中公开更多选项,主要是 url(更改 "main" 模块)和黑名单(避免在第二个捆绑包中捆绑 react-native)包装器的选项(http://github.com/facebook/react-native/blob/master/packager/README.md)。

然后我不得不编写一个自定义获取程序来下载第二个包并使用 eval() 在当前环境中对其进行评估。

一个问题是我必须在第一个包中添加 __d('react-native',[],require('react-native')),我认为它的工作方式类似于 require.js 中的 define()。这会将 'react-native' 导出为一个未损坏的名称,我插入的模块可以通过正常的 require() 语句访问该名称。起初有点令人困惑,但据我所知,React-native 打包器的工作方式有点像 r.js(参见 http://requirejs.org/docs/optimization.html)。