我想将一些为 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-babel
和 babel-plugin-static-fs
)。
但我不知道如何将它们包括在内,以及它们是否会在 RN 中工作?
所以我认为 future 有四种方法:
- 找到一种方法将
react-native-level-fs
和brfs
合并为可用的 shim 替代品 - 编写一个全新的
fs
shim,它具有所有方法 - 如果同步 fs 不可能(我认为是),那么以某种方式覆盖整个传递依赖树中调用同步方法的所有函数,并用本地代码库中的 js 片段替换它们
- 如果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/