【问题标题】:React Native - How do I structure my Mobile Application so I use a single codebase, and can have multiple white labelled apps branched off?React Native - 如何构建我的移动应用程序,以便我使用单个代码库,并且可以有多个白标应用程序分支?
【发布时间】:2021-05-24 13:02:11
【问题描述】:

问题集:我使用 React Native 开发了一个移动应用程序。我现在需要白标/复制并粘贴给不同的客户。每个客户可能具有不同的功能,具体取决于他们的订阅。我想拥有一个具有功能的单一/核心代码库,可以独立构建和修复,而应用程序只是从核心“导入”功能。

如果我在核心中修复一个组件,我应该能够更新我所有的白标应用,但所有应用也可以有自己的皮肤/颜色/功能。我认为这在发展方面保持长期更好。它不是一个简单的皮肤,而且添加/删除的功能都是基于客户的。

这在 Python 中更容易,但我是 React native 的新手 - 寻求有关可用工具和技术的建议。

【问题讨论】:

    标签: reactjs react-native


    【解决方案1】:

    您可以使用 monorepo 方法并从库构建。我建议您通过 nrwl 结帐 nx

    【讨论】:

      【解决方案2】:

      我在开发白标应用时遇到了类似的问题。

      这是我的项目要求:

      • 本地化
      • 主题定制
      • 登录流程

      我通过以下方式实现了白标解决方案:

      假设我们有两个客户,即Dine OutZomato

      • 创建主应用流程,即将在react-native 中的多个应用之间共享的功能。

      • 确保使用标志/值编写代码配置并制作可重用组件。 例如:假设Dine Out 只接受包裹take away 不接受包裹,但Zomato 接受。同样Dine Out 有一个黑色导航栏,但Zomato 喜欢更亮。

      • 使所有应用程序的可配置项的键都相同。


      Native 端的主要白标配置:

      iOS:

      XCode而言,我们可以将ZomatoDine Out视为Xcode中的两个不同的Targets。因此,创建两个Targets 并创建构建配置以设置多个环境,即调试、发布。

      从上图中可以看到TARGETS部分下有两个target。在Build Active Architecture Only 下还有五个Build Configuration

      • 从项目导航器部分创建两个目录并粘贴配置文件和目标资产。

      • 从目标目录中选择所有文件,并仅检查您已从Inspector 部分添加资产和文件的目标。

      安卓:

      Android Studio而言,我们可以将ZomatoDine Out视为两个不同的Flavors。因此,创建两个应用程序Flavors 并创建buildTypes 以设置多个环境,即调试,在应用程序级build.gradle 文件中发布。

      • ./app/src/ 路径创建两个目录,名称与构建风味名称相同,并粘贴配置文件和目标资产。完成此操作后,您将拥有如下图所示的目录结构。

      你可以在here找到安卓的详细配置。


      反应原生:

      如果您已经按照此处的所有步骤操作,那么您就完成了本机端的配置。现在只需要访问react-native中与Target/Flavour相关的值即可。

      React Native 中有一些重要的库可以帮助将值从本地获取到 React Native 环境。

      1. react-native-build-config:在Android 部分的上图中,您将看到buildConfigField 字段APP_ENVIRONMENT 类型为String。你可以通过在 React Native 中使用这个库来访问这个变量值,即BuildConfig.APP_ENVIRONMENT。同样,您可以在 iOS 中添加APP_ENVIRONMENT 变量,如下图所示。

      1. react-native-fs:如果您将配置保存在本机目录的 JSON 文件中,请使用此选项。在上面的配置中,我保留了 PilotConfig.json 文件,可以在 React Native 中使用 fetch('PilotConfig.json) 访问 iOS 和 RNFS.readFileAssets('PilotConfig.json') 对于 Android。

      2. react-native-localize: 你可以使用这个库来加载语言环境。它还提供了一个监听器,以防用户更改设备语言。


      剩下的一切都在JavaScript中的逻辑部分,你如何实现。

      也可以使用build script 配置多个Firebase 应用。

      【讨论】:

        【解决方案3】:

        我将从一个配置文件开始。例如:config.base.js (JSON) 然后覆盖基本配置:config.custom.js

        每个客户都有自己的 config..js 文件 构建时,您可以复制客户配置文件以覆盖 config.custom.js

        如何将配置加载到应用程序中的示例

        let baseConfig = require("./config.base.json");
        const customConfig = require("./config.custom.js");
        
        appConfig = Object.assign(baseConfig, customConfig);
        
        export const FEATURES_ENABLED: [{id: string}: boolean] = appConfig.features;
        

        应用代码将依赖 FEATURES_ENABLED 来呈现

        【讨论】:

          【解决方案4】:

          针对您的情况,我建议您为您的应用核心功能创建自己的 npm 包

          好处:

          • 您可以在包项目中更新/修复您的核心,而不是每个单独的应用项目
          • 如果您想更新现有生产应用程序的核心,只需再次npm install 或更新您的软件包版本
          • 对核心代码进行更好的版本控制
          • 如果您的核心代码没有任何业务逻辑,您可以开源,让其他开发者一起使用和改进(可选)

          因此...

          如果您不想公开您的核心代码,只需将其创建为 私有 npm 包document

          或者如果您可以将其作为公共包开源document

          干杯!

          【讨论】:

            猜你喜欢
            • 2017-12-13
            • 1970-01-01
            • 2017-04-29
            • 1970-01-01
            • 2021-12-04
            • 2021-09-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多