javascript - 是否可以在 React Native 中填充 Node 的 fs.readFileSync() ?

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

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

为此,我使用流行的 Ignite 样板创建了一个 RN 项目,然后使用 ReactNativify方法和垫片 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

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

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

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

所以我认为 future 有四种方法:

  1. 找到一种方法将 react-native-level-fsbrfs 合并为可用的 shim 替代品
  2. 编写一个全新的 fs shim,它具有所有方法
  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 

最佳答案

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

尽管从技术上讲,可以编写一个阻止异步文件操作的 readFileSync 填充程序,但不建议在异步系统中强制同步行为(但您也许可以摆脱它) ,当一次性初始化代码中只有很少的同步方法时)。

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

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

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

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

关于javascript - 是否可以在 React Native 中填充 Node 的 fs.readFileSync() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209191/

相关文章:

javascript - 如何使用 javascript 删除 <a> 之间的文本

Javascript 函数 throttle

javascript - 每次我点击一个项目它被添加到购物车。我需要在 Angular js 中添加新的 `item` 之前删除以前添加的项目

git - 在 Heroku 上创建 Node.js 应用程序时,我应该将文件夹 "node_modules" checkin Git 吗?

android - 找不到符号 Android React Native

javascript - React Native - 不变违规 - 试图获取超出范围索引的框架

javascript - 将 Twitter 分享按钮(带有 JS 和所有内容)嵌入到 Mustache 模板中

node.js - 从客户端到 Node.js 服务器的安全 HTTPS 连接

node.js - 为什么bulkCreate 只在DB 中写入有限数量的记录(Postgres && Sequelize)

ios - 在 Jest 每个测试用例中获取警告和 console.error