使用 React Native 运行 Firebase 3.0 时出错
Posted
技术标签:
【中文标题】使用 React Native 运行 Firebase 3.0 时出错【英文标题】:Error when running Firebase 3.0 with React Native 【发布时间】:2016-09-15 15:46:19 【问题描述】:刚刚使用 react-native 加载了 firebase 3.0 并收到错误
[致命][tid:com.facebook.react.RCTExceptionsManagerQueue] 未处理 JS 异常:找不到变量:文档
是否支持 react-native?
反应原生代码:
var firebase = require('firebase')
// Initialize Firebase
var config =
apiKey: '<apiKey>',
authDomain: '<app>.firebaseapp.com',
databaseURL: 'https://<app>.firebaseio.com',
storageBucket: 'firebase-<app>.appspot.com'
;
firebase.config(config)
【问题讨论】:
您能展示实例化 Firebase 实例的代码吗?谢谢。 3.0.0 与开箱即用的 React Native 不兼容,我们正在对此进行调查。 3.0.2 也不兼容 React native(0.26.0)?我遇到了同样的错误。 3.0.3 仍然不兼容 firebase javascript SDK 3.1.0 的新版本具有 React Native 兼容性。 firebase.google.com/support/release-notes/js#3.1.0 【参考方案1】:虽然 Firebase JS SDK 现在可以在 react-native 上工作,但它主要是为 web 构建的,通常不是 react-native 的最佳解决方案。
Firebase Web SDK 完全在 react native 的 JS thread 上运行,因此会影响您的应用程序帧速率(该链接很好地解释了这一点)。
在我的测试中,原生 firebase SDK 的速度大约比使用 Web SDK 快 2-3 倍。
但除了潜在的性能影响之外,还有很多功能您将无法在 android/ios 设备上与 Web SDK 一起使用。例如:
通知/FCM 离线功能 存储上传/下载 Firebase 崩溃报告 分析 使用社交身份验证提供程序最好的方法是使用原生 android/ios firebase sdk 运行,并在它们和您的 js 代码之间架起一座桥梁(即原生模块设置)。
谢天谢地,您不必自己实现,已经有模块可以为您执行此操作:
react-native-firebase 例如镜像 web sdk 的 api js 端,但使用本机 android & ios firebase sdk 在本机端执行。它与您可能已经实现的任何现有 firebase js 逻辑完全兼容,旨在替代 web sdk。
(免责声明:我是 react-native-firebase 的作者)
【讨论】:
【参考方案2】:要将最新版本的 Firebase 与 ReactNative 结合使用,您可以使用 Firebase Bridge。
我有一个演示应用程序here。
【讨论】:
【参考方案3】:Firebase JS SDK 3.1 just got released 现在与 React Native 兼容!
见release notes。
【讨论】:
时机很好。谢谢。 如果有人想要更多指导,这里是 tutorial 用于 Firebase 电子邮件/密码身份验证,我为 Android 提供了 react native(同样的方法可以应用于 iOS)。【参考方案4】:RN 中不支持 Firebase 3.x(目前...)。
问题
我认为这个问题与 auth
模块对浏览器的 window
变量的依赖有关。
会得到官方支持吗?
根据 Firebase 团队的以下讨论主题,他们目前正在致力于 3.x 支持。但是,没有设定发布时间框架。
Google Groups Discussion.
解决方法
选项 1(使用 FB 2.x)
来自雅各布·温格:
如果 React Native 支持是你的障碍,请继续使用 2.x.x SDK,直到我们解决此问题。 2.x.x SDK 将 继续工作,即使在您迁移到新控制台之后..`
选项 2(使用 FB 3.x)
来自雅各布·温格:
如果您不需要身份验证,作为一种“解决方法”(我知道,不太可能,但仍然 值得一提),你应该能够做到以下几点:
var app = require('firebase/app'); var database = require('firebase/database');
【讨论】:
【参考方案5】:通过将以下内容放入 .js 文件并将其导入 index.ios.js 的顶部,我能够让 Firebase 3.0.2 加载到 React Native 中:
global.location =
href: ''
;
global.screen =
;
global.document =
getElementsByTagName: function()
;
global.parent = global;
可能还有其他问题 - 我没有进一步探索,但它可能会让 Firebase 3 为您工作。
【讨论】:
我在 3.0.3 和 3.0.2 上都尝试了您的修复,但我仍然收到“不支持浏览器”错误屏幕。如果它对您有用,您可以发布更多代码吗?谢谢【参考方案6】:最新版本的 firebase 使用 Web 应用程序中使用的文档变量,而 RCTWebSocket 或 RCTView 的工作方式不同。 (我不是 100% 确定所有细节)。无论如何,您只需安装旧版本的 firebase 即可。假设您已安装 npm,请按照这些说明进行操作。
-
从您的 react-native 项目中卸载 Firebase npm uninstall firebase --save
安装 2.4.2 版的 firebase npm install firebase@2.4.2 --save
Firebase 快乐!
【讨论】:
要提一提的是,当在新控制台中创建 Firebase 帐户时,用于 auth 的 2.4 npm 包不起作用。然后你得到以下错误:Projects created at console.firebase.google.com must use the new Firebase Authentication SDKs available from firebase.google.com/docs/auth/
如果我们使用其他仅在 Firebase 3 中可用的服务(如存储)会怎样?以上是关于使用 React Native 运行 Firebase 3.0 时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 wix@react-native-navigation 运行 react-native 应用程序时出错
使用 react-native run-android 运行时出现 React-Native 错误
使用 React Native 运行 Firebase 3.0 时出错
react native - 我是否应该用 react-native start 命令来运行服务器,以便用户可以使用应用程序?
使用 Jest 运行 testing-library/react-native 时 RNEncryptedStorage 未定义