MakitSystem

Gatsbyのbuild時にWebpackError: ReferenceError: IDBIndex is not definedが発生した場合

WebpackError: ReferenceError: IDBIndex is not defined

firebaseをGatsbyに導入し、buildしたときに下記エラーが発生しました。

Building static HTML failed

See our docs page for more info on this error: https://gatsby.dev/debug-html


  85 | ]);
  86 | 
> 87 | proxyRequestMethods(Index, '_index', IDBIndex, [
     | ^
  88 |   'get',
  89 |   'getKey',
  90 |   'getAll',


  WebpackError: ReferenceError: IDBIndex is not defined
  
  - idb.mjs:87 
    node_modules/idb/lib/idb.mjs:87:1
  
  - index.esm.js:1 
    node_modules/@firebase/installations/dist/index.esm.js:1:1
  
  - index.esm.js:1 
    node_modules/@firebase/analytics/dist/index.esm.js:1:1
  
  - index.esm.js:1 
    node_modules/firebase/analytics/dist/index.esm.js:1:1
  
  - gatsby-ssr.js:1 
    gatsby-ssr.js:1:1

原因は下記のようにfirebaseをimportで参照していたからです。

import firebase from 'firebase/app'
import 'firebase/analytics'

if (typeof window !== 'undefined') {
  firebase.initializeApp({
    apiKey: process.env.GATSBY_FIREBASE_API_KEY,
    authDomain: process.env.GATSBY_FIREBASE_AUTH_DOMAIN,
    databaseURL: process.env.GATSBY_FIREBASE_DATABASE_URL,
    projectId: process.env.GATSBY_FIREBASE_PROJECT_ID,
    storageBucket: process.env.GATSBY_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.GATSBY_FIREBASE_MESSAGING_SENDER_ID,
    appId: process.env.GATSBY_FIREBASE_APP_ID,
    measurementId: process.env.GATSBY_FIREBASE_MEASUREMENT_ID,
  })
  firebase.analytics()
}

importで参照するのではなく、requrieで取り込むようにすることで、エラーが解決されます。

if (typeof window !== 'undefined') {
  const firebase = require('firebase/app')
  require('firebase/analytics')
  firebase.initializeApp({
    apiKey: process.env.GATSBY_FIREBASE_API_KEY,
    authDomain: process.env.GATSBY_FIREBASE_AUTH_DOMAIN,
    databaseURL: process.env.GATSBY_FIREBASE_DATABASE_URL,
    projectId: process.env.GATSBY_FIREBASE_PROJECT_ID,
    storageBucket: process.env.GATSBY_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.GATSBY_FIREBASE_MESSAGING_SENDER_ID,
    appId: process.env.GATSBY_FIREBASE_APP_ID,
    measurementId: process.env.GATSBY_FIREBASE_MEASUREMENT_ID,
  })
  firebase.analytics()
}