2

我想将一些为 NodeJS 编写的包移植到 React Native。

为此,我使用流行的 Ignite 样板创建了一个 RN 项目,然后使用了ReactNativify方法和 shim Node API 对象,主要重用了现有的browserify shims

(有关详细信息和一些有用的提示,请参阅我们可以在 react native 应用程序中使用 nodejs 代码吗?

一些 Node 对象在转译后仍然被空的 mock 替换,例如fs. 完成.babelrc如下:

    ["module-resolver", {
      "alias": {
        "fs": "./config/mock",
        "sodium-universal": "libsodium"

        // etcetera
      }
    }]

fs.readFileSync要移植的包在其传递依赖项中包含许多调用。

例如,在其中一个中hypercore-protocol,有这行代码:

module.exports = protobuf(fs.readFileSync(path.join(__dirname, 'schema.proto'), 'utf-8'))

而且这里有个问题,因为Android和iOS不支持同步文件传输。un-shim-able那条线对我来说似乎是

现在,虽然存在用于fs: react-native-level-fs的垫片,但它没有实现同步文件系统方法。

然后是 browserify 转换,例如brfs' browserify fs.readFileSync() 静态资产内联器'(及其替代方案bfrs-babelbabel-plugin-static-fs)。

但我不知道如何将它们包括在内,它们是否甚至可以在 RN 中工作?

所以我看到了四种方法:

  1. 找到一种方法来合并react-native-level-fsbrfs成为可用的垫片替代品
  2. 编写一个全新的fsshim,包含所有方法
  3. 如果同步 fs 不可能(我认为是),那么以某种方式覆盖调用同步方法的传递依赖树中所有出现的函数,并用本地代码库中的 js 片段替换它们
  4. 如果 3. 出现的次数过多,则决定包不能移植到 React Native

我希望 1. 或者 3. 成为可行的解决方案。任何人都可以建议吗?

为了完整起见。我正处于人生的这个阶段:

System
  platform           linux                                                                                                
  arch               x64                                                                                                  
  cpu                4 cores   Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz                                                        

JavaScript
  node               7.10.1       /usr/local/bin/node  
  npm                4.2.0        /usr/local/bin/npm   
  yarn               0.24.6       /usr/bin/yarn        

React Native
  react-native-cli   2.0.1       
  app rn version     0.45.1      

Ignite
  ignite             2.0.0        /usr/local/bin/ignite  

Android
  java               1.8.0_111    /usr/bin/java  
  android home       -            undefined 
4

1 回答 1

0

不,Node 没有合理的替代方案fs.readFileSync

尽管从技术上讲,可以编写一个readFileSync阻塞异步文件操作的 shim,但在异步系统中强制同步行为是不可取的(但是当一次只有很少的同步方法时,您可能能够摆脱它初始化代码)。

所以选项 3 或 4 是唯一可行的选择。

就我而言,Node 依赖项太多,所以我放弃了 browserifying / shiming 并选择了 4。但是......

这并不意味着一切都必然丢失。我现在正在研究将 NodeJS 编译为 Android 中的本机库

Realm.io 在 Android 胖客户端应用程序(CQRS 样式)中桥接原生 NodeJS + React Native)。

于 2017-08-10T08:48:22.617 回答