Ich habe eine Angular (4.3.2) -Anwendung, auf der ich einen AOT-Build ausführen möchte. Die App wurde mit @angular/cli
Erstellt. Ich habe zwei Komponenten, die mit ng generate
und ein Modul, in dem beide als Deklaration enthalten sind:
import {PrivateComponent} from './private.component/private.component';
NgModule({
imports: [
// other imports
PrivateRoutingModule
],
declarations: [
...some other components,
PrivateComponent,
AppTopBarComponent
]
// other stuff
})
export class PrivateModule {}
Private Komponente wird auch im Routing des Moduls verwendet:
const routes: Routes = [
{path: '', component: PrivateComponent, children: // other components}
]
@NgModule({
imports: [RouterModule.forChild(routes)] // this is the Angular built-in router module
})
export class PrivateRoutingModule {}
Beachten Sie, wie das Routing in einem anderen Modul definiert und in PrivateModule
importiert wurde. Das AppTopBarComponent
wird in der Vorlage PrivateComponent's
Verwendet. Also werden beide verwendet und deklariert. Aber wenn ich "node_modules/.bin/ngc" -p tsconfig-aot.json
Verwende (ich arbeite unter Windows 10), wird folgende Fehlermeldung angezeigt: Cannot determine the module for class PrivateComponent in (path-to-project)/src/app/pages/private/private.component/private.component.ts! Add PrivateComponent to the NgModule to fix it.
Cannot determine the module for class AppTopBarComponent in (path-to-project)/src/app/pages/private/app.topbar.component.ts! Add AppTopBarComponent to the NgModule to fix it.
. Meine tsconfig-aot.json
- Datei ist genau die gleiche wie in der Angular AOT Build Guide .
Ich habe tatsächlich eine Lösung gefunden. Das Problem war, dass PrivateComponent
in eine andere Datei importiert, aber nicht verwendet wurde.
import { PrivateComponent } from '../private/private.component'; // not used anywhere
Anscheinend versucht ngc
alles zu verknüpfen und wird durch einen nicht verwendeten Import verwirrt
Dies passiert mir oft, wenn ich mich beim Ausführen von ng g c
Im falschen Verzeichnis befinde und die falsch generierte Datei nicht sofort lösche.
FEHLER in: Das Modul für die Klasse FeatureBoxGroupComponent kann in S: /.../src/app/common-widgets/feature-widgets/feature-box-group/feature-box-group.component.ts nicht ermittelt werden! Fügen Sie dem NgModule FeatureBoxGroupComponent hinzu, um das Problem zu beheben.
In diesem Beispiel hatte ich FeatureBoxGroupComponent
an zwei Stellen definiert:
src\app\common-widgets\feature-widgets\feature-box-group\feature-box-group.component.ts
src\app\feature-widgets\feature-box-group\feature-box-group.component.ts
Natürlich sagt mir die Fehlermeldung genau, mit welcher Datei es ein Problem gibt - aber es ist einfach, einen Blick darauf zu werfen.
Suchen Sie einfach in Dateien nach dem Komponentennamen, um zu sehen, wo auf ihn verwiesen wird, und stellen Sie sicher, dass er nur einmal definiert ist.
Ich hatte dieses Problem und es verschwand, als ich ng build
Anstatt von ng build --prod
.
Anscheinend hatte ich zwei Module, die ich nicht verwendete, aber nicht aus dem App-Ordner gelöscht hatte. Sie wurden auch nicht im Ordner app.module.ts deklariert.
Gemäß der Dokumentation der --prod
flag veranlasst den Compiler, ebenfalls eine Dead Code-Eliminierung durchzuführen.
Hier ist, wie ich dieses Problem gelöst habe, vorausgesetzt, Sie verwenden VScode
.
ng serve
VScode
an einen anderen Speicherort.ng build
Mit --aot
Ausführen.Wenn Sie möchten, können Sie den gleichen Vorgang ausführen, um Ordner wieder an den ursprünglichen Speicherort zu verschieben.
Nachdem ich das Problem behoben hatte, überprüfte ich auch den git diff
Und erkannte, dass das Problem in der Hülle lag. Ich habe die Ordnernamen in Großbuchstaben geändert, aber das wurde im Pfad nicht aktualisiert.