是否有可能在React Native中填充Node的fs.readFileSync()?

时间:2017-07-20 08:18:38

标签: javascript node.js react-native browserify dat-project

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

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

(有关详细信息和一些有用的提示,请参阅Can we use nodejs code inside react native application?

在转换后,某些Node对象仍然被空模拟替换,例如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对我来说

现在,虽然存在fsreact-native-level-fs的填充程序但它没有实现同步文件系统方法。

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

但我不知道如何包含它们,以及它们是否会在RN中工作?

所以我看到了前进的四种方法:

  1. 找到一种方法将react-native-level-fsbrfs合并为可用的垫片替换
  2. 写一个全新的fs垫片,它有所有方法
  3. 如果同步fs不可能(我认为是),那么以某种方式覆盖调用同步方法的传递依赖树中所有出现的函数,并用本地代码库中的js片段替换它们
  4. 如果出现的次数太多,则确定无法将包移植到React Native
  5. 我希望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 
    

1 个答案:

答案 0 :(得分:0)

没有。 Node' fs.readFileSync没有合理的替代方案。

虽然从技术上讲可以编写一个阻塞异步文件操作的readFileSync填充程序,但是在异步系统中强制执行同步行为是不可取的(但是当你只能使用它时,你可能无法使用它在一次性初始化代码中几乎没有同步方法。)

因此,选项3或4是唯一可行的替代方案。

在我的情况下,有太多的Node依赖项,所以我放弃了浏览器/ shimming并选择了4.但是......

这并不意味着一切都必然丢失。我正在调查Compiling NodeJS as native library in Android

Realm.io to bridge native NodeJS + React Native in Android fat client app (CQRS-style) )。