Angular: условно импортирующий модуль не работает с AoT - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь условно импортировать модуль, основываясь на том, указан ли в моем файле среды ключ firebase API. Когда нет ключа API, я не хочу загружать модули Firebase. Когда значения заданы в файле среды, я хочу загрузить как AngularFireAuthModule, так и AngularFireModule.initializeApp(firebaseConfig).

. Вот как я это делаю в Angular 7:

import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';

import { environment } from '../../../environments/environment';

import { AlwaysLoggedInProvider } from './identity/providers/always-logged-in-provider';
import { AuthHttpInterceptor } from './interceptors/auth-http-interceptor';
import { FirebaseProvider } from './identity/providers/firebase-provider';
import { IdentityProviderToken } from './identity/identity-provider';

const firebaseConfig = environment.firebase;
export const identityProvider = isFirebaseConfigured() ? FirebaseProvider : AlwaysLoggedInProvider;

export function identityProviderModules() {
  if (isFirebaseConfigured) {
    return [AngularFireModule.initializeApp(firebaseConfig), AngularFireAuthModule];
  } else {
    return [];
  }
}

export function isFirebaseConfigured() {
  return firebaseConfig && 'apiKey' in firebaseConfig && firebaseConfig.apiKey !== '';
}

@NgModule({
  imports: [...identityProviderModules()],
  providers: [
    { provide: IdentityProviderToken, useClass: identityProvider },
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AuthHttpInterceptor,
      multi: true,
    },
  ],
})
export class AuthenticationModule { }

Теперь, после обновления до Angular 9, кажется, что все работает, но при компиляции я получаю следующие ошибки:

ERROR in src/app/services/authentication/authentication.module.ts:30:12 - error NG1010: Value at position 0 in the NgModule.imports of AuthenticationModule is not a reference: [object Object]

30   imports: [...identityProviderModules()],
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/app/services/authentication/authentication.module.ts:40:14 - error NG6002: Appears in the NgModule.imports of LoginModule, but could not be resolved to an NgModule class.

Is it missing an @NgModule annotation?

40 export class AuthenticationModule { }
                ~~~~~~~~~~~~~~~~~~~~
src/app/login/login.module.ts:26:14 - error NG6002: Appears in the NgModule.imports of AppModule, but itself has errors

26 export class LoginModule {}

Я посмотрел вокруг и заметил, что это вызвано AoT компиляция (которую я хочу сохранить) и потому, что у меня есть условие внутри identityProviderModules(). Я нашел несколько решений для провайдеров, но так как я работаю с импортом, я не думаю, что он будет мне полезен, если не будет способа преобразовать эти модули в провайдеров.

Что было бы правильным способ условно импортировать модули на основе значения в файле среды? Как я могу заставить AoT скомпилировать это?

...