--- marp: true theme: gaia paginate: true backgroundColor: #fff header: "Web Engineering – DHBW Stuttgart" footer: "Michael Czechowski – SoSe 2026" title: Web Engineering --- ![bg cover opacity:0.2](./assets/background.png) # Web Engineering **DHBW Stuttgart** · Informatik / Wirtschaftsinformatik **Sommersemester 2026** --- # Ressourcen zum Selbstlernen - **CODE CRISPIES** — [codecrispi.es](https://codecrispi.es/) - **Online Code-Editor** — [codepen.io](https://codepen.io/pen/) - **MDN** (Mozilla Developer Network) — [developer.mozilla.org/de/](https://developer.mozilla.org/de/) - **Flexbox-Spiel** — [flexboxfroggy.com](https://flexboxfroggy.com/) - **Grid-Spiel** — [cssgridgarden.com](https://cssgridgarden.com/) --- # Herzlich Willkommen! ## 1. Sitzung: 08.05.2026 --- # Über mich ![bg right:33% fit](./assets/logos/collage.png) **Michael Werner Czechowski** - Systems and Platform Engineer - Schwerpunkte: - Web-Technologien, Barriere-Armut, Open Source - Hintergrund: - Philosophie (Uni Stuttgart) - Wirtschaftsinformatik (Leibniz-FH Hannover) - Honorardozent (DHBW Stuttgart, HdM Stuttgart, Leibniz-FH) - Kontakt: michael.czechowski@lehre.dhbw-stuttgart.de --- # Vorlesungsplan
108.05.
Intro · Projektgruppen · Internet 101
215.05.
HTML und CSS (Frameworks)
322.05.
JS (Frameworks) und npm
429.05.
nodeJS: Scripting, Running, Building
505.06.
Express API, CRUD, Middlewares
612.06.
Projektwerkstattbericht
719.06.
Testing (Unit · Integration · E2E)
826.06.
TypeScript
903.07.
Docker · Proxies · DBs
1010.07.
Wrap-up & Projektsupport
1117.07.
Präsentation
--- # Prüfungsleistung – Übersicht Eigenes Projekt: **Web-App** ODER **Backend** (API/CLI). | Punkte | Bereich | |--------|---------| | 30 | Grundanforderungen (Projektgrundlagen + Präsentation) | | 25 | Clean Code Prinzipien | | 25 | Accessibility & UX | | 20 | Technische Umsetzung | | **100** | **Basispunkte** | | +15 | Bonuspunkte (max. 3 Features a 5 P.) | --- # Prüfungsleistung – Grundanforderungen (30 P.) **Projektgrundlagen (15 P.)** - Funktionsfähige Anwendung (8 P.) - Repository mit Versionskontrolle (4 P.) - Projektdokumentation / README (3 P.) **Präsentation (15 P.)** - Elevator Pitch (5 P.) - Technische Präsentation (5 P.) - Projektevolution: wie hat sich das Projekt vs. Ursprungsidee verändert? (5 P.) --- # Prüfungsleistung – Clean Code (25 P.) **Projektstruktur (10 P.)** - Ordnerstruktur (5 P.) - Datei-Organisation (5 P.) **Code-Qualität (10 P.)** - KISS – Keep It Simple, Stupid (3 P.) - Beschreibende Namen (3 P.) - Funktionsverantwortlichkeiten (4 P.) **Kommentierung & Dokumentation (5 P.)** --- # Prüfungsleistung – Accessibility & UX (25 P.) **Web Accessibility (15 P.)** - Semantisches HTML (5 P.) - ARIA Labels & Alt-Texte (5 P.) - Tastaturnavigation (5 P.) **Responsive Design (10 P.)** - Mobile First Approach (5 P.) - Flexbox/Grid Layout (5 P.) --- # Prüfungsleistung – Technische Umsetzung (20 P.) - Plattformunabhängigkeit (5 P.) - Package Management (5 P.) - Build Tools & Optimierung (5 P.) - Live-Demo (5 P.) --- # Prüfungsleistung – Bonuspunkte (max. 15 P.) Mindestens 2 Bereiche wählen, je 5 Punkte: - API Integration - Local Storage / State Management - Progressive Web App Features - Testing - Erweiterte Responsive Features (3+ Breakpoints) - Security Features --- # Prüfungsleistung – Abgabe & Termine - **Code-Upload:** bis 27.07. - **Präsentation:** 17.07. (Gruppen, ~10 Min.) Details: https://git.librete.ch/DHBW/pruefungsleistung --- # Internet-Timeline | Jahr | Meilenstein | |------|-------------| | **1966** | ARPANET-Projekt startet (DARPA) | | **1969** | Erste Verbindung zwischen UCLA und Stanford | | **1974** | TCP/IP-Protokoll entwickelt | | **1989** | Tim Berners-Lee erfindet das WWW (CERN) | | **1993** | Mosaic — erster grafischer Browser | | **1994** | W3C gegründet (HTML, CSS, SVG, WCAG) | | **1995** | ECMAScript / JavaScript wird Standard | | **2008** | V8 JavaScript Engine (Chrome / Node.js) | --- ![bg fit](./assets/arpanet.jpg) --- # Das WWW (1989) **Tim Berners-Lee** am **CERN** (Genf) **Problem:** Wissenschaftler:innen können Forschungsdokumente nicht verlinken — Inkompatible Systeme, kein gemeinsames Format. **Lösung — drei Bausteine:** - **HTML** — Auszeichnungssprache für Dokumente - **HTTP** — Protokoll zur Übertragung - **URL** — eindeutige Adressen **1991:** erste Webseite geht online · 1993 vom CERN gemeinfrei freigegeben. → WWW ≠ Internet. Das WWW ist eine **Anwendung auf** dem Internet. --- ![bg fit](./assets/mosaic.jpg) --- ![bg cover](./assets/img_633d7b91366e0-1025x538-768x403.jpg) --- # Heute: Physische Infrastruktur - **5,5 Milliarden** Menschen online - **> 400 Unterseekabel**, ca. **1,3 Mio. km** Glasfaser - Daten reisen mit **Lichtgeschwindigkeit** - Latenz Frankfurt — New York: ~80 ms → Keine "Cloud" ohne Kabel. Das Internet ist **physische** Infrastruktur — und damit angreifbar. **Geopolitik:** Five-Eyes-Allianz (USA, UK, CA, AU, NZ) zapft Unterseekabel ab (Programm "Tempora", aufgedeckt 2013 durch Snowden). DE ist Teil der Fourteen Eyes. --- ![bg fit](./assets/demos/browser-server-sequence.png) --- # HTTP – Hypertext Transfer Protocol **Request:** ``` GET /products HTTP/1.1 Host: localhost:8080 ``` **Response:** ``` HTTP/1.1 200 OK Content-Type: application/json [{"id": 1, "name": "Produkt A"}, ...] ``` --- # Onboarding ## Tools, Runtimes, Workflows --- # Werkzeuge & Betriebssystem **Erforderliche Werkzeuge:** - **Terminal** (zsh / bash / fish / pwsh) — Kommandozeile - **Editor** (siehe folgende Folie) - **JavaScript-Runtime** (Node.js / Bun / Deno) - **Browser mit DevTools** (Chromium / Firefox / Safari) - **Git** — verteiltes Versionskontrollsystem (Stand der Industrie) **OS-Empfehlung:** | OS | Status | |----|--------| | **macOS** | First-class, viele Tools "just work" | | **Linux** | First-class, beste Server-Parität | | **Windows + WSL2** | Empfohlen — Windows-CLI hat Edge Cases | | **Windows nativ** (PowerShell) | Funktioniert, aber holpriger Pfad | --- # Node.js installieren – macOS Empfohlen: **LTS** (aktuell **Node.js 24** — Stand 2026). Paketmanager: **[Homebrew](https://brew.sh)** ```bash # Homebrew installieren (falls nicht vorhanden) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Node.js LTS installieren brew install node@24 # Version prüfen node --version npm --version ``` Alternative: Installer von [nodejs.org](https://nodejs.org) --- # Node.js installieren – Linux Empfohlen: **LTS** (aktuell **Node.js 24**). **Debian / Ubuntu** ([NodeSource](https://github.com/nodesource/distributions)): ```bash curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt install -y nodejs ``` **Arch / Manjaro:** ```bash sudo pacman -S nodejs npm ``` **Fedora / RHEL:** ```bash sudo dnf module install nodejs:24/common ``` → Distro-Pakete sind oft **veraltet**. Versionsmanager (folgende Folie) bevorzugen. --- # Node.js installieren – Windows Empfohlen: **LTS** (aktuell **Node.js 24**). **Option 1: winget** (empfohlen, Win 10/11): ```powershell winget install OpenJS.NodeJS.LTS ``` **Option 2: Chocolatey** ([chocolatey.org](https://chocolatey.org)): ```powershell choco install nodejs-lts ``` **Option 3: Scoop** ([scoop.sh](https://scoop.sh)): ```powershell scoop install nodejs-lts ``` **Option 4:** Installer von [nodejs.org](https://nodejs.org) → **Empfehlung:** WSL2 + Linux-Workflow nutzen. --- # Direkt-Install: Wenn es eng wird **Typisches Szenario** — drei parallele Projekte mit unterschiedlichen Anforderungen: | Projekt | Stack | Node-Version | |---------|-------|--------------| | Praktikums-API | Express (Legacy) | 18.x (LTS Hydrogen) | | Studienarbeit | Next.js 15 | 22.x (LTS Jod) | | Aktuelles Lab-Projekt | neueste Features | 24.x (Iron, current LTS) | System-Install kennt nur **eine** Node-Version global → Konflikt. --- # Symptome im Alltag - `npm install` bricht mit `engines`-Warning ab - native Module (z. B. `node-sass`) bauen nicht - CI-Pipeline ist grün, lokal rot — oder umgekehrt - erheblicher Zeitverlust beim Debuggen von Versions-Konflikten → Lösung: **Versionsmanager** und Node-Version pro Projekt pinnen. --- # Node-Versionsmanager Verschiedene Projekte brauchen oft verschiedene Node-Versionen. **Lösung:** Versionsmanager. | Tool | Sprache | Geschwindigkeit | Plattform | |------|---------|-----------------|-----------| | **nvm** | Bash | langsam (Shell-Funktion) | macOS, Linux | | **fnm** | Rust | sehr schnell | macOS, Linux, Windows | | **asdf** | Bash | mittel, multi-language | macOS, Linux | | **volta** | Rust | schnell, pinning per `package.json` | alle | ```bash # fnm curl -fsSL https://fnm.vercel.app/install | bash fnm install --lts # aktuell Node 24 fnm use lts-latest # .nvmrc / .node-version automatisch echo "lts/*" > .nvmrc fnm use # liest .nvmrc ``` --- # Alternative Runtimes | Runtime | Erschienen | Engine | USP | |---------|------------|--------|-----| | **Node.js** | 2009 | V8 (C++) | Standard, größtes Ökosystem | | **Deno** | 2020 | V8 (Rust) | Sicherheit, TypeScript nativ, Std-Lib | | **Bun** | 2022 | JavaScriptCore (Zig) | Geschwindigkeit, all-in-one | ```bash # Deno curl -fsSL https://deno.land/install.sh | sh deno run main.ts # Bun curl -fsSL https://bun.sh/install | bash bun install bun run dev ``` → Im Kurs primär **Node.js**. Bun und Deno sind ebenfalls zulässig. --- # Editor - **VS Code** (empfohlen) — kostenlos, große Plugin-Auswahl - **JetBrains WebStorm** — sehr mächtig, kostenpflichtig - kostenlos für Studierende via [JetBrains Education](https://www.jetbrains.com/community/education/#students) - **Vim / Neovim / Emacs** — für CLI-Profis - **Zed** — modern, schnell --- # Browser DevTools Chromium / Firefox / Safari — `F12` oder `Cmd+Opt+I` Chromium = Open-Source-Basis von Chrome, Edge, Brave, Opera, Vivaldi etc. **Wichtigste Panels:** - **Network** — HTTP-Requests, Responses, Timing - **Console** — `console.log`, JS-Errors, REPL - **Elements** — DOM-Inspektor, Live-CSS-Editor - **Sources** — Debugger, Breakpoints, Source-Maps - **Performance** — Profiling, Frame-Rate, FPS - **Application** — LocalStorage, Cookies, Service Workers --- # HTTP-Clients - **Bruno** ([usebruno.com](https://usebruno.com)) — open source, git-friendly - **Hoppscotch** ([hoppscotch.io](https://hoppscotch.io)) — open source, browser-basiert (vormals Postwoman) - **Insomnia** / **Postman** — etabliert, freemium - **curl** / **httpie** — CLI (Command-Line Interface, scriptbar) --- # Git Setup & Workflow **Einmalige Konfiguration:** ```bash git config --global user.name "Vorname Nachname" git config --global user.email "vorname.nachname@example.com" git config --global init.defaultBranch main git config --global pull.rebase true ``` **SSH-Key für GitHub/GitLab:** ```bash ssh-keygen -t ed25519 -C "vorname.nachname@example.com" cat ~/.ssh/id_ed25519.pub # → in GitHub-Settings einfügen ``` **Tägliche Befehle:** ```bash git status # was hat sich geändert? git add # für Commit vormerken git commit -m "feat: ..." # Conventional Commits git push # hochladen git pull --rebase # neueste Änderungen holen ``` --- # Projekt-Skeleton ```bash mkdir mein-projekt && cd mein-projekt git init npm init -y # erzeugt package.json echo "node_modules" > .gitignore echo ".env" >> .gitignore npm install express ``` **`package.json` minimal:** ```json { "name": "mein-projekt", "version": "0.1.0", "type": "module", "scripts": { "start": "node index.js", "dev": "node --watch index.js" } } ``` `.env` für Secrets (nie committen!), `.env.example` mit Dummy-Werten committen. --- # HTML – Hypertext Markup Language --- # Was ist HTML? (1/2) **H**yper**T**ext **M**arkup **L**anguage - **Keine** Programmiersprache - Am ehesten eine Formattierungssprache - Beschreibt **Struktur und Aufbau** einer Webseite ```html

