【问题标题】:Build multiple react native bundles from one source从一个来源构建多个 React Native 包
【发布时间】:2017-06-14 15:21:14
【问题描述】:

例如,我有一些具有某些功能的 React Native 应用程序。最完整的应用包含

  1. 新闻
  2. 产品
  3. 用户授权

我想要 2 个版本。像“free”和“pro”版本。

假设 免费 仅包含新闻。 Pro 包含所有功能。我如何构建它并且不包含我不需要的功能的导入。

在我的脑海中,我有类似的东西:

if (ENV === 'free') {
   import Products from 'products';
}

但是您知道,该模块 import 始终应该位于文件顶部,并且不能被 if-else 或其他任何东西包裹。而且看起来一点也不好看。

所以有什么想法吗?或者,它可能已经是这样做的常见做法?

谢谢!

【问题讨论】:

    标签: javascript node.js build react-native ecmascript-6


    【解决方案1】:

    一种方法是您可以注释在第一次构建时不需要的代码段,并从项目主目录运行 bundle 命令。

    通过取消注释所需的代码来制作另一个捆绑包。

    干杯:)

    【讨论】:

    • 是的,如果您编写“Hello world”应用程序,这是一个很好的解决方案。但对于大型项目,我想让它自动化.. 所以想想如何做得更好
    • 这不是问题的真正解决方案,容易出错且不一致
    【解决方案2】:

    考虑到应用程序是使用 Webpack 构建的,通常它就像具有单独的入口点一样简单,这些入口点具有对环境相关模块 (Product) 和公分母(其他所有内容)的导入。

    import 不能有条件,但底层模块化 API 可以。可以是

    let Products;
    
    if (ENV === 'pro') {
       Products = require('products').default;
    } else {
       Products = null;
    }
    

    Webpack 还支持dynamic requiresContextReplacementPlugin 也可以使用):

    Products = require(`./${ENV}/products`).default;
    

    【讨论】:

      【解决方案3】:

      我认为这实际上取决于您的应用程序的结构,一种方法是在组件级别(使用 ifs):

      render() or constructor() {
      ...
      
        if(env === 'PRO') {
          ... unlock all the awesome features
        }
      }
      

      另一种选择是在路由级别执行此操作,它仍然包含 if/else,并且可能需要在组件级别上面临更大的架构挑战(具有相同组件的 2 个版本,一个专业版,一个免费版),但好处是拥有单个文件中的 ENV 依赖项

      <Routes >
        <Route path="/list" component={env=='PRO'? ProList: FreeList}/>
      </Routes>
      

      另一种选择是将您的应用程序重组为两个代码库并根据构建导入它们,类似于特定于平台的代码,类似于:

      文件:

      list.pro.js

      list.free.js

      在 index.js 上:

      import proList from 'list.pro';
      import freeList from 'list.free';
      
      // Global var or store it somewhere
      List = env === 'PRO'? proList : freeList;
      

      我的方法是尽可能分解应用程序,尽量减少ifs 的数量,但将它们包含在组件级别。

      【讨论】:

      • 但是在您的解决方案中 proList 和 freeList 无论如何都会包含在构建包中?
      • 在 Webpack 配置中不做任何更改是的,如果你真的不想要这个,你可以尝试使用 webpack 配置,从不同的文件夹中提取文件以捆绑,这将是第四个选项,但不确定这是否完全可能。
      • 我听说过“摇树”。将尝试以这种方式进行挖掘。谢谢你:)
      猜你喜欢
      • 2018-05-26
      • 2011-03-29
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2016-11-21
      • 2012-08-10
      • 2023-03-05
      相关资源
      最近更新 更多