将 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 install
、npm start
和npm 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.js
的 onvif.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
,这在browserify
、webpack
和nodejs
中处理得很好。但是react-native
的metro
包装器似乎不像循环导入的。这意味着需要修复相同的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 未定义的主要内容,如果未能解决你的问题,请参考以下文章
从 react js / node js 将文件对象上传到天蓝色存储
SyntaxError - node_modules/react-native/Libraries/polyfills/error-guard.js:缺少分号。 (14:4) 在 react nati