web-dev-qa-db-fra.com

Angular AOT Build: Erreur interne: identifiant inconnu indéfini

Mon projet angulaire actuel a commencé avant qu'angular ne prenne en charge la fonctionnalité AOT. Maintenant, j'essaie de le faire fonctionner. Je reçois l'erreur suivante et je n'ai aucune idée de ce que cela signifie et de l'endroit où je peux commencer à déboguer le problème. Quelqu'un at-il une idée pourquoi cette erreur se produit? 

Les dépendances

"@angular/animations": "^4.4.4",
"@angular/common": "^4.4.4",
"@angular/compiler": "^4.4.4",
"@angular/core": "^4.4.4",
"@angular/forms": "^4.4.4",
"@angular/platform-browser": "^4.4.4",
"@angular/platform-browser-dynamic": "^4.4.4",
"@angular/router": "^4.4.4",
"@ngx-translate/core": "^8.0.0",
"@ngx-translate/http-loader": "^2.0.0",
"core-js": "^2.5.1",
"font-awesome": "^4.7.0",
"primeng": "^4.2.1",
"quill": "^1.3.2",
"rxjs": "^5.4.3",
"zone.js": "^0.8.18"

Erreur

ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$$1 [as importExpr] (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24211:23)
at tokenExpr (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18577:39)
at providerDef (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18480:20)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:77
at Array.map (<anonymous>)
at NgModuleCompiler.compile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:44)
at AotCompiler._compileModule (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24144:32)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:66
at Array.forEach (<anonymous>)
at AotCompiler._compileImplFile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:19)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:87
at Array.map (<anonymous>)
at AotCompiler.emitAllImpls (...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:52)
at CodeGenerator.emit (...\node_modules\@angular\compiler-cli\src\codegen.js:42:46)
at ...\node_modules\@angular\compiler-cli\src\codegen.js:33:61
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
6
im4ever

Cette partie de l'application est à l'origine du problème:

export function windowFactory(): any {
    return window;
}

providers: [{
    provide: Window,
    useFactory: windowFactory
}],

Github: cela échoue avec le compilateur AoT dans Angular CLI, car Window (la fenêtre du navigateur) est une interface

8
im4ever

Juste pour être complet puisque je suis tombé sur la même erreur dans un contexte différent. L'erreur s'est produite dans ma construction lors de l'utilisation d'une classe de service angularjs mise à niveau exportée au format default.

// Service definition
export default class MyService { /* Registered AngularJS service here */ }

// Module
import MyService from './my-service'

// Upgrade 
export function myServiceFactory(i:any) {
  return i.get('myService');
}

// ngUpgraded Angular main module 
@NgModule({
  providers: [
    { provide: MyService, useFactory: myServiceFactory, deps: ['$injector'] }
  ]
})

La suppression de l'exportation par défaut a résolu le problème.

2
oliverguenther

J'ai rencontré la même erreur dans mon projet Angular 6.

lorsque vous exécutez "ng build --prod", lisez attentivement les messages d’avertissement. Dans quel fichier il envoie un message d’avertissement (par exemple: dataservice.ts). 

puis allez dans ce fichier (dataService.ts) et supprimez le @Injectable.

@Injectable({
providedIn: 'root'
})

Ensuite, essayez de reconstruire. Ça marche pour moi.

2
Karthi Coimbatore

Avait la même erreur en essayant de fournir la date d'injection au lieu d'un jeton d'injection.

Alors j'ai fait:

providers: [ { provide: Date, useValue: new Date() } ]

et l'a changé en 

providers: [ { provide: NOW, useValue: new Date() }, ],

NOW est défini dans le service qui en dépend comme ceci

export const NOW = new InjectionToken<Date>('now');

Tous documentés sur le Angular site .

1
Sylvain Girard

Pour moi, j'ai créé une classe de base pour mes services qui utilise HttpClient.

La classe de base et la sous-classe ont été marquées Injectable.

J'ai supprimé Injectable de la classe de base et le problème a été résolu.

0
Jess

En développant la réponse de im4ever, je suis tombé sur le même problème. Il n'est apparu que lors de la compilation lors de la configuration, pas sur ng serve ou simplement ng build, ce qui m'a amené à penser qu'il s'agit d'un problème lié à AOT.

Lors de l'enregistrement d'un service à l'aide d'une méthode d'usine, ce que je faisais pour pouvoir injecter localStorage, la configuration de mon module était la suivante (raccourci par souci de concision).

providers: [
    {provide: StateService, useFactory: provideStateService}
  ],

Ce que j'ai fait pour résoudre le problème a été de supprimer le décorateur @Injectable({}) que je aussi avais dans la définition de classe StateService. Une fois que j'ai enlevé cela, toutes les erreurs ont disparu.

0
dwbartz

Vérifiez vos modèles. Peut-être avez-vous utilisé une variable dans le modèle qui n'est pas définie dans le composant

0
Piyush Patel

Avait ce problème lors de l'exécution de ng build --prod pour Angular 7.1.4, j'ai donc supprimé le @Injectable recommandé par Karthi Coimbatore pour un TooltipService créé afin d'utiliser les positions de Angular Material. 

0
Marvin Dawson