可选择在Angular app中加载Firebase模块

可选择在Angular app中加载Firebase模块,angular,typescript,firebase,firebase-hosting,Angular,Typescript,Firebase,Firebase Hosting,我正在开发一个Angular应用程序,该应用程序将部署在多个Firebase项目中。我用的是AngularFire。为应用程序提供服务时,Firebase通过保留的托管URL提供其软件包。所以我在index.html中这样做: <script src="/__/firebase/7.14.4/firebase-app.js"></script> <script src="/__/firebase/init.js"></script> <app

我正在开发一个Angular应用程序,该应用程序将部署在多个Firebase项目中。我用的是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>
<script src="/__/firebase/7.14.4/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>
我在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))
  );
函数getConfig():可观察{
return environment.production?getConfigFromReservedURL():of(environment.firebase);
}
函数getConfigFromReservedURL():可观察{
从(fetch('/\/firebase/init.json')返回,然后(response=>response.json());
}
getConfig()
.订阅(
config=>platformBrowserDynamic([{provide:FIREBASE_OPTIONS,useValue:config}])
.bootstrapModule(AppModule)
.catch(err=>console.error(err))
);
ng serve
在这里很好用
ng build--prod--aot
/\uu/firebase/init.json
正确获取配置

但是当我
firebase部署到服务器时,我得到警告:
“@firebase/app:Warning:firebase已在全局作用域中定义。请确保仅加载一次firebase库。”

这是因为我使用了
npm install firebase
来安装firebase依赖项,以便正常的导入可以在应用程序内工作,例如从“firebase/app”导入{auth}。因此,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>
<app-root></app-root>
<script src="/__/firebase/7.14.4/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>

Firebase表示,“除了托管SDK本身,保留的命名空间还提供了初始化与托管站点关联的Firebase项目SDK所需的所有配置。这个Firebase配置和SDK初始化是由一个脚本提供的,您可以直接包含它…“它确实提供了所有必要的配置,但是如果您已经通过NPM安装了Firebase软件包,您实际上不需要这些配置