angular - 可选择在 Angular 应用中加载 Firebase 模块
问题描述
我正在开发一个旨在部署在多个 Firebase 项目中的 Angular 应用程序。我正在使用 AngularFire。在提供应用程序时,Firebase 通过保留的托管 URL 提供其软件包。所以我在 index.html 中这样做:
<script src="/__/firebase/7.14.4/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>
<app-root></app-root>
我在 app.module.ts 中这样做:
import { AngularFireModule } from '@angular/fire';
...
imports: [AngularFireModule]
我在 main.ts 中执行此操作,environment.firebase
有效的 Firebase 配置在哪里:
function getConfig(): Observable<any> {
return environment.production ? getConfigFromReservedURL() : of(environment.firebase);
}
function getConfigFromReservedURL(): Observable<any> {
return from(fetch('/__/firebase/init.json').then(response => response.json()));
}
getConfig()
.subscribe(
config => platformBrowserDynamic([{ provide: FIREBASE_OPTIONS, useValue: config }])
.bootstrapModule(AppModule)
.catch(err => console.error(err))
);
ng serve
在这里工作正常。ng build --prod --aot
从/__/firebase/init.json
.
但是当我firebase deploy
到服务器时,我收到警告:“@firebase/app:警告:Firebase 已在全局范围内定义。请确保 Firebase 库只加载一次。”
发生这种情况是因为我曾经npm install firebase
安装 Firebase 依赖项,以便正常导入可以在应用程序中工作,例如import { auth } from 'firebase/app';
. 所以 Typescript 正在将 Firebase SDK 编译到应用程序中。但是 SDK 需要通过 script 元素进行初始化;除此之外,我不希望 SDK 初始化被烘焙到应用程序中。
在为生产构建应用程序时,如何告诉构建过程将 Firebase SDK 视为环境模块,同时保持其作为普通包可用ng serve
?
解决方案
一位同事帮我找出了问题所在。index.html 中不需要此代码:
<script src="/__/firebase/7.14.4/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>
Firebase 的文档说,“除了托管 SDK 本身之外,保留的命名空间还提供了为与托管站点关联的 Firebase 项目初始化 SDK 所需的所有配置。此 Firebase 配置和 SDK 初始化由您可以直接包含的脚本提供...' 它确实提供了所有必要的配置,但如果您通过 NPM 安装了 Firebase 包,则在 Angular 中实际上不需要这些。
推荐阅读
- docker - 无法连接到 localhost 端口 9200
- c++ - 在对向量中查找元素的索引
- pyspark - 在 PySpark mllib 中使用随机森林的非法参数异常
- azure - Azure Pipeline 从变量中获取模板名称
- mysql - 尝试在 Ubuntu Server Apache 上下载主题时,某些虚拟主机上的 WordPress“无法创建目录”问题
- php - 删除前的codeigniter确认框
- flutter - Google API 批量请求返回 411 Length-Required 错误
- conan - 在柯南中检索头文件
- javascript - 循环遍历字典
- python - 画布中的水平滚动框架