Gatsby 3 - `gatsby build` не работает на 'Построение статического HTML для страниц' с ошибкой 'WebpackError: ReferenceError:… не определено' (firebase/app)

При запуске процесс не выполняется на Gatsby v3.

Немного контекста ... Модули firebase включаются в настраиваемый хук (код, показывающий это, приведен ниже).

В gatsby-node есть настраиваемая функция конфигурации веб-пакета, которая использует внешнюю функцию веб-пакета, чтобы отложить загрузку этого модуля на этапе сборки до времени выполнения в браузере пользователя (код, показывающий это, также приведен ниже).

Я обновил все соответствующие пакеты до текущих версий, и у меня нет соответствующих ошибок зависимостей или устаревших пакетов.

Если нужен какой-либо другой контекст, дайте мне знать, более подробная информация и примеры приведены ниже.

gatsby build выдает следующую ошибку:

      success Building HTML renderer - 17.646s
failed Building static HTML for pages - 0.562s

 ERROR #95313 

Building static HTML failed

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


> 1 | module.exports = __WEBPACK_EXTERNAL_MODULE_firebase_app__;
    | ^


  WebpackError: ReferenceError: __WEBPACK_EXTERNAL_MODULE_firebase_app__ is not defined
  
  - app":1 
    /external "firebase/app":1:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - useFirebase.js:7 
    /src/hooks/useFirebase.js:7:18
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - sync-requires.js:7 
    /.cache/_this_is_virtual_fs_path_/$virtual/sync-requires.js:7:49
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - static-entry.js:11 
    /.cache/static-entry.js:11:22
  
  - utils.js:283 
    /[@gatsbyjs]/reach-router/lib/utils.js:283:1
  
  - plugin.js:5 
    /[@savvywombat]/tailwindcss-grid-areas/src/plugin.js:5:1
  
  - utils.js:163 
    /[@gatsbyjs]/reach-router/lib/utils.js:163:1

Я исправил предыдущую ошибку, из-за которой пользовательская внешняя функция webpack вызывалась некорректно после обновления с gatsby 2 до gatsby 3.

Код в gatsby-node, настраивающий внешние элементы веб-пакета, может иметь прямое отношение и в настоящее время выглядит следующим образом:

      exports.onCreateWebpackConfig = ({ stage, actions, getConfig }) => {
  if (stage === 'build-html' || stage === 'develop-html') {
    actions.setWebpackConfig({
      externals: getConfig().externals.concat(({ context, request }, callback) => {
        const regex = /^@?firebase(\/(.+))?/
        if (regex.test(request)) {
          return callback(`umd ${request}`)
        }
        callback()
      })
    })
  }
}

Поскольку это, по-видимому, также имеет прямое отношение к модулю firebase, ниже приведены строки импорта из моего настраиваемого хука useFirebase (ранее он был взят из другого потока переполнения стека или проблемы с github и работал в gatsby 2.

      ...
import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'
import 'firebase/storage'
import 'firebase/messaging'

let app
let messaging

const config = {
...
}

// don't initialize untill you're in the browser - required to work with Gatsby
if (typeof window !== 'undefined') {
  app = app || firebase.initializeApp(config)

Соответствующие версии модулей и разрешения из package.json (думаю, это все):

        "dependencies": {
    "gatsby": "^3.2.1",
    "@firebase/app": "^0.6.18",
    "@firebase/auth": "^0.16.4",
    "@firebase/firestore": "^2.2.2",
    "@firebase/messaging": "^0.7.7",
    "@firebase/storage": "^0.4.6",
    ...
  }
  "resolutions": {
    "graphql": "^15.4.0",
    "graphql-compose": "^7.25.0",
    "webpack": "^5.24.2"
  }

Если у кого-то есть опыт или идеи по этой проблеме, я буду благодарен, спасибо!


Обновление Я попытался заменить onCreateWebpackConfig следующим альтернативным кодом:

      exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
  if (stage === 'build-html') {
    actions.setWebpackConfig({
      module: {
        rules: [
          {
            test: /^@?firebase(\/(.+))?/,
            use: loaders.null()
          }
        ]
      }
    })
  }
}

Что избавляет от старой ошибки и создает следующую ошибку:

      failed Building static HTML for pages - 0.737s

 ERROR #95313 

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 
    /[idb]/lib/idb.mjs:87:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - bootstrap:19 
    /webpack/bootstrap:19:1
  
  - sync-requires.js:7 
    /.cache/_this_is_virtual_fs_path_/$virtual/sync-requires.js:7:49
  
  - bootstrap:19 
    /webpack/bootstrap:19:1

Однако я не уверен, дальше это или нет, чем последняя попытка ...

2 ответа

Пожалуйста, попробуйте эту настройку.

gatsby-node.js:

      exports.onCreateWebpackConfig = ({
  stage,
  actions,
  getConfig
}) => {
  if (stage === 'build-html') {
    actions.setWebpackConfig({
      externals: getConfig().externals.concat(function(context, request, callback) {
        const regex = /^@?firebase(\/(.+))?/;
        // exclude firebase products from being bundled, so they will be loaded using require() at runtime.
        if (regex.test(request)) {
          return callback(null, 'commonjs ' + request); // <- use commonjs!
        }
        callback();
      })
    });
  }
};

Я сослался на следующие комментарии. Дело в том, чтобы использовать commonjs. https://github.com/firebase/firebase-js-sdk/issues/2222#issuecomment-538072948

и я уже ответил на ту же проблему. GatsbyJS с Firebase - WebpackError: ReferenceError: IDBIndex не определен

Удачи.

Похоже, вы пошли дальше с последней попыткой, поскольку реализация Firebase дает сбой не по основным методам, а по самой реализации.

Я столкнулся с той же проблемой несколько недель назад, и я следил за этой веткой GitHub , где предоставленное решение помогло мне в моем случае. В вашем случае, поскольку это индивидуальная реализация, вам может потребоваться немного ее адаптировать.

Идея основана на ленивой загрузке импорта модуля Firebase (динамический импорт). В самом верхнем компоненте, который использует Firebase, импортируйте его следующим образом:

      import('firebase').then(firebase => {
  firebase.initializeApp({ /* firebaseConfig goes here */});
  firebase.firestore().collection('items').doc('yJd1Fs5Ampttq6QKBoYF').get()
    .then(doc => {
      // do stuff with Firestore data
    });
});

Я бы посоветовал следующее чтение: https://kyleshevlin.com/firebase-and-gatsby-to General-at-last , что вы можете дать несколько советов.

Другие вопросы по тегам