web-dev-qa-db-fra.com

Les appels de fonction ne sont pas pris en charge par les décorateurs lorsque ng build --prod (AOT)

Type de problème: Bug/Question

La description

J'utilise ng-packagr lib pour compiler ma bibliothèque en js. J'ai tout compilé sans aucun problème, mais quand je veux utiliser ma bibliothèque avec ng build --prod (AOT activé), je reçois une erreur:

ERROR in Error during template compile of 'AppModule' Function calls are not supported in decorators but 'BsDropdownModule' was called.

Lorsque je supprime la méthode .forRoot, j'obtiens une erreur:

ERROR in : Unexpected value 'BsDropdownModule in /home/sf/Desktop/Developerka/kompilacja/final/sample-repo/node_modules/angular-library-name/free/dropdown/dropdown.module.d.ts' imported by the module 'AppModule in /home/sf/Desktop/Developerka/kompilacja/final/sample-repo/src/app/app.module.ts'. Please add a @NgModule annotation

Veuillez noter que ng --prod --aot=false ne produit aucune erreur.

Comment reproduire:

Télécharger le référentiel: https://github.com/Bloodcast69/aot-error , tapez npm install ng build --prod.

Comportement attendu

Voulez-vous construire avec AOT sans erreurs (j'ai besoin que cela soit compatible avec Angular Universal) Informations sur la version

ng-packagr: 2.4.1 @angular/*: 5.2.9 TypeScript: 2.5.3 rxjs: 5.5.6 node: 8.1.0 npm/yarn: npm: 5.6.0

Des dossiers:

app.module.ts:

import { BsDropdownModule } from 'angular-library-name';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';



import { AppComponent } from './app.component';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BsDropdownModule.forRoot(),
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

dropdown.module.d.ts:

import { ModuleWithProviders } from '@angular/core';
export declare class BsDropdownModule {
    static forRoot(config?: any): ModuleWithProviders;
}

dropdown.module.ts (avant la compilation en JS):

import { ModuleWithProviders, NgModule } from '@angular/core';
import { ComponentLoaderFactory } from '../utils/component-loader/index';

import { PositioningService } from '../utils/positioning/index';
import { BsDropdownContainerComponent } from './dropdown-container.component';
import { BsDropdownMenuDirective } from './dropdown-menu.directive';
import { BsDropdownToggleDirective } from './dropdown-toggle.directive';
import { BsDropdownConfig } from './dropdown.config';

import { BsDropdownDirective } from './dropdown.directive';
import { BsDropdownState } from './dropdown.state';

@NgModule({
  declarations: [
  BsDropdownMenuDirective,
  BsDropdownToggleDirective,
  BsDropdownContainerComponent,
  BsDropdownDirective
  ],
  exports: [
  BsDropdownMenuDirective,
  BsDropdownToggleDirective,
  BsDropdownDirective
  ],
  entryComponents: [BsDropdownContainerComponent]
})
export class BsDropdownModule {
  public static forRoot(config?: any): ModuleWithProviders {
    return {
      ngModule: BsDropdownModule, providers: [
      ComponentLoaderFactory,
      PositioningService,
      BsDropdownState,
      {provide: BsDropdownConfig, useValue: config ? config : {autoClose: true}}
      ]
    };
  };
}

NOTE J'ai lu tout Internet pour trouver quelque chose qui me serait utile, mais sans succès. J'ai vérifié ces sujets:

FeatureModule échoue pendant une construction AOT lorsque statique pourRoot a des arguments

https://github.com/angular/angular/issues/14707

S'il manque des informations nécessaires, veuillez me le faire savoir et je vous les fournirai.

Merci, Bloodcast69

6
Bloodcast69

C'est un problème avec AOT: la fonction forRoot doit être exécutée à la compilation. Sur une version plus récente de Angular, cela devrait fonctionner tel quel, sinon vous pourriez avoir de la chance en jouant avec tsconfig.app.json. Vérifiez cette question connexe: Angular 6 Les appels de fonction de production ne sont pas pris en charge par les décorateurs, mais "..Module" a été appelé

1
Alessio Stalla

Je suis également confronté au même problème, j'ai pu le réduire à ng-packagr. J'ai extrait mon module de la bibliothèque et testé dans une application distincte. Je n'ai rencontré aucune erreur AOT. Je ne reçois cette erreur que lorsque je range mon module dans une bibliothèque 

J'utilise Angular 6.1.8 et ng-packagr 4.2.0

0
Sameh

Votre méthode forRoot doit renvoyer ModuleWithProviders et être annotée avec @NgModule

  import { ModuleWithProviders, NgModule } from '@angular/core';

    @NgModule({
        declarations: [],
        imports: [],
        providers: [],

      })
    export class BsDropdownModule {
       // constructor(parentModule: BsDropdownModule);
        //  static forRoot(config?: any): ModuleWithProviders;
        static forRoot(config?: any): ModuleWithProviders {

            return {
                ngModule: BsDropdownModule,
                providers: [
                ]
            }
        }
    }

Donc, vous devriez importer dropdown.module dans app.module et non le fichier de déclaration dropdown.module.d.ts

import { BsDropdownModule } from './dropdown.module';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BsDropdownModule.forRoot(),
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

J'ai testé avec AOT build. Pas d'erreur

0
Yerkon