将nodejs模块移植到React Native:Object.prototype undefined

时间:2018-03-21 04:14:32

标签: javascript node.js react-native npm

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

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

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

中的额外停靠工具

无论如何,问题是:

我尝试在React Native中使用nodejs模块onvif,因此我使用this technique使用babel和已安装的browserfy模块来转换require方法以实现核心nodejs模块。我已经使用crypto之类的简单示例进行了测试,但它确实有用。但是,当我尝试简单地导入onvif模块时,我得到了这个:

enter image description here

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

当我导入导入onvif.js的{​​{1}}时,没有任何反应。但是当它再次导入cam.js

时导入device.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

现在错误已更改: enter image description here

就在这一行:https://github.com/isaacs/sax-js/blob/d65e3bb5049893aaab4aba05198b9cd335b5a1ad/lib/sax.js#L222

虽然

仍然看起来像是同一类型的错误

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

cam.js

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

1 个答案:

答案 0 :(得分:3)

所以我找到了三个问题

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

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

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

并更新device.js,如下所示

module.exports = (Cam) => {

然后删除

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

这将确保删除循环依赖项,然后模块应该加载

PS:在旁注中,这就是为什么它表示坚持不懈的原因。这是你的第三次赏金尝试,我最后一次看到问题在我面前。但是你的第三次尝试激励我潜水,看看我是否能帮助你。