我想将一些为 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-babel
和babel-plugin-static-fs
)。
但我不知道如何将它们包括在内,它们是否甚至可以在 RN 中工作?
所以我看到了四种方法:
- 找到一种方法来合并
react-native-level-fs
并brfs
成为可用的垫片替代品 - 编写一个全新的
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