| Typ | Konzept |
|---|---|
| Quellen | Quelle - Angular Mastery Workshop Quelle - Recherche - Angular heute 2026 |
| Erstellt | 2026-09-26 |
| Aktualisiert | 2026-09-27 |
| Tags | angular, softwarearchitektur, webentwicklung |
Wie eine Angular-Anwendung gegliedert wird: ein kleiner, sofort geladener Kern (Core), wiederverwendbare Bausteine (Shared) und voneinander isolierte, bei Bedarf nachgeladene Features. Die Isolation macht die App schneller beim Start und sicherer bei Änderungen.
Code-Beispiele aus Quelle - Angular Mastery Workshop (Folie 167–169, 344–345), von den Folienbildern abgeschrieben. Routing-Code steht bei Angular-Routing.
Grobaufbau
Laut Quelle - Angular Mastery Workshop (Folie 148, 356–358):
| Teil | Geladen | Inhalt | Regeln |
|---|---|---|---|
| App | sofort | Einstiegspunkt, Routing | sehr klein |
| Core | sofort | Services, HTTP-Interceptors, Grundlayout, Validatoren, früher Zustand wie Anmeldung | nur was von Anfang an gebraucht wird |
| Shared | wird importiert | Komponenten, Pipes, Direktiven | nur deklarierbare Bausteine, keine Services |
| Features | lazy (per Route) | Komponenten, Services und Zustand eines Fachbereichs, eigene Unter-Features | isoliert voneinander |
Regeln für Features
- Ein Feature darf Core nutzen, nie umgekehrt.
- Ein Feature importiert nie etwas aus einem benachbarten Feature. Braucht man etwas in zwei Features, gehört es eine Ebene höher (z.B. nach Core).
- Die Isolation garantiert: Wer ein Feature ändert, kann kein anderes brechen.
- Lazy Loading verkleinert das Startpaket. Beim Aufruf von
/customerslädt der Browser erst danncustomer-module.jsnach (Folie 305–308).
Lazy Loading erzwingt diese Isolation sogar technisch: Ein Service, der nur im lazy geladenen Modul angemeldet ist, existiert in anderen Features gar nicht und führt dort sofort zu einem Fehler. Laut Kurs ist das gut, weil der Fehler früh auftritt (Folie 180, 305, siehe Dependency Injection).
NgModules
Im Kurs ist das NgModule die Einheit der Gliederung (Folie 166–170): Eine Komponente muss in einem Modul deklariert sein, um in Templates benutzt zu werden. Andere Module können sie nur nutzen, wenn sie exportiert wird. Nicht exportierte Komponenten bleiben privat.
Ein Feature-Modul deklariert seine Komponenten, importiert das SharedModule und meldet einen Service an (Folie 167–168, 171):
import { NgModule } from '@angular/core';
@NgModule({
imports: [SharedModule], // dessen exportierte Bausteine nutzen, z.B. <spinner>
declarations: [UserComponent, UserListComponent, UserItemComponent],
providers: [UserService], // bei lazy Loading nur in diesem Modul sichtbar
exports: [],
})
export class UserModule {}
Nach der Deklaration können sich die Komponenten des Moduls gegenseitig verwenden, z.B. <user-list><user-item></user-item></user-list>. Exportiert das SharedModule eine SpinnerComponent, geht auch <spinner></spinner>. Tipp: Die meisten Services besser mit providedIn: 'root' anmelden, damit beim Lazy Loading keine zweite Instanz entsteht (siehe Dependency Injection).
Das SharedModule implementiert, deklariert und exportiert wiederverwendbare Bausteine. Fremde Module wie MatButtonModule importiert und exportiert es weiter, damit alle Module, die SharedModule importieren, sie nutzen können (Folie 169):
import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material';
@NgModule({
imports: [MatButtonModule],
declarations: [SpinnerComponent, LicencePlatePipe, DraggableDirective],
providers: [],
exports: [MatButtonModule, SpinnerComponent, LicencePlatePipe, DraggableDirective]
})
export class SharedModule {}
(Auf der Folie steht in exports ein doppeltes Komma.)
Kurs: Jede Komponente gehört zu einem NgModule. Die App gliedert sich in AppModule, CoreModule, SharedModule und Feature-Module (Quelle - Angular Mastery Workshop, Folie 166–170, 357).
Heute: Seit v19 sind Komponenten, Direktiven und Pipes standardmässig standalone. Sie importieren, was sie brauchen, direkt selbst, ein NgModule ist nicht mehr nötig. Lazy Loading geht direkt über Routen (loadComponent, loadChildren) (Quelle - Recherche - Angular heute 2026).
Die Grundidee des Kurses bleibt gültig: Core, Shared und isolierte Features sind weiterhin die übliche Gliederung, nur als Ordner und Routen statt als NgModules. Werkzeuge wie Nx können die Regel „keine Imports zwischen Features“ per Lint-Regel prüfen (Folie 385).
Umgebungen und Auslieferung
- Einstellungen pro Umgebung liegen in
environment.ts(Standard, Entwicklung) undenvironment.prod.ts(mit--prod). Beide exportieren dasselbe Objekt mit anderen Werten, z.B. den API-Endpunkt (Folie 344):
// environment.ts
export const environment = {
production: false,
API_URL: 'http://localhost:4300/api'
};
// environment.prod.ts
export const environment = {
production: true,
API_URL: 'https://my-org.com//api', // doppelter Schrägstrich so auf der Folie
};
- Das funktioniert, weil die Produktionskonfiguration in
angular.jsondie Datei beim Bauen austauscht. Eigene Konfigurationen lassen sich genauso anlegen und mit--configuration myconfigurationaktivieren (Folie 345):
{
"build": {
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/customer-admin-app/src/environments/environment.ts",
"with": "projects/customer-admin-app/src/environments/environment.prod.ts"
}
]
}
}
}
}
- Problem: So braucht jede Stufe (Test, Abnahme, Produktion) einen eigenen Build. Besser ist „einmal bauen, überall ausliefern“: dasselbe Paket durch alle Stufen schieben und die Konfiguration erst bei der Auslieferung einsetzen. Möglich ist das per REST-Abfrage beim Start, als eingebundene Datei oder durch Überschreiben beim Deployment. Was passt, hängt von der Infrastruktur ab (Folie 348–350).
„Build once, deploy everywhere“ ist ein allgemeines Prinzip aus Continuous Delivery: Was getestet wurde, ist genau das, was in Produktion geht. Das stärkt die Nachvollziehbarkeit, wie sie auch ein IT-Audit verlangt. Mit Containern lässt sich das direkt umsetzen: Die gebaute Angular-App steckt in einem Image (etwa mit nginx), dasselbe Image wandert durch alle Stufen, und die Konfiguration kommt erst beim Start über Umgebungsvariablen oder eine eingehängte Datei hinein (siehe Dockerfile, Docker Compose). Die Zerlegung in isolierte Features ist das Frontend-Gegenstück zu Microservices im Backend.
Verwandt
- Angular – die Bausteine, die hier angeordnet werden
- Dependency Injection – Injektoren pro lazy Modul
- State Management – Zustand pro Feature
- Angular CLI – erzeugt Module und Features, Budgets für die Paketgrösse
- Angular-Routing – Lazy Loading im Code
- Microservices – dieselbe Abwägung zwischen Zerlegen und Zusammenhalten im Backend
- Container – Auslieferung als unveränderliches Image
