Development
Die Entwicklungsprinzipien von Celestia definieren die technischen Standards und Best Practices für die Implementierung von Komponenten und Features. Sie gewährleisten Code-Qualität, Wartbarkeit und konsistente Entwicklungspraktiken.
Entwicklungsphilosophie
Section titled “Entwicklungsphilosophie”Unsere Entwicklung basiert auf folgenden Grundsätzen:
Clean Code
Section titled “Clean Code”Code sollte selbsterklärend sein und verständlich für andere Entwickler. Wir priorisieren Lesbarkeit und Wartbarkeit gegenüber cleveren Lösungen.
Prinzipien:
- Klare, beschreibende Namen für Variablen, Funktionen und Klassen
- Funktionen mit einem klaren Zweck (Single Responsibility)
- Vermeidung von Duplikation (DRY – Don’t Repeat Yourself)
- Kommentare nur wo der Code nicht selbsterklärend ist
Maintainability
Section titled “Maintainability”Code muss langfristig wartbar sein und sich an neue Anforderungen anpassen lassen.
Prinzipien:
- Lose Kopplung zwischen Komponenten
- Klare Abhängigkeiten und Imports
- Modulare Architektur
- Umfassende Dokumentation
Performance
Section titled “Performance”Performance ist ein Feature. Wir optimieren für schnelle Ladezeiten und flüssige Interaktionen.
Prinzipien:
- Lazy Loading wo sinnvoll
- Optimierung von Bundle-Grössen
- Vermeidung unnötiger Re-Renders
- Progressive Enhancement
Code-Standards
Section titled “Code-Standards”Astro-Konventionen
Section titled “Astro-Konventionen”Komponenten-Struktur:
---// 1. Importsimport type { HTMLAttributes } from 'astro/types';import { clsx } from 'clsx';
// 2. Props Interfaceinterface Props extends HTMLAttributes<'button'> { variant?: 'primary' | 'secondary'; size?: 'sm' | 'md' | 'lg'; isLoading?: boolean;}
// 3. Props Destructuring mit Defaultsconst { variant = 'primary', size = 'md', isLoading = false, ...rest} = Astro.props;
// 4. Computed Valuesconst classes = clsx( 'button', `${variant}`, `${size}`, { loading: isLoading });---
<!-- 5. Template --><button class={classes} {...rest}> <slot /></button>Naming Conventions:
- Komponenten: PascalCase (
Button.astro,CardHeader.astro) - Utilities: camelCase (
formatDate.ts,useFocus.ts) - Styles: Tailwind-Utilities oder Component-scoped (kein BEM)
- Konstanten: UPPER_SNAKE_CASE
TypeScript
Section titled “TypeScript”Typisierung:
- Strikte TypeScript-Konfiguration (
strict: true) - Explizite Rückgabetypen für Funktionen
- Interfaces für Objekt-Strukturen
- Type Aliases für komplexe Typen
Beispiel:
// Interface für Propsinterface ButtonProps { variant: ButtonVariant; size: ButtonSize; onClick?: (event: MouseEvent) => void;}
// Type Aliasestype ButtonVariant = "primary" | "secondary" | "tertiary";type ButtonSize = "sm" | "md" | "lg";
// Funktion mit explizitem Rückgabetypfunction calculateButtonWidth(size: ButtonSize): number { const widths: Record<ButtonSize, number> = { sm: 80, md: 120, lg: 160, }; return widths[size];}Verboten:
anyohne triftigen Grund@ts-ignoreohne Kommentar- Implizite
anydurch fehlende Typen
Styling
Section titled “Styling”Tailwind CSS:
- Utility-First Ansatz
- Design Tokens über Tailwind-Konfiguration
- Custom Utilities für Celestia-spezifische Werte
- Keine Arbitrary Values ohne Dokumentation
Best Practices:
<!-- Gut: Design Tokens nutzen --><button class="bg-primary-500 text-white px-4 py-2 rounded-md">
<!-- Vermeiden: Arbitrary Values --><button class="bg-[#007BFF] text-[white] px-[16px] py-[8px] rounded-[4px]">CSS-Organisation:
// Komponenten-spezifische Styles.button { // Base styles
&.primary { // Variant styles }
&.disabled { // State styles }
&.icon { // Child element styles }}Semantisches HTML
Section titled “Semantisches HTML”Prinzipien:
- Korrekte HTML-Elemente für ihre semantische Bedeutung
- Heading-Hierarchie (h1 → h2 → h3)
- Listen (
<ul>,<ol>) für Aufzählungen <button>für Aktionen,<a>für Navigation- Landmark-Elemente (
<main>,<nav>,<aside>)
Beispiel:
<!-- Gut --><nav aria-label="Main"> <ul> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul></nav>
<!-- Schlecht --><div class="nav"> <div class="nav-item" onclick="goHome()">Home</div> <div class="nav-item" onclick="goAbout()">About</div></div>Komponenten-Architektur
Section titled “Komponenten-Architektur”Atomic Design
Section titled “Atomic Design”Wir folgen dem Atomic Design Prinzip:
Atoms:
- Grundeinheiten (Button, Input, Label)
- Keine Abhängigkeiten
- Höchste Wiederverwendbarkeit
Molecules:
- Kombination von Atoms (InputGroup, SearchBar)
- Einfache Funktionalität
- Klar definierter Zweck
Organisms:
- Komplexe Komponenten (Header, Hero, ProductCard)
- Kombination aus Molecules und Atoms
- Domain-spezifisch
Templates:
- Seiten-Layouts ohne konkreten Content
- Wireframe-Struktur
- Responsive-Grids
Pages:
- Konkrete Seiten mit Content
- Komposition aus Organisms
- Finale Produkte
Composition Pattern
Section titled “Composition Pattern”Komponenten sollten komponierbar sein:
<Card> <CardHeader> <CardTitle>Überschrift</CardTitle> <CardAction> <Button variant="ghost">Edit</Button> </CardAction> </CardHeader> <CardContent> <p>Inhalt hier...</p> </CardContent> <CardFooter> <Button variant="secondary">Cancel</Button> <Button>Save</Button> </CardFooter></Card>Props-Design
Section titled “Props-Design”Struktur:
interface Props { // Required children: React.ReactNode;
// Optional mit Default variant?: "primary" | "secondary"; size?: "sm" | "md" | "lg";
// Boolean-Flags isDisabled?: boolean; isLoading?: boolean;
// Events onClick?: (event: MouseEvent) => void; onChange?: (value: string) => void;
// Accessibility ariaLabel?: string; ariaDescribedBy?: string;}Testing-Strategie
Section titled “Testing-Strategie”Unit Tests
Section titled “Unit Tests”Framework: Vitest
Was testen:
- Utility-Funktionen
- Helper-Methoden
- Business Logic
Beispiel:
import { describe, it, expect } from "vitest";import { formatDate } from "./formatDate";
describe("formatDate", () => { it("formats date correctly", () => { const date = new Date("2024-01-15"); expect(formatDate(date)).toBe("15.01.2024"); });
it("handles invalid dates", () => { expect(formatDate(null)).toBe(""); });});Coverage:
- Mindestens 80% Code-Coverage
- 100% für kritische Business-Logic
- Exkludiert: Type-Definitionen, simple Re-exports
Integration Tests
Section titled “Integration Tests”Framework: Playwright
Was testen:
- User Flows
- Komponenten-Interaktionen
- Formular-Validierung
- API-Integration
Beispiel:
import { test, expect } from "@playwright/test";
test("user can complete checkout flow", async ({ page }) => { await page.goto("/checkout");
await page.fill('[name="email"]', "test@example.com"); await page.fill('[name="card"]', "4242424242424242"); await page.click('button[type="submit"]');
await expect(page.locator(".success-message")).toBeVisible();});Visual Regression Tests
Section titled “Visual Regression Tests”Framework: Chromatic / Storybook
Was testen:
- Visuelle Konsistenz
- Komponenten in verschiedenen States
- Responsive Darstellung
- Theme-Variationen (Light/Dark)
Accessibility Tests
Section titled “Accessibility Tests”Tools:
- axe-core (automatisiert)
- Manuelle Tests mit Screenreadern
- Tastatur-Navigation
Integration:
// In Vitest-Configimport { defineConfig } from "vitest/config";
export default defineConfig({ test: { setupFiles: ["./test/setup.ts"], coverage: { provider: "v8", reporter: ["text", "html"], exclude: ["node_modules/", "test/"], }, },});Performance-Optimierung
Section titled “Performance-Optimierung”Ladezeiten
Section titled “Ladezeiten”Bilder:
- WebP-Format bevorzugen
- Responsive Images (
srcset) - Lazy Loading für Below-the-fold
- Bildoptimierung im Build-Prozess
Code:
- Tree Shaking aktivieren
- Dynamic Imports für Heavy Components
- Code-Splitting nach Routes
- Minifizierung und Komprimierung
Assets:
- CDN für statische Assets
- Caching-Strategien
- Service Worker für Offline-Fähigkeit
Bundle-Grösse
Section titled “Bundle-Grösse”Monitoring:
- Bundle-Analyzer im Build-Prozess
- Budgets für Chunk-Grössen
- Warnung bei Überschreitung
Optimierung:
- Externe Dependencies analysieren
- Nur benötigte Features importieren
- Tree-shaking-freundliche Libraries wählen
Rendering
Section titled “Rendering”Astro:
- Static Generation wo möglich
- Server-Side Rendering für dynamische Inhalte
- Client-Side Rendering nur bei Interaktivitäts-Bedarf
React/Komponenten:
memofür pure KomponentenuseMemounduseCallbackgezielt einsetzen- Virtualisierung für lange Listen
Git-Workflow
Section titled “Git-Workflow”Branching-Strategie
Section titled “Branching-Strategie”Main Branches:
main– Produktions-Codedevelop– Entwicklungs-Branch
Feature Branches:
feature/CARD-123-button-componentfeature/CARD-124-responsive-layoutbugfix/CARD-125-fix-navigationCommit-Konventionen
Section titled “Commit-Konventionen”Format:
<type>(<scope>): <subject>
<body>
<footer>Types:
feat– Neues Featurefix– Bugfixdocs– Dokumentationstyle– Formatierung (keine Code-Änderung)refactor– Refactoringtest– Testschore– Wartung
Beispiele:
feat(components): add new Button component with variants
- Implement primary, secondary, and tertiary variants- Add loading and disabled states- Include comprehensive Storybook stories
Fixes #123Pull Request Prozess
Section titled “Pull Request Prozess”Vor dem PR:
- Alle Tests laufen erfolgreich
- Linting ohne Fehler
- TypeScript kompiliert ohne Fehler
- Code formatiert mit Prettier
- Self-Review durchgeführt
Review-Kriterien:
- Code folgt den Konventionen
- Logik ist verständlich
- Tests sind vorhanden und aussagekräftig
- Keine Breaking Changes (oder dokumentiert)
- Performance-Beeinträchtigungen berücksichtigt
README-Dateien
Section titled “README-Dateien”Inhalt:
- Zweck des Moduls/der Komponente
- Installationsanleitung (falls nötig)
- Verwendungsbeispiele
- API-Dokumentation
- Bekannte Einschränkungen
Security-Best-Practices
Section titled “Security-Best-Practices”Input-Validation
Section titled “Input-Validation”- Alle User-Inputs validieren
- Sanitization bei der Darstellung
- Prepared Statements für Datenbank-Queries
- Content Security Policy (CSP)
XSS-Prevention
Section titled “XSS-Prevention”- Kein
innerHTML,set:textoderset_html - Astro escaped automatisch
Dependencies
Section titled “Dependencies”- Regelmässige Updates
bun auditim Build-Prozess- Minimaler Einsatz von Dependencies
- Vertrauenswürdige Libraries bevorzugen
Diese Prinzipien sind das Fundament für technische Qualität in Celestia. Regelmässige Code-Reviews und kontinuierliches Lernen tragen zur Verbesserung bei.