Лучшие практики Firebase JavaScript SDK

На этой странице представлены советы и рекомендации по устранению неполадок JavaScript, с которыми вы можете столкнуться при использовании Firebase JavaScript SDK.

Возникли другие проблемы или вы не видите свою проблему? Обязательно ознакомьтесь с основными часто задаваемыми вопросами по Firebase, чтобы получить больше ответов по Firebase или по конкретному продукту.

Вы также можете проверить репозиторий Firebase JavaScript SDK на GitHub, чтобы ознакомиться с актуальным списком выявленных проблем и способов их устранения, а также сообщить о своих проблемах там.

Admin SDK для конструкций Node.js несовместим с Firebase JavaScript SDK

Firebase Admin SDK для Node.js и Firebase JavaScript SDK — это отдельные реализации, не использующие общие определения интерфейсов, классов и функций. Экземпляры объектов Admin SDK несовместимы с функциями Firebase JavaScript SDK.

Например, экземпляр FirebaseApp из Admin SDK , переданный в функцию Firebase JavaScript SDK getDatabase вызывает следующую ошибку:

TypeError: Cannot read properties of undefined (reading 'getProvider')
 at _getProvider
 at getDatabase

Это справедливо для всего API Firebase JavaScript SDK, а не только для Realtime Database . Это также справедливо и для использования в обратном направлении. Попытка использовать тип Timestamp из Cloud Firestore JS SDK с Firebase Admin SDK для Node.js приводит к аналогичным ошибкам.

Избегайте использования конфликтующих версий Firebase JavaScript SDK

Несколько конфликтующих версий Firebase JavaScript SDK, настроенных как зависимости в проекте, могут привести к ошибкам выполнения при передаче экземпляров SDK между пакетами SDK. Например, использование библиотеки Data Connect с несоответствующей версией FirebaseApp приводит к следующей ошибке:

Error: Component data-connect has not been registered yet

Эта проблема обычно возникает из-за обновления зависимостей одного, но не всех пакетов Firebase SDK. Такая ситуация часто возникает, когда автоматизированный инструмент обновления зависимостей изменяет подмножество зависимостей Firebase SDK в файле yarn.lock или package-lock.json проекта. Поскольку многие Firebase JavaScript SDK взаимодействуют друг с другом, использование разных версий SDK приводит к несовместимости во время выполнения.

Чтобы исправить эту проблему, удалите каталог node_modules / и yarn.lock (для yarn ) или package-lock.json (для npm ) в вашем проекте и переустановите ваши зависимости.

Если ошибки сохраняются, выполните дальнейшую отладку с помощью команды npm ls . Это позволит зарегистрировать зависимости вашего проекта, что позволит выявить конфликтующие версии модуля firebase .

Например, следующий журнал показывает, что package-using-older-firebase импортирует конфликтующую версию Firebase JavaScript SDK:

$ npm ls firebase --all
your-app@0.0.0
├── firebase@11.2.0
├─┬ @angular/fire@19.0.0
│ ├── firebase@11.2.0 deduped
│ └─┬ rxfire@6.1.0
│   └── firebase@10.14.1 deduped
└─┬ package-using-older-firebase@0.1.0
  └─── firebase@10.14.1

Ошибки также могут возникать из-за смешивания операторов require и import CJS и ESM в вашем приложении. Это создаёт несколько экземпляров Firebase JavaScript SDK, каждый из которых отличается от другого, что нарушает взаимодействие Firebase JavaScript SDK. Увеличьте уровень детализации вашего сборщика для отладки в этом случае. Например, для этой цели можно использовать флаг esbuild analyze .

Убедитесь, что работники сферы услуг объединены

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

Если вы используете модульную версию Firebase JavaScript SDK в своём сервис-воркере, обязательно настройте сборщик приложений на включение исходного файла сервис-воркера. В следующем примере npx используется для упаковки сервис-воркера firebase-sw.js в каталоге src проекта:

npx esbuild ./src/firebase-sw.js --bundle --minify --main-fields=webworker,browser,module,main,default --outfile=public/firebase-sw.js

Активация сервис-воркера, не входящего в состав пакета, завершится ошибкой, если он импортирует модули ES, не поддерживающие сервис-воркеры, или файлы, не входящие в область действия сервис-воркера. Иногда эти сбои происходят незаметно и их сложно отладить.

Дополнительную информацию о включении модульной версии Firebase JavaScript SDK в ваше приложение см. в разделе Использование сборщиков модулей с Firebase .

В качестве альтернативы вы можете исключить необходимость объединения, импортировав compat пакеты Firebase JavaScript SDK из CDN:

// Give the service worker access to Firebase Messaging.
// Replace 10.13.2 with the version of the Firebase JS SDK you're using
// in your app.
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-messaging-compat.js');

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
firebase.initializeApp({
  ...
});

// Retrieve an instance of Firebase Messaging so that it can handle
// background messages.
const messaging = firebase.messaging();

Используйте FirebaseServerApp при работе с рендерингом на стороне сервера

Firebase JavaScript SDK изначально предназначался для работы в браузерных средах. Появление фреймворков серверного рендеринга (SSR) выводит использование SDK в новые среды выполнения. Эти среды выполнения предоставляют подмножество инструментов и API, предоставляемых веб-браузерами.

Например, некоторые Firebase SDK требуют кэширования данных с помощью IndexedDB, API, работающего только в браузере. Для аутентификации Firebase может потребоваться взаимодействие с пользователем в некоторых процессах входа, что невозможно в серверных средах без интерфейса. App Check использует эвристику браузера для проверки пользователя перед созданием токенов App Check .

При работе с SDK в этих новых средах используйте FirebaseServerApp — новый вариант FirebaseApp , который предоставляет средства для предварительной загрузки экземпляра SSR Firebase данными, собранными со стороны клиента.

FirebaseServerApp поддерживает два параметра:

  • Токен идентификатора аутентификации : если он указан, Firebase Auth автоматически выполняет вход в систему ранее аутентифицированного пользователя, потенциально охватывая сеанс через разделение CSR/SSR.
  • Токен проверки приложений : если он указан, токен используется другими пакетами Firebase SDK без необходимости инициализации экземпляра клиента App Check (что не поддерживается вне браузерных сред). Это разблокирует поддержку SSR для продуктов с включённой App Check , таких как Cloud Functions , Data Connect , Cloud Firestore , Realtime Database и Vertex AI.

Пример использования FirebaseServerApp в Next.js см. в разделе Оптимизация разработки приложений SSR с помощью FirebaseServerApp.