304 lines
7.8 KiB
Markdown
304 lines
7.8 KiB
Markdown
# Meldestelle Web-App
|
|
|
|
Eine moderne Web-Anwendung basierend auf **Compose for Web** (Compose Multiplatform) für das Meldestelle-Projekt.
|
|
|
|
## 📋 Überblick
|
|
|
|
Diese Web-Anwendung implementiert das Frontend für das Meldestelle-System unter Verwendung von Compose for Web. Sie folgt dem Architekturprinzip der maximalen Code-Wiederverwendung durch die Nutzung des `commonMain`-Source-Sets von Kotlin Multiplatform.
|
|
|
|
### Technologie-Stack
|
|
|
|
- **Frontend Framework**: Compose for Web (Compose Multiplatform 1.8.2)
|
|
- **Programmiersprache**: Kotlin/JS
|
|
- **Build-System**: Gradle 8.10
|
|
- **HTTP-Client**: Ktor Client
|
|
- **UI-Komponenten**: Compose Material 3 (aus commonMain)
|
|
- **Bundler**: Webpack (über Kotlin/JS Plugin)
|
|
- **Container**: Nginx (Production)
|
|
|
|
## 🏗️ Architektur
|
|
|
|
```
|
|
client/web-app/
|
|
├── src/
|
|
│ └── jsMain/
|
|
│ ├── kotlin/at/mocode/client/web/
|
|
│ │ └── main.kt # Entry Point
|
|
│ └── resources/
|
|
│ └── index.html # HTML Template
|
|
├── build.gradle.kts # Build Konfiguration
|
|
└── build/ # Build Artefakte
|
|
└── dist/js/productionExecutable/ # Produktionsversion
|
|
```
|
|
|
|
### Design Prinzipien
|
|
|
|
1. **Code-Wiederverwendung**: Maximale Nutzung des `client:common-ui` Moduls
|
|
2. **Compose for Web**: Deklarative UI mit `@Composable` Funktionen
|
|
3. **State Management**: Zustandsverwaltung über ViewModels im `commonMain`
|
|
4. **Plattform-Trennung**: UI-Code in `jsMain`, Logik in `commonMain`
|
|
|
|
## 🚀 Schnellstart
|
|
|
|
### Voraussetzungen
|
|
|
|
- Java 21+
|
|
- Docker und Docker Compose
|
|
- Node.js 18+ (wird automatisch im Container installiert)
|
|
|
|
### Entwicklung starten
|
|
|
|
#### Mit Docker (Empfohlen)
|
|
|
|
```bash
|
|
# Web-App im Entwicklungsmodus starten
|
|
docker compose -f docker-compose.yml -f docker-compose.clients.yml up -d web-app
|
|
|
|
# Anwendung ist verfügbar unter:
|
|
# http://localhost:3000
|
|
```
|
|
|
|
#### Lokale Entwicklung
|
|
|
|
```bash
|
|
# Abhängigkeiten installieren und Entwicklungsserver starten
|
|
./gradlew :client:web-app:jsBrowserDevelopmentRun
|
|
|
|
# Anwendung läuft auf http://localhost:8080
|
|
```
|
|
|
|
### Produktionsbuild
|
|
|
|
```bash
|
|
# Optimierte JavaScript-Bundles erstellen
|
|
./gradlew :client:web-app:jsBrowserDistribution
|
|
|
|
# Artefakte befinden sich in:
|
|
# client/web-app/build/dist/js/productionExecutable/
|
|
```
|
|
|
|
## 🔧 Entwicklung
|
|
|
|
### Projekt-Struktur
|
|
|
|
```kotlin
|
|
// main.kt - Entry Point
|
|
fun main() {
|
|
renderComposable(rootElementId = "root") {
|
|
WebApp()
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
fun WebApp() {
|
|
// Verwendet die gemeinsame App-Komponente aus commonMain
|
|
App()
|
|
}
|
|
```
|
|
|
|
### Hot-Reload
|
|
|
|
Die Entwicklungsumgebung unterstützt Hot-Reload:
|
|
- Änderungen an Kotlin-Code werden automatisch neu kompiliert
|
|
- Browser wird automatisch aktualisiert
|
|
- Schnelle Entwicklungszyklen durch Webpack Dev Server
|
|
|
|
### Build-Konfiguration
|
|
|
|
Die `build.gradle.kts` konfiguriert:
|
|
|
|
```kotlin
|
|
kotlin {
|
|
js(IR) {
|
|
browser {
|
|
commonWebpackConfig {
|
|
outputFileName = "web-app.js"
|
|
// Webpack optimization directory
|
|
configDirectory = project.projectDir.resolve("webpack.config.d")
|
|
}
|
|
webpackTask {
|
|
mainOutputFileName = "web-app.js"
|
|
}
|
|
}
|
|
binaries.executable()
|
|
}
|
|
}
|
|
```
|
|
|
|
### Webpack-Optimierungen
|
|
|
|
Das Projekt verwendet erweiterte Webpack-Optimierungen für bessere Performance:
|
|
|
|
#### Code Splitting
|
|
- **Separate Chunks**: Bundle wird in ~60 kleinere, cacheable Dateien aufgeteilt
|
|
- **Vendor Chunks**: Große Libraries (Kotlin stdlib, Compose runtime, Coroutines) werden separat geladen
|
|
- **Lazy Loading**: Verbessertes Caching durch getrennte Vendor- und App-Code-Chunks
|
|
|
|
#### Bundle-Größenoptimierung
|
|
- **Tree Shaking**: Entfernt ungenutzten Code
|
|
- **Minification**: Aggressive Komprimierung im Produktionsbuild
|
|
- **Scope Hoisting**: Optimiert JavaScript-Execution
|
|
- **Performance Budget**: Warnt bei zu großen Bundles (500KB pro Asset, 800KB Gesamt)
|
|
|
|
#### Generierte Chunks (Beispiel)
|
|
```
|
|
web-app-runtime.js 1.67 KiB (Runtime)
|
|
web-app.js 482 bytes (Main App)
|
|
web-app-compose-runtime-*.js 274 KiB (Compose Framework)
|
|
web-app-kotlin-stdlib.js 165 KiB (Kotlin Standard Library)
|
|
web-app-coroutines.js 119 KiB (Kotlinx Coroutines)
|
|
web-app-vendors-*.js 1.17 MiB (Weitere Dependencies)
|
|
```
|
|
```
|
|
|
|
**Abhängigkeiten:**
|
|
- `compose.web.core` - Compose for Web Framework
|
|
- `compose.runtime` - Compose Runtime
|
|
- `project(":client:common-ui")` - Gemeinsame UI-Komponenten
|
|
- `kotlinx-coroutines-core-js` - Coroutines für Web
|
|
|
|
## 🌐 Deployment
|
|
|
|
### Docker Container
|
|
|
|
Die Anwendung wird als Docker-Container deployed:
|
|
|
|
```dockerfile
|
|
# Multi-stage Build
|
|
FROM gradle:8.10-jdk21 AS builder
|
|
# ... Build Phase
|
|
|
|
FROM nginx:1.25-alpine AS production
|
|
# ... Production Phase
|
|
```
|
|
|
|
**Features:**
|
|
- Multi-stage Build für optimale Image-Größe
|
|
- Nginx als Static File Server
|
|
- Health Checks
|
|
- Security Headers
|
|
- Gzip Kompression
|
|
|
|
### Konfiguration
|
|
|
|
Umgebungsvariablen:
|
|
- `NODE_ENV`: Entwicklungs-/Produktionsmodus
|
|
- `API_BASE_URL`: Backend API URL
|
|
- `APP_TITLE`: Anwendungstitel
|
|
- `APP_VERSION`: Versionsnummer
|
|
|
|
### Health Checks
|
|
|
|
```bash
|
|
# Container Health Check
|
|
curl --fail http://localhost:3000/health
|
|
|
|
# Antwort: {"status":"ok","service":"web-app"}
|
|
```
|
|
|
|
## 🔗 Integration
|
|
|
|
### Backend-Kommunikation
|
|
|
|
Die Web-App kommuniziert mit dem Backend über:
|
|
- **API Gateway**: `http://api-gateway:8081`
|
|
- **REST APIs**: Über Ktor Client
|
|
- **WebSocket**: Für Realtime-Updates (geplant)
|
|
|
|
### Gemeinsame Komponenten
|
|
|
|
Nutzt Komponenten aus `client:common-ui`:
|
|
- **ViewModels**: `PingViewModel` für Backend-Tests
|
|
- **UI-Komponenten**: `App`, `PingScreen`
|
|
- **Services**: `PingService` für HTTP-Aufrufe
|
|
- **Models**: Datenklassen und UI-States
|
|
|
|
### Beispiel Integration
|
|
|
|
```kotlin
|
|
@Composable
|
|
fun WebApp() {
|
|
// Verwendet die gemeinsame App-Komponente
|
|
// Diese enthält Material 3 Komponenten und ViewModels
|
|
App(baseUrl = "http://localhost:8081")
|
|
}
|
|
```
|
|
|
|
## 📊 Build-Artefakte
|
|
|
|
Nach dem Build werden folgende Dateien generiert:
|
|
|
|
```
|
|
build/dist/js/productionExecutable/
|
|
├── web-app.js # Hauptanwendung (minifiziert)
|
|
├── web-app.js.map # Source Maps
|
|
├── 731.js # Code Splitting Chunk
|
|
├── index.html # HTML Template
|
|
├── skiko.wasm # Compose Runtime (WebAssembly)
|
|
└── skiko.js # Compose JavaScript Runtime
|
|
```
|
|
|
|
## 🧪 Testing
|
|
|
|
### Entwicklungstests
|
|
|
|
```bash
|
|
# Backend-Konnektivität testen
|
|
# Öffne http://localhost:3000
|
|
# Klicke "Ping Backend" Button
|
|
```
|
|
|
|
### Build-Validierung
|
|
|
|
```bash
|
|
# Build ohne Ausführung testen
|
|
./gradlew :client:web-app:jsBrowserDevelopmentRun --dry-run
|
|
|
|
# Produktionsbuild testen
|
|
./gradlew :client:web-app:jsBrowserDistribution
|
|
```
|
|
|
|
## 📚 Weiterführende Dokumentation
|
|
|
|
- [Web-App Guideline](../../.junie/guidelines/web-app-guideline.md) - Architektur-Richtlinien
|
|
- [Docker README](../../README-DOCKER.md) - Container-Dokumentation
|
|
- [Compose for Web Docs](https://github.com/JetBrains/compose-multiplatform) - Offizielle Dokumentation
|
|
|
|
## 🔍 Troubleshooting
|
|
|
|
### Häufige Probleme
|
|
|
|
**Problem**: `Cannot connect to backend`
|
|
```bash
|
|
# Lösung: Backend Services starten
|
|
docker-compose -f docker-compose.yml -f docker-compose.services.yml up -d
|
|
```
|
|
|
|
**Problem**: `Module build failed`
|
|
```bash
|
|
# Lösung: Clean Build
|
|
./gradlew :client:web-app:clean :client:web-app:jsBrowserDevelopmentRun
|
|
```
|
|
|
|
**Problem**: `Port 3000 already in use`
|
|
```bash
|
|
# Lösung: Port in docker-compose.clients.yml ändern
|
|
ports:
|
|
- "3001:3000" # Externer Port ändern
|
|
```
|
|
|
|
### Logs und Debugging
|
|
|
|
```bash
|
|
# Container Logs anzeigen
|
|
docker logs meldestelle-web-app
|
|
|
|
# Build Logs mit Details
|
|
./gradlew :client:web-app:jsBrowserDevelopmentRun --info --stacktrace
|
|
```
|
|
|
|
---
|
|
|
|
**Letzte Aktualisierung**: 2025-09-10
|
|
**Version**: 1.0.0
|