Firebase HostingにはGoogleアナリティクスとの連携機能がついています。
僕はこれまで連携機能を使ったことがなく、Firebase Hostingを使っていても、タグやnpmでアナリティクスを導入していたのですが、この度初めて使ってみました。連携機能というやつを。
基本的には、上記ドキュメントの通りに進めていけば問題ないのですが、Next.jsと組み合わせて使ったときに、2点引っかかったので、メモを残しておきます。
import firebase from 'firebase'; const config = { apiKey: 'XXXXXXXX', authDomain: 'XXXXXXXX', projectId: 'XXXXXXXX', storageBucket: 'XXXXXXXX', messagingSenderId: 'XXXXXXXX', appId: 'XXXXXXXX', measurementId: 'XXXXXXXX' }; if (!firebase.apps.length) { firebase.initializeApp(config); firebase.analytics(); }
当初はこのようなコードで連携しようとしていました。
❶ TypeError: firebase__WEBPACK_IMPORTED_MODULE_1___default.a.analytics is not a function
デプロイしようとすると、まず、
TypeError: firebase__WEBPACK_IMPORTED_MODULE_1___default.a.analytics is not a function
というエラーが発生しました。文言から察するに、firebase.analyticsが見つからないようです。
import firebase from 'firebase'; import 'firebase/analytics'; // 追加 const config = { apiKey: 'XXXXXXXX', authDomain: 'XXXXXXXX', projectId: 'XXXXXXXX', storageBucket: 'XXXXXXXX', messagingSenderId: 'XXXXXXXX', appId: 'XXXXXXXX', measurementId: 'XXXXXXXX' }; if (!firebase.apps.length) { firebase.initializeApp(config); firebase.analytics(); }
という形で、firebase/analyticsを読み込むことで一見解決しました。
(のちに解決していないことに気づく)
❷ ReferenceError: navigator is not defined
❶を修正してデプロイしようとすると、
> Build error occurred
ReferenceError: navigator is not defined
at Object.areCookiesEnabled (/Users/XXXXXXXX/node_modules/@firebase/util/dist/index.node.cjs.js:656:5)
というエラーが発生しました。
「あれ?navigatorにアクセスしていたかな?」と思ったのですが、よく見ると、firebase内でのエラーです。
Next.jsはサーバサイドでも同じコードが走るので、window.navigatorなど、ブラウザにしかないオブジェクトにアクセスする際は、クライアント側のみで処理が走るようにする必要があります。
なので、
import firebase from 'firebase'; import 'firebase/analytics'; const config = { apiKey: 'XXXXXXXX', authDomain: 'XXXXXXXX', projectId: 'XXXXXXXX', storageBucket: 'XXXXXXXX', messagingSenderId: 'XXXXXXXX', appId: 'XXXXXXXX', measurementId: 'XXXXXXXX' }; if (!firebase.apps.length) { firebase.initializeApp(config); if (process.browser) { // 追加 firebase.analytics(); } }
という感じで、アナリティクスはブラウザのみで実行するように修正することで、デプロイできるようになりました。
❸ ❶の改修を削除する
❷で一件落着なのですが、❶で追加した箇所を消してもデプロイできました。
結局、アナリティクスをサーバサイドで実行しようとしていることが原因だったようです。
なので、最終的には、
import firebase from 'firebase'; const config = { apiKey: 'XXXXXXXX', authDomain: 'XXXXXXXX', projectId: 'XXXXXXXX', storageBucket: 'XXXXXXXX', messagingSenderId: 'XXXXXXXX', appId: 'XXXXXXXX', measurementId: 'XXXXXXXX' }; if (!firebase.apps.length) { firebase.initializeApp(config); if (process.browser) { firebase.analytics(); } }
これでOKでした!