Expo(React Native)でFirebaseを利用する際にハマった罠。
問題
一見問題ない初期化に見えるが、iOS/Androidでは起動できない。(webでは動作する)
import Constants from 'expo-constants'
import * as firebase from 'firebase/app'
import 'firebase/auth'
const firebaseConfig = {
apiKey: Constants.manifest.extra.FIREBASE_API_KEY,
authDomain: Constants.manifest.extra.FIREBASE_AUTH_DOMAIN,
databaseURL: Constants.manifest.extra.FIREBASE_DATABASE_URL,
projectId: Constants.manifest.extra.FIREBASE_PROJECT_ID,
storageBucket: Constants.manifest.extra.FIREBASE_STORAGE_BUCKET,
messagingSenderId: Constants.manifest.extra.FIREBASE_MESSAGING_SENDER_ID,
appId: Constants.manifest.extra.FIREBASE_APP_ID,
measurementId: Constants.manifest.extra.FIREBASE_MEASUREMENT_ID,
}
firebase.initializeApp(firebaseConfig)
こんなエラー。
ReferenceError: Can't find variable: IDBIndex
- node_modules/react-native/Libraries/LogBox/LogBox.js:148:8 in registerError
- node_modules/react-native/Libraries/LogBox/LogBox.js:59:8 in errorImpl
- node_modules/react-native/Libraries/LogBox/LogBox.js:33:4 in console.error
- node_modules/expo/build/environment/react-native-logs.fx.js:27:4 in error
- node_modules/react-native/Libraries/Core/ExceptionsManager.js:104:6 in reportException
- node_modules/react-native/Libraries/Core/ExceptionsManager.js:171:19 in handleException
- node_modules/react-native/Libraries/Core/setUpErrorHandling.js:24:6 in handleError
- node_modules/expo-error-recovery/build/ErrorRecovery.fx.js:9:32 in ErrorUtils.setGlobalHandler$argument_0
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:293:29 in invoke
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:154:27 in invoke
- node_modules/regenerator-runtime/runtime.js:164:18 in PromiseImpl.resolve.then$argument_0
- node_modules/react-native/node_modules/promise/setimmediate/core.js:37:13 in tryCallOne
- node_modules/react-native/node_modules/promise/setimmediate/core.js:123:24 in setImmediate$argument_0
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:130:14 in _callTimer
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:181:14 in _callImmediatesPass
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:441:30 in callImmediates
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:387:6 in __callImmediates
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:135:6 in __guard$argument_0
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:364:10 in __guard
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:134:4 in flushedQueue
* [native code]:null in flushedQueue
* [native code]:null in invokeCallbackAndReturnFlushedQueue
原因はこのimport
import * as firebase from 'firebase/app'
import 'firebase/auth'
こうすれば解消される
import * as firebase from 'firebase'
import 'firebase/auth'
原因はよくわからなかったが、
import * as firebase from 'firebase/app'
import 'firebase/storage'
は動作するので、使用するサービス(authentication, storage, database, firebaseなど)によっては発生するらしい。
ただしこのimport方法は非推奨
本番環境のウェブアプリの場合、SDK 全体の読み込みは効率的ではありません。
この方法は開発環境でのみ使用してください。
Firebase を JavaScript プロジェクトに追加する
Webの場合、こんなWarningが出る。
It looks like you're using the development build of the Firebase JS SDK.
When deploying Firebase apps to production, it is advisable to only import
the individual SDK components you intend to use.
For the module builds, these are available in the following manner
(replace <PACKAGE> with the name of a component - i.e. auth, database, etc):
CommonJS Modules:
const firebase = require('firebase/app');
require('firebase/<PACKAGE>');
ES Modules:
import firebase from 'firebase/app';
import 'firebase/<PACKAGE>';
Typescript:
import * as firebase from 'firebase/app';
import 'firebase/<PACKAGE>';