Das ist ein Absatz.

``` Erfunden 1989 von Tim Berners-Lee. Aktuelle Version: HTML5 (seit 2014). --- # Was ist HTML? (2/2) - Mit HTML werden **HTML-Dokumente** beschrieben (`index.html`) - Ein HTML-Dokument beschreibt das **Document Object Model (DOM)** - Der DOM ist eine **hierarchische Baumstruktur** (Eltern, Kinder, Geschwister) - *parent* nodes / elements - *child* nodes / elements - *sibling* nodes / elements In HTML sprechen wir von **Elementen**, in JavaScript eher von **Nodes**. --- # HTML-Anatomie (1/2) ``` Opening tag Closing tag │ │ ▼ ▼

My cat is very grumpy

└────────┬─────────┘ Content └─────────────────────────────────┘ Element ``` - **Opening tag** + **Content** + **Closing tag** = **Element** - Öffnende und schließende Tags müssen identisch sein - Schließendes Tag hat ein `/` nach der Spitzklammer --- # HTML-Anatomie — Attribute ``` Attribute ┌───────────────┐

My cat is very grumpy

``` - **Attribute** stehen im opening tag - Format: `name="wert"` (Anführungszeichen empfohlen) - Mehrere Attribute durch Leerzeichen getrennt: `` --- # HTML-Anatomie (2/2) Wir unterscheiden **umschließende** und **selbst-schließende** Tags. **Umschließend:** - ` ... ` – fett-gedruckter Text (inline) - ` ... ` – Hyperlink - ` ... ` – sichtbarer Teil eines HTML-Dokuments - `
...
` – Aufklapp-Text / Akkordion **Selbst-schließend:** - `` – Bild, Vektorgrafik - `` – Eingabefeld - `` – Metadaten --- # Darstellungsebene und Metadaten ```html METADATEN DARSTELLUNGSEBENE ``` Ein HTML-Dokument besteht aus zwei Teilen: - ` ... ` – Metadaten für Browser, Suchmaschinen, Social Sharing - ` ... ` – darzustellender Inhalt, Text, Formulare --- # HTML Metadaten ```html DHBW Stuttgart ... ``` *Webseiten besuchen nicht nur Menschen, sondern auch Suchmaschinen, Bots, Screen-Reader. Metadaten helfen beim "Verstehen" der Inhalte.* --- # HTML Metadaten – Vertiefung | Tag | Funktion | |-----|----------| | `` | Browser-Tab, Suchergebnis-Titel | | `<meta charset>` | Zeichenkodierung (Umlaute!) | | `<meta viewport>` | Mobile Darstellung | | `<meta description>` | Suchergebnis-Snippet (max 160 Zeichen) | **Open Graph** (Social-Media-Vorschau): ```html <meta property="og:title" content="Artikel-Titel"> <meta property="og:image" content="https://example.com/preview.jpg"> ``` → Wirkt auf Mastodon, LinkedIn, Signal, Slack, MS Teams ... **SEO:** Google nutzt `<title>` + `<meta description>` für Ranking + Snippet. --- # HTML-Tags und Attribute ![bg right:35%](./assets/demos/tag-attribut.png) ```html <body> <p class="wichtig">Das ist ein wichtiger Absatz.</p> <p>Das ist ein gewöhnlicher Absatz.</p> </body> ``` | Teil | Bezeichnung | |------|-------------| | `<p>` | Opening Tag | | `class="wichtig"` | Attribut | | `Das ist ein wichtiger Absatz.` | Inhalt | | `</p>` | Closing Tag | --- # HTML-Tags und Attribute (selbst-schließend) ![bg right:35%](./assets/demos/input-date.png) ```html Geburtsdatum <input type="date" /> ``` | Teil | Bezeichnung | |------|-------------| | `<input ...` | Eingabefeld | | `type="date"` | Attribut *type* mit Wert *date* | | `... />` | Schließendes `/` im (öffnenden) Tag | --- # Vollständiges Grundgerüst ![bg right:35%](./assets/demos/grundgeruest.png) ```html <!DOCTYPE html> <html lang="de"> <head> <title>Portfolio von ...

Hallo Welt!

Das ist mein erster Absatz.

``` --- # Die wichtigsten Tags | Tag | Bedeutung | |-----|-----------| | `

` … `

` | Überschriften (h1 = größte) | | `

` | Absatz (Paragraph) | | ` ... ` | Hyperlink | | `` | Bild | | `