我想将为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
对我来说
现在,虽然存在fs
:react-native-level-fs的填充程序但它没有实现同步文件系统方法。
然后有浏览器化转换,例如brfs
,' browserify fs.readFileSync()静态资产内联' (及其替代bfrs-babel
和babel-plugin-static-fs
)。
但我不知道如何包含它们,以及它们是否会在RN中工作?
所以我看到了前进的四种方法:
react-native-level-fs
和brfs
合并为可用的垫片替换fs
垫片,它有所有方法我希望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
答案 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) )。