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
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é
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
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