将 nodejs 模块移植到 React Native:Object.prototype 未定义

Posted

技术标签:

【中文标题】将 nodejs 模块移植到 React Native:Object.prototype 未定义【英文标题】:Porting nodejs module to React Native: Object.prototype undefined 【发布时间】:2018-08-30 02:03:26 【问题描述】:

这是我出现问题时的源代码树:

https://github.com/lucaszanella/jscam/tree/cf29b3cc90df7c5c7bb2d27c2205264d52b0715d/src/jscam

我相信npm installnpm startnpm run android 会启动它(注意,onvif 不是从 npm 安装的,而是在 npm post-install 脚本中克隆然后安装,但它会安装在 @ 987654340@ 带有指向它克隆位置的符号链接。我什至尝试将所有内容放在node_modules 中以防万一,但错误仍然存​​在)。也不要介意我在文件夹中的额外 docker 东西

不管怎样,问题是:

我正在尝试在 React Native 中使用 nodejs 模块 onvif,所以我使用 this technique 来使用 babel 翻译 require 方法并安装 browserfy 模块来实现核心 nodejs 模块。我已经用crypto 之类的简单示例进行了测试,并且成功了。但是,当我尝试简单地导入 onvif 模块时,我得到了这个:

Here's device.js line 30,看起来Cam 在这里未定义

当我导入导入 cam.jsonvif.js 时,没有任何反应。但随后它导入了device.js,在再次导入cam.js 时似乎变得未定义

我还尝试了this method,这似乎避免了所有 babel 翻译,但令人惊讶的是问题仍然存在。

更新:

这是新的源代码树:https://github.com/lucaszanella/jscam/tree/98b714219ed25b9d91ea3af275177f66fdb74fa2/src/jscam

我现在正在使用 extraNodeModules,这是官方的做法。你可以在这里看到我的依赖:https://github.com/lucaszanella/jscam/blob/98b714219ed25b9d91ea3af275177f66fdb74fa2/src/jscam/rn-cli.config.js

现在错误发生了变化:

就在这条线上:https://github.com/isaacs/sax-js/blob/d65e3bb5049893aaab4aba05198b9cd335b5a1ad/lib/sax.js#L222

虽然它看起来仍然是相同类型的错误

更新:如果找不到 dgram,请尝试

npm install lucaszanella/react-native-dgram-shim

它已经在 package.json 中,应该安装但有人抱怨它没有

【问题讨论】:

连续第三次赏金? 我使用的是 mac,但东西不只是构建?我在 onvif 中找不到模块 dgram 所以你当前的问题是因为stream。这可以通过更改为stream: require.resolve('stream-browserify') 来解决。但是这样做你会回到你的Cam undefined 错误。这是因为您使用的包onvif 具有循环依赖关系。凸轮 -> 设备 -> 凸轮。 Node 可以处理循环依赖,但你需要修复它才能让它在这里工作 请参阅此主题以获取帮助github.com/browserify/browserify/issues/961 @LucasZanella,在答案中添加了相关信息。很高兴你的问题终于解决了 【参考方案1】:

所以我发现了三个问题

react-native-dgram-shim 需要在node_modules 中复制为dgram stream: require.resolve('stream-browserify') 需要在rn-cli.config.js 中使用。您使用的流模块似乎没有定义Stream 对象和Stream.prototype 访问导致错误 onvif 模块有cam -> device -> cam,这在browserifywebpacknodejs 中处理得很好。但是react-nativemetro 包装器似乎不像循环导入的。这意味着需要修复相同的require.js或需要删除循环依赖

因此,您要么修复 jscam/src/jscam/node_modules/metro/src/lib/polyfills/require.js 处的 require.js polyfill,要么更改文件以通过传递所需对象来删除循环导入,如下所示

require('./device' )  (Cam);

然后像下面这样更新device.js

module.exports = (Cam) => 

并删除

const Cam = require('./cam').Cam

这将确保循环依赖被删除,然后模块应该可以正常加载

PS:顺便说一句,这就是它所说的毅力获胜的原因。这是你的第三次赏金尝试,我上次看到这个问题在我面前出现了 2。但是您的第三次尝试促使我潜入水中,看看我是否可以帮助您。

【讨论】:

谢谢。我不知道如何调试它。我生成了一个大的可读捆绑文件,但它太大了。循环依赖错误不是很容易解释,但我很高兴你能看到。希望我能给更多的积分,但我都花光了

以上是关于将 nodejs 模块移植到 React Native:Object.prototype 未定义的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 12.04 react-native 安装

从 react js / node js 将文件对象上传到天蓝色存储

SyntaxError - node_modules/react-native/Libraries/polyfills/error-guard.js:缺少分号。 (14:4) 在 react nati

反应本机导航:无法解析模块反应导航

React Native 环境

Web内核微信小程序框架实践